From 7d1aefc9116cb1ef63734deb4929be763ebdecdb Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Thu, 2 Oct 2025 10:20:38 +0300 Subject: [PATCH 01/51] refactor: Create separate package for documentation --- .../documentation/docs/pages/Guidelines.md | 60 ++++++++ packages/documentation/docs/pages/index.md | 144 ++++++++++++++++++ .../documentation/docs/pages/indexJsdoc.md | 7 + .../docs/public/TripPinClassDiagram.jpg | Bin 0 -> 45518 bytes .../public/UI5-VitePress-fire-and-water.jpg | Bin 0 -> 167975 bytes .../documentation/docs/public/favicon.ico | Bin 0 -> 15086 bytes .../docs/public/icons/logo/Autoprefixer.svg | 1 + .../docs/public/icons/logo/PlantUML.svg | 41 +++++ .../docs/public/icons/logo/PostCSS.svg | 1 + .../docs/public/icons/logo/Rollup.svg | 3 + .../docs/public/icons/logo/TailwindCSS.svg | 4 + .../docs/public/icons/logo/TypeScript-wm.svg | 1 + .../docs/public/icons/logo/TypeScript.svg | 1 + .../docs/public/icons/logo/UI5.svg | 9 ++ .../docs/public/icons/logo/VitePress.svg | 1 + .../docs/public/icons/logo/Vitejs.svg | 15 ++ .../docs/public/icons/logo/Vuejs.svg | 1 + .../docs/public/icons/logo/Web-Components.svg | 1 + .../public/icons/logo/cssnano-wm-vertical.svg | 1 + .../docs/public/icons/logo/cssnano-wm.svg | 1 + .../docs/public/icons/logo/cssnano.svg | 8 + .../docs/public/icons/logo/markdown.svg | 1 + .../public/icons/logo/powering-sap-btp.svg | 1 + .../documentation/docs/public/icons/ui5/B.svg | 1 + .../docs/public/icons/ui5/B_OpenUI5_H.svg | 1 + .../docs/public/icons/ui5/B_OpenUI5_V.svg | 1 + .../docs/public/icons/ui5/B_UI5_H.svg | 1 + .../docs/public/icons/ui5/B_UI5_V.svg | 1 + .../documentation/docs/public/icons/ui5/O.svg | 1 + .../docs/public/icons/ui5/O_OpenUI5_H.svg | 1 + .../docs/public/icons/ui5/O_OpenUI5_V.svg | 1 + .../docs/public/icons/ui5/O_UI5_H.svg | 1 + .../docs/public/icons/ui5/O_UI5_V.svg | 1 + .../docs/public/icons/ui5/UI5.svg | 9 ++ .../documentation/docs/public/learn-more.svg | 9 ++ .../tailwind-css-vsc-color-completion.png | Bin 0 -> 13680 bytes 36 files changed, 330 insertions(+) create mode 100644 packages/documentation/docs/pages/Guidelines.md create mode 100644 packages/documentation/docs/pages/index.md create mode 100644 packages/documentation/docs/pages/indexJsdoc.md create mode 100644 packages/documentation/docs/public/TripPinClassDiagram.jpg create mode 100644 packages/documentation/docs/public/UI5-VitePress-fire-and-water.jpg create mode 100644 packages/documentation/docs/public/favicon.ico create mode 100644 packages/documentation/docs/public/icons/logo/Autoprefixer.svg create mode 100644 packages/documentation/docs/public/icons/logo/PlantUML.svg create mode 100644 packages/documentation/docs/public/icons/logo/PostCSS.svg create mode 100644 packages/documentation/docs/public/icons/logo/Rollup.svg create mode 100644 packages/documentation/docs/public/icons/logo/TailwindCSS.svg create mode 100644 packages/documentation/docs/public/icons/logo/TypeScript-wm.svg create mode 100644 packages/documentation/docs/public/icons/logo/TypeScript.svg create mode 100644 packages/documentation/docs/public/icons/logo/UI5.svg create mode 100644 packages/documentation/docs/public/icons/logo/VitePress.svg create mode 100644 packages/documentation/docs/public/icons/logo/Vitejs.svg create mode 100644 packages/documentation/docs/public/icons/logo/Vuejs.svg create mode 100644 packages/documentation/docs/public/icons/logo/Web-Components.svg create mode 100644 packages/documentation/docs/public/icons/logo/cssnano-wm-vertical.svg create mode 100644 packages/documentation/docs/public/icons/logo/cssnano-wm.svg create mode 100644 packages/documentation/docs/public/icons/logo/cssnano.svg create mode 100644 packages/documentation/docs/public/icons/logo/markdown.svg create mode 100644 packages/documentation/docs/public/icons/logo/powering-sap-btp.svg create mode 100644 packages/documentation/docs/public/icons/ui5/B.svg create mode 100644 packages/documentation/docs/public/icons/ui5/B_OpenUI5_H.svg create mode 100644 packages/documentation/docs/public/icons/ui5/B_OpenUI5_V.svg create mode 100644 packages/documentation/docs/public/icons/ui5/B_UI5_H.svg create mode 100644 packages/documentation/docs/public/icons/ui5/B_UI5_V.svg create mode 100644 packages/documentation/docs/public/icons/ui5/O.svg create mode 100644 packages/documentation/docs/public/icons/ui5/O_OpenUI5_H.svg create mode 100644 packages/documentation/docs/public/icons/ui5/O_OpenUI5_V.svg create mode 100644 packages/documentation/docs/public/icons/ui5/O_UI5_H.svg create mode 100644 packages/documentation/docs/public/icons/ui5/O_UI5_V.svg create mode 100644 packages/documentation/docs/public/icons/ui5/UI5.svg create mode 100644 packages/documentation/docs/public/learn-more.svg create mode 100644 packages/documentation/docs/public/tailwind-css-vsc-color-completion.png diff --git a/packages/documentation/docs/pages/Guidelines.md b/packages/documentation/docs/pages/Guidelines.md new file mode 100644 index 00000000000..9739695c094 --- /dev/null +++ b/packages/documentation/docs/pages/Guidelines.md @@ -0,0 +1,60 @@ +# Development Conventions and Guidelines +## JavaScript Coding Guidelines +We enforce code style rules using [ESLint](https://eslint.org). Execute `npm run lint` to check your code for style issues. +You may also find an ESLint integration for your favorite IDE [here](https://eslint.org/docs/user-guide/integrations). + +## Testing +Unit testing is based on the [ava](https://github.com/avajs/ava) test-framework. You can run all tests using `npm test` (this is what our CI will do for all pull requests). + +During development, you might want to use `npm run unit` or `npm run unit-watch` (re-runs tests automatically after file changes) to quickly execute all unit tests and see whether your change just broke one of them. 😉 + +## Git Guidelines +### No Merge Commits +Please use [rebase instead of merge](https://www.atlassian.com/git/tutorials/merging-vs-rebasing) to update a branch to the latest main. This helps keeping a clean commit history in the project. + +### Commit Message Style +#### Commit Summary +The commit summary is the first line of the commit message. + +- It should be **50-70 characters** long. +- It must be **prefixed** by `[FIX]`, `[FEATURE]` or `[INTERNAL]` accordingly, followed by the name of the component or module which was the main subject of the change. + + Use `[FIX]` for bugfixes. + + Use `[FEATURE]` for new features / enhancements. + + Use `[BREAKING]` for breaking / incompatible changes. + _**Note:** The commit body of a breaking change should also include a paragraph starting with `BREAKING CHANGE:`. + This paragraph will be highlighted in the changelog._ + + Use `[DEPENDENCY]` for dependency updates that should be mentioned in the changelog. + + Use `[INTERNAL]` for all other changes (e.g. refactorings, documentation, etc.). These changes will not be listed in the changelog. + + Exceptions are changes created by automated processes like releases or dependency updates +- It must not contain `[` or `]` anywhere but in the prefix. +- It shall be written in **imperative present tense** (as recommended by [Git](https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project)) + + Examples: Instead of *"Adding tests for"* or *"I added tests for"* use *"Add tests for"* or *"Add feature xy"*. + +#### Commit Body +After the commit summary there should be an empty line followed by the commit body. + +- Describe the intention and reasoning of the change +- If a change fixes an issue reported on GitHub, add the following line to the commit message: + + `Fixes: #` (e.g. `Fixes: #42`) +- Breaking changes should include a paragraph starting with `BREAKING CHANGE:`. This paragraph will be highlighted in the changelog. + +#### Example +``` +[FIX] npm translator: Correct handling of devDependencies + +- devDevependencies should only be included in certain cases +- Was caused by a refactoring + +Fixes: #42 +Fixes: #45 +``` + +## Work on Release Branches +Major releases are typically prepared on dedicated branches like `next`. + +There are some things to be aware of when working on these branches. + +### Implementing Changes in Multiple Code Lines +While working on a new major release (e.g. `5.0.0`), any fixes or new features implemented on the **current** (main) code line (e.g. 4.x) should be cherry-picked as `[INTERNAL]` to the dedicated (pre-)release branch (typically `next`). This is to prevent changes declared as `[FEATURE]` or `[FIX]` from appearing in the changelog twice, which can be confusing since the new major version has not yet been released and should naturally contain any fixes or features released in any of the preceding releases. Listing them twice might confuse users. Note that our changelog is generated based on all tags of the repository, independent of the currently checked out branch (also see [git-chglog/issues/123](https://github.com/git-chglog/git-chglog/issues/123)). + +However, once a new major release becomes **current** (i.e. "main", not a pre-release), any changes applied to multiple code lines should be cherry picked with the original prefix, so that they appear for multiple versions in the changelog. diff --git a/packages/documentation/docs/pages/index.md b/packages/documentation/docs/pages/index.md new file mode 100644 index 00000000000..4074abce8fa --- /dev/null +++ b/packages/documentation/docs/pages/index.md @@ -0,0 +1,144 @@ +![UI5 logo](../images/UI5_logo_wide.png) + +# UI5 CLI + +An open and modular toolchain to develop state-of-the-art applications based on the [UI5](https://ui5.sap.com) framework. + +::: warning Project Rename +**UI5 Tooling has been renamed to UI5 CLI 🚨** + +Read the announcement blog post: **[SAP Community: Goodbye UI5 Tooling - Hello UI5 CLI!](https://community.sap.com/t5/technology-blog-posts-by-sap/goodbye-ui5-tooling-hello-ui5-cli/ba-p/14211769)** +::: + +::: tip New Release +**UI5 CLI V4 is here 🎉** + +Read the announcement blog post: **[SAP Community: UI5 CLI 4.0](https://community.sap.com/t5/technology-blogs-by-sap/ui5-tooling-4-0/ba-p/13769578)** + +And checkout the **[Migrate to v4](../updates/migrate-v4)** documentation. +::: + +
+ + 🚀 Get Started + +
+ +## Main Features + +### 💻 UI5 CLI + +*Also see the [UI5 CLI Documentation](./CLI)* + +```sh +# Global +npm install --global @ui5/cli + +# In your project +npm install --save-dev @ui5/cli +``` + +#### ⚙️ Project Setup + +Configure your project for use with UI5 CLI. +*Also see the [Configuration Documentation](./Configuration)* + +``` +❯ ui5 init +Wrote ui5.yaml: + +specVersion: "4.0 +metadata: + name: my-app +type: application +``` + +#### 🚚 Dependency Management + +UI5 framework dependencies are managed by UI5 CLI. All other dependencies are managed by your favorite node package manager. + +``` +❯ ui5 use SAPUI5@1.117.0 +Updated configuration written to ui5.yaml +This project is now using SAPUI5 version 1.117.0 + +❯ ui5 add sap.ui.core sap.m themelib_sap_fiori_3 +Updated configuration written to ui5.yaml +Added framework libraries sap.ui.core sap.m themelib_sap_fiori_3 as dependencies +``` + +#### 🏄 Development Server + +Start a local development server to work on your project. +*Also see the [Server Documentation](./Server)* + +``` +❯ ui5 serve +Server started +URL: http://localhost:8080 +``` + +#### 🛠 Build for Production + +Build an optimized version of your project. +*Also see the [Builder Documentation](./Builder)* + +``` bash +❯ ui5 build +info graph:helpers:ui5Framework Using OpenUI5 version: 1.117.0 +info ProjectBuilder Preparing build for project my-app +info ProjectBuilder Target directory: ./dist +info ProjectBuilder Cleaning target directory... +info Project 1 of 1: ❯ Building application project my-app... +info my-app › Running task escapeNonAsciiCharacters... +info my-app › Running task replaceCopyright... +info my-app › Running task replaceVersion... +info my-app › Running task minify... +info my-app › Running task generateFlexChangesBundle... +info my-app › Running task generateComponentPreload... +info ProjectBuilder Build succeeded in 296 ms +info ProjectBuilder Executing cleanup tasks... +``` + +### 🧪 Node.js API + +Most UI5 CLI modules provide JavaScript APIs for direct consumption in other Node.js projects. +This allows you to rely on UI5 CLI for UI5-specific build functionality and project handling, while creating your own tools to perfectly match the needs of your project. + +All available APIs are documented in the [UI5 CLI API Reference](https://ui5.github.io/cli/v4/api/index.html). + +#### ESM + + ```js linenums="1 + import {graphFromPackageDependencies} from "@ui5/project/graph"; + + async function buildApp(projectPath, destinationPath) { + const graph = await graphFromPackageDependencies({ + cwd: projectPath + }); + await graph.build({ + destPath: destinationPath, + selfContained: true, + excludedTasks: ["transformBootstrapHtml"], + includedDependencies: ["*"] + }); + } + ``` + +#### CommonJS + + ```js linenums="1 + async function buildApp(projectPath, destinationPath) { + const {graphFromPackageDependencies} = + await import("@ui5/project/graph"); + const graph = await graphFromPackageDependencies({ + cwd: projectPath + }); + await graph.build({ + destPath: destinationPath, + selfContained: true, + excludedTasks: ["transformBootstrapHtml"], + includedDependencies: ["*"] + }); + } + ``` diff --git a/packages/documentation/docs/pages/indexJsdoc.md b/packages/documentation/docs/pages/indexJsdoc.md new file mode 100644 index 00000000000..e05da464efd --- /dev/null +++ b/packages/documentation/docs/pages/indexJsdoc.md @@ -0,0 +1,7 @@ +# UI5 CLI API Reference + +## Support +Please follow our [Contribution Guidelines](https://github.com/UI5/cli/blob/main/CONTRIBUTING#report-an-issue) on how to report an issue. Or chat with us in the [`#tooling`](https://openui5.slack.com/archives/C0A7QFN6B) channel of the [OpenUI5 Community Slack](https://ui5-slack-invite.cfapps.eu10.hana.ondemand.com) + +## License +This project is licensed under the Apache Software License, Version 2.0 except as noted otherwise in the [LICENSE](https://github.com/UI5/cli/blob/main/LICENSE.txt) file. diff --git a/packages/documentation/docs/public/TripPinClassDiagram.jpg b/packages/documentation/docs/public/TripPinClassDiagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..44dfb5669c203a175f19df3cd026a1d6dca001a7 GIT binary patch literal 45518 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

S>HQY|?q#lil2pSyF7z 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è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ˬO>6_PT8h${?nqeT;@I7;Ip!VP@b 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 \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/PlantUML.svg b/packages/documentation/docs/public/icons/logo/PlantUML.svg new file mode 100644 index 00000000000..96535d45535 --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/PlantUML.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/PostCSS.svg b/packages/documentation/docs/public/icons/logo/PostCSS.svg new file mode 100644 index 00000000000..baf9b1e760a --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/PostCSS.svg @@ -0,0 +1 @@ +postcss-logo-symbol diff --git a/packages/documentation/docs/public/icons/logo/Rollup.svg b/packages/documentation/docs/public/icons/logo/Rollup.svg new file mode 100644 index 00000000000..20bb5dfe639 --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/Rollup.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/TailwindCSS.svg b/packages/documentation/docs/public/icons/logo/TailwindCSS.svg new file mode 100644 index 00000000000..e0e971530cd --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/TailwindCSS.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/documentation/docs/public/icons/logo/TypeScript-wm.svg b/packages/documentation/docs/public/icons/logo/TypeScript-wm.svg new file mode 100644 index 00000000000..3c9fa5d3661 --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/TypeScript-wm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/TypeScript.svg b/packages/documentation/docs/public/icons/logo/TypeScript.svg new file mode 100644 index 00000000000..a46d53d49f3 --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/TypeScript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/UI5.svg b/packages/documentation/docs/public/icons/logo/UI5.svg new file mode 100644 index 00000000000..c54ff847626 --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/UI5.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/documentation/docs/public/icons/logo/VitePress.svg b/packages/documentation/docs/public/icons/logo/VitePress.svg new file mode 100644 index 00000000000..ed6438ade1a --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/VitePress.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/Vitejs.svg b/packages/documentation/docs/public/icons/logo/Vitejs.svg new file mode 100644 index 00000000000..de4aeddc12b --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/Vitejs.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/packages/documentation/docs/public/icons/logo/Vuejs.svg b/packages/documentation/docs/public/icons/logo/Vuejs.svg new file mode 100644 index 00000000000..a6c05382d68 --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/Vuejs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/Web-Components.svg b/packages/documentation/docs/public/icons/logo/Web-Components.svg new file mode 100644 index 00000000000..a1e3ce54c3c --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/Web-Components.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/cssnano-wm-vertical.svg b/packages/documentation/docs/public/icons/logo/cssnano-wm-vertical.svg new file mode 100644 index 00000000000..8faebaf4daf --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/cssnano-wm-vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/cssnano-wm.svg b/packages/documentation/docs/public/icons/logo/cssnano-wm.svg new file mode 100644 index 00000000000..e0a266aa490 --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/cssnano-wm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/cssnano.svg b/packages/documentation/docs/public/icons/logo/cssnano.svg new file mode 100644 index 00000000000..58bfe27f2d5 --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/cssnano.svg @@ -0,0 +1,8 @@ + + + + + + diff --git a/packages/documentation/docs/public/icons/logo/markdown.svg b/packages/documentation/docs/public/icons/logo/markdown.svg new file mode 100644 index 00000000000..efaefee739f --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/markdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/powering-sap-btp.svg b/packages/documentation/docs/public/icons/logo/powering-sap-btp.svg new file mode 100644 index 00000000000..260b75880fa --- /dev/null +++ b/packages/documentation/docs/public/icons/logo/powering-sap-btp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B.svg b/packages/documentation/docs/public/icons/ui5/B.svg new file mode 100644 index 00000000000..b5c1033309d --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/B.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B_OpenUI5_H.svg b/packages/documentation/docs/public/icons/ui5/B_OpenUI5_H.svg new file mode 100644 index 00000000000..0b66b01e839 --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/B_OpenUI5_H.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B_OpenUI5_V.svg b/packages/documentation/docs/public/icons/ui5/B_OpenUI5_V.svg new file mode 100644 index 00000000000..00be266e417 --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/B_OpenUI5_V.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B_UI5_H.svg b/packages/documentation/docs/public/icons/ui5/B_UI5_H.svg new file mode 100644 index 00000000000..690ee70443b --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/B_UI5_H.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B_UI5_V.svg b/packages/documentation/docs/public/icons/ui5/B_UI5_V.svg new file mode 100644 index 00000000000..fd78b9bc785 --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/B_UI5_V.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O.svg b/packages/documentation/docs/public/icons/ui5/O.svg new file mode 100644 index 00000000000..122eacd4ab5 --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/O.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O_OpenUI5_H.svg b/packages/documentation/docs/public/icons/ui5/O_OpenUI5_H.svg new file mode 100644 index 00000000000..633e5484325 --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/O_OpenUI5_H.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O_OpenUI5_V.svg b/packages/documentation/docs/public/icons/ui5/O_OpenUI5_V.svg new file mode 100644 index 00000000000..d272c1a348a --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/O_OpenUI5_V.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O_UI5_H.svg b/packages/documentation/docs/public/icons/ui5/O_UI5_H.svg new file mode 100644 index 00000000000..b0659ccbbb0 --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/O_UI5_H.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O_UI5_V.svg b/packages/documentation/docs/public/icons/ui5/O_UI5_V.svg new file mode 100644 index 00000000000..79304ca2592 --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/O_UI5_V.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/UI5.svg b/packages/documentation/docs/public/icons/ui5/UI5.svg new file mode 100644 index 00000000000..c54ff847626 --- /dev/null +++ b/packages/documentation/docs/public/icons/ui5/UI5.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/documentation/docs/public/learn-more.svg b/packages/documentation/docs/public/learn-more.svg new file mode 100644 index 00000000000..22a412cd6e4 --- /dev/null +++ b/packages/documentation/docs/public/learn-more.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/documentation/docs/public/tailwind-css-vsc-color-completion.png b/packages/documentation/docs/public/tailwind-css-vsc-color-completion.png new file mode 100644 index 0000000000000000000000000000000000000000..889123407f2c11558d9eb9c58b047ff7bb48ffc1 GIT binary patch literal 13680 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 z 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 literal 0 HcmV?d00001 From 4df534624841fc499bc0d3684209a45bf35a8ff9 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Thu, 2 Oct 2025 10:30:18 +0300 Subject: [PATCH 02/51] refactor: Move /docs to the newly create package --- .../documentation/docs}/Guidelines.md | 0 .../documentation/docs/pages/Guidelines.md | 60 -------- packages/documentation/docs/pages/index.md | 144 ------------------ .../documentation/docs/pages/indexJsdoc.md | 7 - .../docs/public/TripPinClassDiagram.jpg | Bin 45518 -> 0 bytes .../public/UI5-VitePress-fire-and-water.jpg | Bin 167975 -> 0 bytes .../documentation/docs/public/favicon.ico | Bin 15086 -> 0 bytes .../docs/public/icons/logo/Autoprefixer.svg | 1 - .../docs/public/icons/logo/PlantUML.svg | 41 ----- .../docs/public/icons/logo/PostCSS.svg | 1 - .../docs/public/icons/logo/Rollup.svg | 3 - .../docs/public/icons/logo/TailwindCSS.svg | 4 - .../docs/public/icons/logo/TypeScript-wm.svg | 1 - .../docs/public/icons/logo/TypeScript.svg | 1 - .../docs/public/icons/logo/UI5.svg | 9 -- .../docs/public/icons/logo/VitePress.svg | 1 - .../docs/public/icons/logo/Vitejs.svg | 15 -- .../docs/public/icons/logo/Vuejs.svg | 1 - .../docs/public/icons/logo/Web-Components.svg | 1 - .../public/icons/logo/cssnano-wm-vertical.svg | 1 - .../docs/public/icons/logo/cssnano-wm.svg | 1 - .../docs/public/icons/logo/cssnano.svg | 8 - .../docs/public/icons/logo/markdown.svg | 1 - .../public/icons/logo/powering-sap-btp.svg | 1 - .../documentation/docs/public/icons/ui5/B.svg | 1 - .../docs/public/icons/ui5/B_OpenUI5_H.svg | 1 - .../docs/public/icons/ui5/B_OpenUI5_V.svg | 1 - .../docs/public/icons/ui5/B_UI5_H.svg | 1 - .../docs/public/icons/ui5/B_UI5_V.svg | 1 - .../documentation/docs/public/icons/ui5/O.svg | 1 - .../docs/public/icons/ui5/O_OpenUI5_H.svg | 1 - .../docs/public/icons/ui5/O_OpenUI5_V.svg | 1 - .../docs/public/icons/ui5/O_UI5_H.svg | 1 - .../docs/public/icons/ui5/O_UI5_V.svg | 1 - .../docs/public/icons/ui5/UI5.svg | 9 -- .../documentation/docs/public/learn-more.svg | 9 -- .../tailwind-css-vsc-color-completion.png | Bin 13680 -> 0 bytes 37 files changed, 330 deletions(-) rename {docs => packages/documentation/docs}/Guidelines.md (100%) delete mode 100644 packages/documentation/docs/pages/Guidelines.md delete mode 100644 packages/documentation/docs/pages/index.md delete mode 100644 packages/documentation/docs/pages/indexJsdoc.md delete mode 100644 packages/documentation/docs/public/TripPinClassDiagram.jpg delete mode 100644 packages/documentation/docs/public/UI5-VitePress-fire-and-water.jpg delete mode 100644 packages/documentation/docs/public/favicon.ico delete mode 100644 packages/documentation/docs/public/icons/logo/Autoprefixer.svg delete mode 100644 packages/documentation/docs/public/icons/logo/PlantUML.svg delete mode 100644 packages/documentation/docs/public/icons/logo/PostCSS.svg delete mode 100644 packages/documentation/docs/public/icons/logo/Rollup.svg delete mode 100644 packages/documentation/docs/public/icons/logo/TailwindCSS.svg delete mode 100644 packages/documentation/docs/public/icons/logo/TypeScript-wm.svg delete mode 100644 packages/documentation/docs/public/icons/logo/TypeScript.svg delete mode 100644 packages/documentation/docs/public/icons/logo/UI5.svg delete mode 100644 packages/documentation/docs/public/icons/logo/VitePress.svg delete mode 100644 packages/documentation/docs/public/icons/logo/Vitejs.svg delete mode 100644 packages/documentation/docs/public/icons/logo/Vuejs.svg delete mode 100644 packages/documentation/docs/public/icons/logo/Web-Components.svg delete mode 100644 packages/documentation/docs/public/icons/logo/cssnano-wm-vertical.svg delete mode 100644 packages/documentation/docs/public/icons/logo/cssnano-wm.svg delete mode 100644 packages/documentation/docs/public/icons/logo/cssnano.svg delete mode 100644 packages/documentation/docs/public/icons/logo/markdown.svg delete mode 100644 packages/documentation/docs/public/icons/logo/powering-sap-btp.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/B.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/B_OpenUI5_H.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/B_OpenUI5_V.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/B_UI5_H.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/B_UI5_V.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/O.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/O_OpenUI5_H.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/O_OpenUI5_V.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/O_UI5_H.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/O_UI5_V.svg delete mode 100644 packages/documentation/docs/public/icons/ui5/UI5.svg delete mode 100644 packages/documentation/docs/public/learn-more.svg delete mode 100644 packages/documentation/docs/public/tailwind-css-vsc-color-completion.png diff --git a/docs/Guidelines.md b/packages/documentation/docs/Guidelines.md similarity index 100% rename from docs/Guidelines.md rename to packages/documentation/docs/Guidelines.md diff --git a/packages/documentation/docs/pages/Guidelines.md b/packages/documentation/docs/pages/Guidelines.md deleted file mode 100644 index 9739695c094..00000000000 --- a/packages/documentation/docs/pages/Guidelines.md +++ /dev/null @@ -1,60 +0,0 @@ -# Development Conventions and Guidelines -## JavaScript Coding Guidelines -We enforce code style rules using [ESLint](https://eslint.org). Execute `npm run lint` to check your code for style issues. -You may also find an ESLint integration for your favorite IDE [here](https://eslint.org/docs/user-guide/integrations). - -## Testing -Unit testing is based on the [ava](https://github.com/avajs/ava) test-framework. You can run all tests using `npm test` (this is what our CI will do for all pull requests). - -During development, you might want to use `npm run unit` or `npm run unit-watch` (re-runs tests automatically after file changes) to quickly execute all unit tests and see whether your change just broke one of them. 😉 - -## Git Guidelines -### No Merge Commits -Please use [rebase instead of merge](https://www.atlassian.com/git/tutorials/merging-vs-rebasing) to update a branch to the latest main. This helps keeping a clean commit history in the project. - -### Commit Message Style -#### Commit Summary -The commit summary is the first line of the commit message. - -- It should be **50-70 characters** long. -- It must be **prefixed** by `[FIX]`, `[FEATURE]` or `[INTERNAL]` accordingly, followed by the name of the component or module which was the main subject of the change. - + Use `[FIX]` for bugfixes. - + Use `[FEATURE]` for new features / enhancements. - + Use `[BREAKING]` for breaking / incompatible changes. - _**Note:** The commit body of a breaking change should also include a paragraph starting with `BREAKING CHANGE:`. - This paragraph will be highlighted in the changelog._ - + Use `[DEPENDENCY]` for dependency updates that should be mentioned in the changelog. - + Use `[INTERNAL]` for all other changes (e.g. refactorings, documentation, etc.). These changes will not be listed in the changelog. - + Exceptions are changes created by automated processes like releases or dependency updates -- It must not contain `[` or `]` anywhere but in the prefix. -- It shall be written in **imperative present tense** (as recommended by [Git](https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project)) - + Examples: Instead of *"Adding tests for"* or *"I added tests for"* use *"Add tests for"* or *"Add feature xy"*. - -#### Commit Body -After the commit summary there should be an empty line followed by the commit body. - -- Describe the intention and reasoning of the change -- If a change fixes an issue reported on GitHub, add the following line to the commit message: - + `Fixes: #` (e.g. `Fixes: #42`) -- Breaking changes should include a paragraph starting with `BREAKING CHANGE:`. This paragraph will be highlighted in the changelog. - -#### Example -``` -[FIX] npm translator: Correct handling of devDependencies - -- devDevependencies should only be included in certain cases -- Was caused by a refactoring - -Fixes: #42 -Fixes: #45 -``` - -## Work on Release Branches -Major releases are typically prepared on dedicated branches like `next`. - -There are some things to be aware of when working on these branches. - -### Implementing Changes in Multiple Code Lines -While working on a new major release (e.g. `5.0.0`), any fixes or new features implemented on the **current** (main) code line (e.g. 4.x) should be cherry-picked as `[INTERNAL]` to the dedicated (pre-)release branch (typically `next`). This is to prevent changes declared as `[FEATURE]` or `[FIX]` from appearing in the changelog twice, which can be confusing since the new major version has not yet been released and should naturally contain any fixes or features released in any of the preceding releases. Listing them twice might confuse users. Note that our changelog is generated based on all tags of the repository, independent of the currently checked out branch (also see [git-chglog/issues/123](https://github.com/git-chglog/git-chglog/issues/123)). - -However, once a new major release becomes **current** (i.e. "main", not a pre-release), any changes applied to multiple code lines should be cherry picked with the original prefix, so that they appear for multiple versions in the changelog. diff --git a/packages/documentation/docs/pages/index.md b/packages/documentation/docs/pages/index.md deleted file mode 100644 index 4074abce8fa..00000000000 --- a/packages/documentation/docs/pages/index.md +++ /dev/null @@ -1,144 +0,0 @@ -![UI5 logo](../images/UI5_logo_wide.png) - -# UI5 CLI - -An open and modular toolchain to develop state-of-the-art applications based on the [UI5](https://ui5.sap.com) framework. - -::: warning Project Rename -**UI5 Tooling has been renamed to UI5 CLI 🚨** - -Read the announcement blog post: **[SAP Community: Goodbye UI5 Tooling - Hello UI5 CLI!](https://community.sap.com/t5/technology-blog-posts-by-sap/goodbye-ui5-tooling-hello-ui5-cli/ba-p/14211769)** -::: - -::: tip New Release -**UI5 CLI V4 is here 🎉** - -Read the announcement blog post: **[SAP Community: UI5 CLI 4.0](https://community.sap.com/t5/technology-blogs-by-sap/ui5-tooling-4-0/ba-p/13769578)** - -And checkout the **[Migrate to v4](../updates/migrate-v4)** documentation. -::: - -

- -## Main Features - -### 💻 UI5 CLI - -*Also see the [UI5 CLI Documentation](./CLI)* - -```sh -# Global -npm install --global @ui5/cli - -# In your project -npm install --save-dev @ui5/cli -``` - -#### ⚙️ Project Setup - -Configure your project for use with UI5 CLI. -*Also see the [Configuration Documentation](./Configuration)* - -``` -❯ ui5 init -Wrote ui5.yaml: - -specVersion: "4.0 -metadata: - name: my-app -type: application -``` - -#### 🚚 Dependency Management - -UI5 framework dependencies are managed by UI5 CLI. All other dependencies are managed by your favorite node package manager. - -``` -❯ ui5 use SAPUI5@1.117.0 -Updated configuration written to ui5.yaml -This project is now using SAPUI5 version 1.117.0 - -❯ ui5 add sap.ui.core sap.m themelib_sap_fiori_3 -Updated configuration written to ui5.yaml -Added framework libraries sap.ui.core sap.m themelib_sap_fiori_3 as dependencies -``` - -#### 🏄 Development Server - -Start a local development server to work on your project. -*Also see the [Server Documentation](./Server)* - -``` -❯ ui5 serve -Server started -URL: http://localhost:8080 -``` - -#### 🛠 Build for Production - -Build an optimized version of your project. -*Also see the [Builder Documentation](./Builder)* - -``` bash -❯ ui5 build -info graph:helpers:ui5Framework Using OpenUI5 version: 1.117.0 -info ProjectBuilder Preparing build for project my-app -info ProjectBuilder Target directory: ./dist -info ProjectBuilder Cleaning target directory... -info Project 1 of 1: ❯ Building application project my-app... -info my-app › Running task escapeNonAsciiCharacters... -info my-app › Running task replaceCopyright... -info my-app › Running task replaceVersion... -info my-app › Running task minify... -info my-app › Running task generateFlexChangesBundle... -info my-app › Running task generateComponentPreload... -info ProjectBuilder Build succeeded in 296 ms -info ProjectBuilder Executing cleanup tasks... -``` - -### 🧪 Node.js API - -Most UI5 CLI modules provide JavaScript APIs for direct consumption in other Node.js projects. -This allows you to rely on UI5 CLI for UI5-specific build functionality and project handling, while creating your own tools to perfectly match the needs of your project. - -All available APIs are documented in the [UI5 CLI API Reference](https://ui5.github.io/cli/v4/api/index.html). - -#### ESM - - ```js linenums="1 - import {graphFromPackageDependencies} from "@ui5/project/graph"; - - async function buildApp(projectPath, destinationPath) { - const graph = await graphFromPackageDependencies({ - cwd: projectPath - }); - await graph.build({ - destPath: destinationPath, - selfContained: true, - excludedTasks: ["transformBootstrapHtml"], - includedDependencies: ["*"] - }); - } - ``` - -#### CommonJS - - ```js linenums="1 - async function buildApp(projectPath, destinationPath) { - const {graphFromPackageDependencies} = - await import("@ui5/project/graph"); - const graph = await graphFromPackageDependencies({ - cwd: projectPath - }); - await graph.build({ - destPath: destinationPath, - selfContained: true, - excludedTasks: ["transformBootstrapHtml"], - includedDependencies: ["*"] - }); - } - ``` diff --git a/packages/documentation/docs/pages/indexJsdoc.md b/packages/documentation/docs/pages/indexJsdoc.md deleted file mode 100644 index e05da464efd..00000000000 --- a/packages/documentation/docs/pages/indexJsdoc.md +++ /dev/null @@ -1,7 +0,0 @@ -# UI5 CLI API Reference - -## Support -Please follow our [Contribution Guidelines](https://github.com/UI5/cli/blob/main/CONTRIBUTING#report-an-issue) on how to report an issue. Or chat with us in the [`#tooling`](https://openui5.slack.com/archives/C0A7QFN6B) channel of the [OpenUI5 Community Slack](https://ui5-slack-invite.cfapps.eu10.hana.ondemand.com) - -## License -This project is licensed under the Apache Software License, Version 2.0 except as noted otherwise in the [LICENSE](https://github.com/UI5/cli/blob/main/LICENSE.txt) file. diff --git a/packages/documentation/docs/public/TripPinClassDiagram.jpg b/packages/documentation/docs/public/TripPinClassDiagram.jpg deleted file mode 100644 index 44dfb5669c203a175f19df3cd026a1d6dca001a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45518 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

S>HQY|?q#lil2pSyF7z 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è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ˬO>6_PT8h${?nqeT;@I7;Ip!VP@b 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 \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/PlantUML.svg b/packages/documentation/docs/public/icons/logo/PlantUML.svg deleted file mode 100644 index 96535d45535..00000000000 --- a/packages/documentation/docs/public/icons/logo/PlantUML.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/PostCSS.svg b/packages/documentation/docs/public/icons/logo/PostCSS.svg deleted file mode 100644 index baf9b1e760a..00000000000 --- a/packages/documentation/docs/public/icons/logo/PostCSS.svg +++ /dev/null @@ -1 +0,0 @@ -postcss-logo-symbol diff --git a/packages/documentation/docs/public/icons/logo/Rollup.svg b/packages/documentation/docs/public/icons/logo/Rollup.svg deleted file mode 100644 index 20bb5dfe639..00000000000 --- a/packages/documentation/docs/public/icons/logo/Rollup.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/TailwindCSS.svg b/packages/documentation/docs/public/icons/logo/TailwindCSS.svg deleted file mode 100644 index e0e971530cd..00000000000 --- a/packages/documentation/docs/public/icons/logo/TailwindCSS.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/packages/documentation/docs/public/icons/logo/TypeScript-wm.svg b/packages/documentation/docs/public/icons/logo/TypeScript-wm.svg deleted file mode 100644 index 3c9fa5d3661..00000000000 --- a/packages/documentation/docs/public/icons/logo/TypeScript-wm.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/TypeScript.svg b/packages/documentation/docs/public/icons/logo/TypeScript.svg deleted file mode 100644 index a46d53d49f3..00000000000 --- a/packages/documentation/docs/public/icons/logo/TypeScript.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/UI5.svg b/packages/documentation/docs/public/icons/logo/UI5.svg deleted file mode 100644 index c54ff847626..00000000000 --- a/packages/documentation/docs/public/icons/logo/UI5.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/packages/documentation/docs/public/icons/logo/VitePress.svg b/packages/documentation/docs/public/icons/logo/VitePress.svg deleted file mode 100644 index ed6438ade1a..00000000000 --- a/packages/documentation/docs/public/icons/logo/VitePress.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/Vitejs.svg b/packages/documentation/docs/public/icons/logo/Vitejs.svg deleted file mode 100644 index de4aeddc12b..00000000000 --- a/packages/documentation/docs/public/icons/logo/Vitejs.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/packages/documentation/docs/public/icons/logo/Vuejs.svg b/packages/documentation/docs/public/icons/logo/Vuejs.svg deleted file mode 100644 index a6c05382d68..00000000000 --- a/packages/documentation/docs/public/icons/logo/Vuejs.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/Web-Components.svg b/packages/documentation/docs/public/icons/logo/Web-Components.svg deleted file mode 100644 index a1e3ce54c3c..00000000000 --- a/packages/documentation/docs/public/icons/logo/Web-Components.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/cssnano-wm-vertical.svg b/packages/documentation/docs/public/icons/logo/cssnano-wm-vertical.svg deleted file mode 100644 index 8faebaf4daf..00000000000 --- a/packages/documentation/docs/public/icons/logo/cssnano-wm-vertical.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/cssnano-wm.svg b/packages/documentation/docs/public/icons/logo/cssnano-wm.svg deleted file mode 100644 index e0a266aa490..00000000000 --- a/packages/documentation/docs/public/icons/logo/cssnano-wm.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/cssnano.svg b/packages/documentation/docs/public/icons/logo/cssnano.svg deleted file mode 100644 index 58bfe27f2d5..00000000000 --- a/packages/documentation/docs/public/icons/logo/cssnano.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/packages/documentation/docs/public/icons/logo/markdown.svg b/packages/documentation/docs/public/icons/logo/markdown.svg deleted file mode 100644 index efaefee739f..00000000000 --- a/packages/documentation/docs/public/icons/logo/markdown.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/logo/powering-sap-btp.svg b/packages/documentation/docs/public/icons/logo/powering-sap-btp.svg deleted file mode 100644 index 260b75880fa..00000000000 --- a/packages/documentation/docs/public/icons/logo/powering-sap-btp.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B.svg b/packages/documentation/docs/public/icons/ui5/B.svg deleted file mode 100644 index b5c1033309d..00000000000 --- a/packages/documentation/docs/public/icons/ui5/B.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B_OpenUI5_H.svg b/packages/documentation/docs/public/icons/ui5/B_OpenUI5_H.svg deleted file mode 100644 index 0b66b01e839..00000000000 --- a/packages/documentation/docs/public/icons/ui5/B_OpenUI5_H.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B_OpenUI5_V.svg b/packages/documentation/docs/public/icons/ui5/B_OpenUI5_V.svg deleted file mode 100644 index 00be266e417..00000000000 --- a/packages/documentation/docs/public/icons/ui5/B_OpenUI5_V.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B_UI5_H.svg b/packages/documentation/docs/public/icons/ui5/B_UI5_H.svg deleted file mode 100644 index 690ee70443b..00000000000 --- a/packages/documentation/docs/public/icons/ui5/B_UI5_H.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/B_UI5_V.svg b/packages/documentation/docs/public/icons/ui5/B_UI5_V.svg deleted file mode 100644 index fd78b9bc785..00000000000 --- a/packages/documentation/docs/public/icons/ui5/B_UI5_V.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O.svg b/packages/documentation/docs/public/icons/ui5/O.svg deleted file mode 100644 index 122eacd4ab5..00000000000 --- a/packages/documentation/docs/public/icons/ui5/O.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O_OpenUI5_H.svg b/packages/documentation/docs/public/icons/ui5/O_OpenUI5_H.svg deleted file mode 100644 index 633e5484325..00000000000 --- a/packages/documentation/docs/public/icons/ui5/O_OpenUI5_H.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O_OpenUI5_V.svg b/packages/documentation/docs/public/icons/ui5/O_OpenUI5_V.svg deleted file mode 100644 index d272c1a348a..00000000000 --- a/packages/documentation/docs/public/icons/ui5/O_OpenUI5_V.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O_UI5_H.svg b/packages/documentation/docs/public/icons/ui5/O_UI5_H.svg deleted file mode 100644 index b0659ccbbb0..00000000000 --- a/packages/documentation/docs/public/icons/ui5/O_UI5_H.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/O_UI5_V.svg b/packages/documentation/docs/public/icons/ui5/O_UI5_V.svg deleted file mode 100644 index 79304ca2592..00000000000 --- a/packages/documentation/docs/public/icons/ui5/O_UI5_V.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/documentation/docs/public/icons/ui5/UI5.svg b/packages/documentation/docs/public/icons/ui5/UI5.svg deleted file mode 100644 index c54ff847626..00000000000 --- a/packages/documentation/docs/public/icons/ui5/UI5.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/packages/documentation/docs/public/learn-more.svg b/packages/documentation/docs/public/learn-more.svg deleted file mode 100644 index 22a412cd6e4..00000000000 --- a/packages/documentation/docs/public/learn-more.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/packages/documentation/docs/public/tailwind-css-vsc-color-completion.png b/packages/documentation/docs/public/tailwind-css-vsc-color-completion.png deleted file mode 100644 index 889123407f2c11558d9eb9c58b047ff7bb48ffc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13680 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 z 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 From c19c6dc44ad83e9c44f44373a21620819eeee161 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Tue, 14 Oct 2025 09:49:25 +0300 Subject: [PATCH 03/51] refactor: Guidelines are for the whole project and should be at the top level --- {packages/documentation/docs => docs}/Guidelines.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {packages/documentation/docs => docs}/Guidelines.md (100%) diff --git a/packages/documentation/docs/Guidelines.md b/docs/Guidelines.md similarity index 100% rename from packages/documentation/docs/Guidelines.md rename to docs/Guidelines.md From 54d8760c8b9d39eb89aa1125e4190d004a7b92e8 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Thu, 2 Oct 2025 10:30:18 +0300 Subject: [PATCH 04/51] refactor: Move /docs to the newly create package --- .../documentation/docs}/Guidelines.md | 0 packages/documentation/docs/pages/CLI.md | 393 ------------------ 2 files changed, 393 deletions(-) rename {docs => packages/documentation/docs}/Guidelines.md (100%) delete mode 100644 packages/documentation/docs/pages/CLI.md diff --git a/docs/Guidelines.md b/packages/documentation/docs/Guidelines.md similarity index 100% rename from docs/Guidelines.md rename to packages/documentation/docs/Guidelines.md diff --git a/packages/documentation/docs/pages/CLI.md b/packages/documentation/docs/pages/CLI.md deleted file mode 100644 index 1ab4eef2089..00000000000 --- a/packages/documentation/docs/pages/CLI.md +++ /dev/null @@ -1,393 +0,0 @@ -# UI5 CLI -## Requirements -- [Node.js](https://nodejs.org/) version v20.11.0 and higher or v22.0.0 and higher (v21 is not supported) -- [npm](https://www.npmjs.com/) version v8.0.0 or higher - -## Installation - -Install the CLI using the npm package manager: - -```sh -npm install --global @ui5/cli - -# Verify installation -ui5 --help -``` - -## Usage/Syntax - -` - ui5 [options] -` - -The CLI automatically checks for updates using [update-notifier](https://github.com/yeoman/update-notifier). While this is skipped in CI environments, you might also opt-out manually by following the steps described [here](https://github.com/yeoman/update-notifier/blob/-/readme.md#user-settings). - -## Common options - -These options you can use with each command. - -| Option | Description | Details | -| --- | --- | --- | -| -h, --help | Show help | [boolean] | -| -v, --version | Show version number | [boolean] | -| -c, --config | Path to project configuration file in YAML format | [string] | -| --dependency-definition | Path to a YAML file containing the project's dependency tree. This option will disable resolution of node package dependencies. | [string] | -| --workspace-config | Path to workspace configuration file in YAML format | [string] | -| -w, --workspace | Name of the workspace configuration to use | [string] [default: "default"] | -| --loglevel, --log-level | Set the logging level | [string] [choices: "silent", "error", "warn", "info", "perf", "verbose", "silly"] [default: "info"] | -| --verbose | Enable verbose logging. | [boolean] [default: false] | -| --perf | Enable performance measurements and related logging. | [boolean] [default: false] | -| --silent | Disable all log output. | [boolean] [default: false] | - -## Examples - -Execute command using a static dependency tree instead of resolving node package dependencies -``` -ui5 --dependency-definition /path/to/projectDependencies.yaml -``` -Execute command using a project configuration from custom path -``` -ui5 --config /path/to/ui5.yaml -``` -Execute command using the 'dolphin' workspace of a ui5-workspace.yaml -``` -ui5 --workspace dolphin -``` -Execute command with the maximum log output -``` -ui5 --log-level silly -``` - -## Commands - -### ui5 add - -**Description** - -Add SAPUI5/OpenUI5 framework libraries to the project configuration. - -**Usage** - -` -ui5 add [--development] [--optional] -` - - -**Options** - -| Option | Description | Details | -| --- | --- | --- | -| -D, --development, --dev | Add as development dependency | [boolean] [default: false] | -| -O, --optional | Add as optional dependency | [boolean] [default: false] | - -**Positionals** - -| Positional | Description | Details | -| --- | --- | --- | -| framework-libraries | Framework library names | [array] [required] [default: []] | - -**Examples** - -Add the framework libraries sap.ui.core and sap.m as dependencies -``` -ui5 add sap.ui.core sap.m -``` -Add the framework library sap.ui.support as development dependency -``` -ui5 add -D sap.ui.support -``` -Add the framework library themelib_sap_fiori_3 as optional dependency -``` -ui5 add --optional themelib_sap_fiori_3 -``` -### ui5 build - -**Description** - -Build project in current directory - -**Usage** - -` -ui5 build -` - -**Child Commands** - -| Command | Description | -| --- | --- | -| ui5 build jsdoc | Build JSDoc resources | -| ui5 build preload | (default) Build project and create preload bundles | -| ui5 build self-contained | Build project and create self-contained bundle. Recommended to be used in conjunction with --include-all-dependencies | - -**Options** - -| Option | Description | Details | -| --- | --- | --- | -| -a, --include-all-dependencies, --all | Include all dependencies in the build result. This is equivalent to '--include-dependency "*"' | [boolean] [default: false] | -| --include-dependency | A list of dependencies to be included in the build result. You can use the asterisk '*' as an alias for including all dependencies in the build result. The listed dependencies cannot be overruled by dependencies defined in 'exclude-dependency'. The provided name must match with the dependency name shown in 'ui5 ls --flat' | [array] | -| --include-dependency-regexp | A list of regular expressions defining dependencies to be included in the build result. This list is prioritized like 'include-dependency'. | [array] | -| --include-dependency-tree | A list of dependencies to be included in the build result. Transitive dependencies are implicitly included and do not need to be part of this list. These dependencies overrule the selection of 'exclude-dependency-tree' but can be overruled by 'exclude-dependency'. | [array] | -| --exclude-dependency | A list of dependencies to be excluded from the build result. The listed dependencies can be overruled by dependencies defined in 'include-dependency'. The provided name must match with the dependency name shown in 'ui5 ls --flat' | [array] | -| --exclude-dependency-regexp | A list of regular expressions defining dependencies to be excluded from the build result. This list is prioritized like 'exclude-dependency'. | [array] | -| --exclude-dependency-tree | A list of dependencies to be excluded from the build result. Transitive dependencies are implicitly included and do not need to be part of this list. | [array] | -| --dest | Path of build destination | [string] [default: "./dist"] | -| --clean-dest | If present, clean the destination directory before building | [boolean] [default: false] | -| --create-build-manifest | Store build metadata in a '.ui5' directory in the build destination, allowing reuse of the build result in other builds | [boolean] [default: false] | -| --include-task | A list of tasks to be added to the default execution set. This option takes precedence over any excludes. | [array] | -| --exclude-task | A list of tasks to be excluded from the default task execution set | [array] | -| --framework-version | Overrides the framework version defined by the project. Takes the same value as the version part of "ui5 use" | [string] | -| --cache-mode | Cache mode to use when consuming SNAPSHOT versions of framework dependencies. The 'Default' behavior is to invalidate the cache after 9 hours. 'Force' uses the cache only and does not create any requests. 'Off' invalidates any existing cache and updates from the repository | [string] [choices: "Default", "Force", "Off"] [default: "Default"] | -| --experimental-css-variables | Generate CSS variables (css-variables.css, css-variables.source.less) and skeleton (library-skeleton(-RTL).css) for all themes | [boolean] [default: false] | -| --output-style | Processes build results into a specific directory structure.
- Flat: Omits the project namespace and the "resources" directory.
- Namespace: Respects the project namespace and the "resources" directory, maintaining the original structure.
- Default: The default directory structure for every project type. For applications, this is identical to "Flat", and for libraries, it is "Namespace". Other types have a more distinct default output style. | [string] [choices: "Default", "Flat", "Namespace"] [default: "Default"] | - - -**Examples** - -Preload build for project without dependencies -``` -ui5 build -``` -Self-contained build for project -``` -ui5 build self-contained -``` -Build project but only apply the minify- and generateComponentPreload tasks -``` -ui5 build --exclude-task=* --include-task=minify generateComponentPreload -``` -Build project by applying all default tasks including the minify task and excluding the generateComponentPreload task -``` -ui5 build --include-task=minify --exclude-task=generateComponentPreload -``` -Preload build with experimental CSS variables artifacts -``` -ui5 build --experimental-css-variables -``` -### ui5 config - -**Description** - -Get and set UI5 CLI configuration options - -**Usage** - -` -ui5 config -` - -**Child Commands** - -| Command | Description | -| --- | --- | -| ui5 config set

## Main Features ### 💻 UI5 CLI -*Also see the [UI5 CLI Documentation](./pages/CLI.md)* +*Also see the [UI5 CLI Documentation](./pages/CLI)* ```sh # Global @@ -35,7 +41,7 @@ npm install --save-dev @ui5/cli #### ⚙️ Project Setup Configure your project for use with UI5 CLI. -*Also see the [Configuration Documentation](./pages/Configuration.md)* +*Also see the [Configuration Documentation](./pages/Configuration)* ``` ❯ ui5 init @@ -64,7 +70,7 @@ Added framework libraries sap.ui.core sap.m themelib_sap_fiori_3 as dependencies #### 🏄 Development Server Start a local development server to work on your project. -*Also see the [Server Documentation](./pages/Server.md)* +*Also see the [Server Documentation](./pages/Server)* ``` ❯ ui5 serve @@ -75,7 +81,7 @@ URL: http://localhost:8080 #### 🛠 Build for Production Build an optimized version of your project. -*Also see the [Builder Documentation](./pages/Builder.md)* +*Also see the [Builder Documentation](./pages/Builder)* ``` bash ❯ ui5 build @@ -101,38 +107,38 @@ This allows you to rely on UI5 CLI for UI5-specific build functionality and proj All available APIs are documented in the [UI5 CLI API Reference](https://ui5.github.io/cli/v4/api/index.html). -=== "ESM" - - ```js linenums="1" - import {graphFromPackageDependencies} from "@ui5/project/graph"; - - async function buildApp(projectPath, destinationPath) { - const graph = await graphFromPackageDependencies({ - cwd: projectPath - }); - await graph.build({ - destPath: destinationPath, - selfContained: true, - excludedTasks: ["transformBootstrapHtml"], - includedDependencies: ["*"] - }); - } - ``` - -=== "CommonJS" - - ```js linenums="1" - async function buildApp(projectPath, destinationPath) { - const {graphFromPackageDependencies} = - await import("@ui5/project/graph"); - const graph = await graphFromPackageDependencies({ - cwd: projectPath - }); - await graph.build({ - destPath: destinationPath, - selfContained: true, - excludedTasks: ["transformBootstrapHtml"], - includedDependencies: ["*"] - }); - } - ``` +#### ESM + +```js linenums="1 +import {graphFromPackageDependencies} from "@ui5/project/graph"; + +async function buildApp(projectPath, destinationPath) { + const graph = await graphFromPackageDependencies({ + cwd: projectPath + }); + await graph.build({ + destPath: destinationPath, + selfContained: true, + excludedTasks: ["transformBootstrapHtml"], + includedDependencies: ["*"] + }); +} +``` + +#### CommonJS + +```js linenums="1 +async function buildApp(projectPath, destinationPath) { + const {graphFromPackageDependencies} = + await import("@ui5/project/graph"); + const graph = await graphFromPackageDependencies({ + cwd: projectPath + }); + await graph.build({ + destPath: destinationPath, + selfContained: true, + excludedTasks: ["transformBootstrapHtml"], + includedDependencies: ["*"] + }); +} +``` diff --git a/packages/documentation/docs/pages/Benchmarking.md b/packages/documentation/docs/pages/Benchmarking.md index 321ff98497f..236812f882a 100644 --- a/packages/documentation/docs/pages/Benchmarking.md +++ b/packages/documentation/docs/pages/Benchmarking.md @@ -102,11 +102,11 @@ The following is a walk-through on how to evaluate the performance impact of an 1. Prepare your change 1. Switch to the branch that contains your change ```sh - (cd ../ui5-builder && git checkout my-change) + (cd ../pages/ui5-builder && git checkout my-change) ``` 1. If your change requires different npm dependencies, reinstall them ```sh - (cd ../ui5-builder && npm install) + (cd ../pages/ui5-builder && npm install) ``` 1. The link from UI5 CLI is still in place. However, if you have changes in **multiple** UI5 CLI modules, you might need to `npm link` those again diff --git a/packages/documentation/docs/pages/Builder.md b/packages/documentation/docs/pages/Builder.md index b007bdac38a..58b83d53e2b 100644 --- a/packages/documentation/docs/pages/Builder.md +++ b/packages/documentation/docs/pages/Builder.md @@ -4,16 +4,20 @@ The [UI5 Builder](https://github.com/SAP/ui5-builder) module takes care of build Based on a project's type, the UI5 Builder defines a series of build steps to execute; these are also called "tasks". -For every type there is a set of default tasks. You can disable single tasks using the `--exclude-task` [CLI parameter](./CLI.md#ui5-build), and you can include tasks using the `--include-task` parameter. +For every type there is a set of default tasks. You can disable single tasks using the `--exclude-task` [CLI parameter](./CLI#ui5-build), and you can include tasks using the `--include-task` parameter. -[**API Reference**](https://ui5.github.io/cli/v4/api/index.html){: .md-button .sap-icon-initiative } + ## Tasks Tasks are specific build steps to be executed during build phase. They are responsible for collecting resources which can be modified by a processor. A task configures one or more processors and supplies them with the collected resources. After the respective processor processed the resources, the task is able to continue with its workflow. -A project can add custom tasks to the build by using the [Custom Tasks Extensibility](./extensibility/CustomTasks.md). +A project can add custom tasks to the build by using the [Custom Tasks Extensibility](./extensibility/CustomTasks). ### Standard Tasks @@ -43,14 +47,14 @@ All available standard tasks are documented [in the API reference](https://ui5.g | generateApiIndex | *disabled* ^1^ | | | | generateResourcesJson | *disabled* | *disabled* | *disabled* | -*Disabled tasks can be activated by certain build modes, the project configuration, or by using the `--include-task` [CLI parameter](./CLI.md#ui5-build). See footnotes where given* +*Disabled tasks can be activated by certain build modes, the project configuration, or by using the `--include-task` [CLI parameter](./CLI#ui5-build). See footnotes where given* --- ^1^ Enabled in `jsdoc` build, which disables most of the other tasks -^2^ Enabled for projects defining a [component preload configuration](./Configuration.md#component-preload-generation) +^2^ Enabled for projects defining a [component preload configuration](./Configuration#component-preload-generation) ^3^ Enabled in `self-contained` build, which disables `generateComponentPreload` and `generateLibraryPreload` -^4^ Enabled for projects defining a [bundle configuration](./Configuration.md#custom-bundling) +^4^ Enabled for projects defining a [bundle configuration](./Configuration#custom-bundling) ^5^ Can be enabled for framework projects via the `includeTask` option. For other projects, this task is skipped ### minify @@ -65,24 +69,30 @@ Related to this, the bundling tasks will also incorporate the generated source m #### Input Source Maps -!!! info - Support for input source maps has been added in UI5 CLI [`v3.7.0`](https://github.com/SAP/ui5-cli/releases/tag/v3.7.0). +::: info Info +Support for input source maps has been added in UI5 CLI [`v3.7.0`](https://github.com/SAP/ui5-cli/releases/tag/v3.7.0). + +::: For projects facilitating transpilation (such as TypeScript-based projects), it is commonly desired to debug in the browser using the original sources, e.g. TypeScript files. To make this work, the transpilation process first needs to create source maps and reference them in the generated JavaScript code. UI5 CLI's `minify` task will then find this reference and incorporate the source map into the minification process. In the end, the minified JavaScript resources will reference an updated source map, which reflects the transpilation as well as the minification. The browser can use this to map every statement back to the original TypeScript file, making debugging a breeze. -!!! warning - If a resource has been modified by another build task before `minify` is executed, any referenced source map will be ignored. This is to ensure the integrity of the source maps in the build result. +::: warning Warning +If a resource has been modified by another build task before `minify` is executed, any referenced source map will be ignored. This is to ensure the integrity of the source maps in the build result. + +It is possible that the modification of the resource content is not reflected in the associated source map, rendering it corrupted. A corrupt source map can make it impossible to properly analyze and debug a resource in the browser development tools. - It is possible that the modification of the resource content is not reflected in the associated source map, rendering it corrupted. A corrupt source map can make it impossible to properly analyze and debug a resource in the browser development tools. +Standard tasks which may modify resources without updating the associated source maps currently include `replaceVersion`, `replaceCopyright` and `replaceBuildtime`. - Standard tasks which may modify resources without updating the associated source maps currently include `replaceVersion`, `replaceCopyright` and `replaceBuildtime`. +::: Expand the block below to view a diagram illustrating the minification process and source map handling. -??? info "Minification Activity Diagram" - ![minify Task Activity](../images/UI5_CLI/Task_Minify.svg){ loading=lazy } +::: info Minification Activity Diagram + ![minify Task Activity](../images/UI5_CLI/Task_Minify.svg) + +::: ### Generation of Supported Locales @@ -156,7 +166,7 @@ UI5 CLI packages JavaScript files that require "top level scope" as a string, pr This ensures that the script works as expected, e.g. with regards to implicitly used globals. However, this `eval` runtime feature will be discontinued with UI5 2.x because of [security best practices](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) and to comply with stricter CSP settings (i.e. [unsafe-eval](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#unsafe_eval_expressions)). -If your project defines [Specification Version 4.0](./Configuration.md#specification-version-40) or higher, files requiring top level scope are no longer part of the created bundle and following error is logged by UI5 CLI: +If your project defines [Specification Version 4.0](./Configuration#specification-version-40) or higher, files requiring top level scope are no longer part of the created bundle and following error is logged by UI5 CLI: > Module myFancyModule requires top level scope and can only be embedded as a string (requires 'eval'), which is not supported with specVersion 4.0 and higher. If you see this error message, please adjust your code by applying one of the following options: @@ -166,17 +176,19 @@ If you see this error message, please adjust your code by applying one of the fo **Option 2**: Wrap the respective files manually in `sap.ui.define` modules as shown below: -!!! example - **Before**: - ```js - const myFancyModule = {}; - ``` +::: details Example +**Before**: +```js +const myFancyModule = {}; +``` - **After**: - ```js - sap.ui.define([], () => { - "use strict"; - const myFancyModule = {}; - return myFancyModule; - }); - ``` +**After**: +```js +sap.ui.define([], () => { + "use strict"; + const myFancyModule = {}; + return myFancyModule; +}); +``` + +::: \ No newline at end of file diff --git a/packages/documentation/docs/pages/CodeAnalysis.md b/packages/documentation/docs/pages/CodeAnalysis.md index 9f7518a6c21..a9c3abd24cd 100644 --- a/packages/documentation/docs/pages/CodeAnalysis.md +++ b/packages/documentation/docs/pages/CodeAnalysis.md @@ -88,27 +88,27 @@ The **XMLComposite** control is deprecated since version UI5 1.88. Nevertheless, The [XML Composite Analyzer](https://github.com/SAP/ui5-builder/blob/main/lib/lbt/analyzer/XMLCompositeAnalyzer.js) searches for the name of the configured fragment containing the **XMLComposite** control. -=== "Name of the XMLComposite is equal to fragment name" - - ```javascript hl_lines="4" - sap.ui.define([ - "sap/ui/core/XMLComposite" - ], function(XMLComposite) { - return XMLComposite.extend("composites.MyComposite", {} - }); - ``` - -=== "Dedicated fragment name" - - ```javascript hl_lines="5" - sap.ui.define([ - "sap/ui/core/XMLComposite" - ], function(XMLComposite) { - return XMLComposite.extend("composites.MyComposite", { - fragment: "composites.custom.MyComposite" - } - }); - ``` +#### Name of the XMLComposite is equal to fragment name + +```js +sap.ui.define([ + "sap/ui/core/XMLComposite" +], function(XMLComposite) { + return XMLComposite.extend("composites.MyComposite", {} +}); +``` + +#### Dedicated fragment name + +```js +sap.ui.define([ + "sap/ui/core/XMLComposite" +], function(XMLComposite) { + return XMLComposite.extend("composites.MyComposite", { + fragment: "composites.custom.MyComposite" + } +}); +``` ## Library Initialization @@ -128,7 +128,7 @@ Note: Currently only the usage via the global `sap.ui.getCore().initLibrary` is The UI5 CLI offers a JSDoc build, which is enhanced by UI5-specific JSDoc features. -An UI5 SDK can be built locally. To get more insight into the local UI5 SDK build setup, have a look at our [Developer's Guide](https://github.com/SAP/openui5/blob/-/docs/developing.md#building-the-openui5-sdk-demo-kit). +An UI5 SDK can be built locally. To get more insight into the local UI5 SDK build setup, have a look at our [Developer's Guide](https://github.com/SAP/openui5/blob/-/docs/developing#building-the-openui5-sdk-demo-kit). Currently, the resources needed for a UI5 SDK build are stored in [openui5](https://github.com/SAP/openui5/tree/-/lib/jsdoc) and in [ui5-builder](https://github.com/SAP/ui5-builder/blob/main/lib/processors/jsdoc). This double maintenance is needed because these files are not part of the `sap.ui.core` library artefact, so building JSDoc for any library has no access to the needed resources. It's therefore necessary to have these resources also available in the *ui5-builder*. This might change in the future. diff --git a/packages/documentation/docs/pages/Configuration.md b/packages/documentation/docs/pages/Configuration.md index 451c0446c8d..f4b38393c85 100644 --- a/packages/documentation/docs/pages/Configuration.md +++ b/packages/documentation/docs/pages/Configuration.md @@ -2,8 +2,10 @@ A projects UI5 CLI configuration is typically located in a [YAML](https://yaml.org/) file named `ui5.yaml`, located in the root directory. -!!! info - This document describes the configuration of UI5 CLI-based projects and extensions. It represents **[Specification Version 3.0](#specification-versions)**. +::: info Info +This document describes the configuration of UI5 CLI-based projects and extensions. It represents **[Specification Version 3.0](#specification-versions)**. + +::: ## Validation / IDE support @@ -11,7 +13,7 @@ Starting with [Specification Version 2.0](#specification-version-20) the configu The current version of the schema can be found here: https://ui5.github.io/cli/schema/ui5.yaml.json The schema is also part of the [JSON Schema Store Catalog](http://schemastore.org/json/) which is used by the [YAML Language Server](https://github.com/redhat-developer/yaml-language-server). -See the list of [clients](https://github.com/redhat-developer/yaml-language-server/blob/main/README.md#clients) to find extensions for various IDEs and editors. +See the list of [clients](https://github.com/redhat-developer/yaml-language-server/blob/main/README#clients) to find extensions for various IDEs and editors. ## Example @@ -29,55 +31,59 @@ A project must define a specification version (`specVersion`), to which its conf In addition, a project must define a `type`. This can be either `application`, `library`, `theme-library` (since Specification Version 1.1), or `module`. -The type defines the default path mappings and build tasks. See [UI5 Builder: Types](./Builder.md#types) for details. +The type defines the default path mappings and build tasks. See [UI5 Builder: Types](./Builder#types) for details. -!!! example +::: details Example - === "application" +#### application - ```yaml - specVersion: "4.0" - type: application - ``` +```yaml +specVersion: "4.0" +type: application +``` - === "library" +#### library - ```yaml - specVersion: "4.0" - type: library - ``` +```yaml +specVersion: "4.0" +type: library +``` - === "theme-library" +#### theme-library + +```yaml +specVersion: "4.0" +type: theme-library +``` - ```yaml - specVersion: "4.0" - type: theme-library - ``` +#### module - === "module" +```yaml +specVersion: "4.0" +type: module +``` - ```yaml - specVersion: "4.0" - type: module - ``` +::: ### Kind The configuration may also contain a `kind` property. This is used to differentiate between projects and extensions. -This configuration defaults to `kind: project`, which means you typically only need to specify it for extensions like [Custom Tasks](./extensibility//CustomTasks.md#custom-task-extension). +This configuration defaults to `kind: project`, which means you typically only need to specify it for extensions like [Custom Tasks](./extensibility//CustomTasks#custom-task-extension). ### Metadata -!!! example - ```yaml - metadata: - name: my.company.project - copyright: |- - My Project - * (c) Copyright 2009-${currentYear} My Company - * Licensed under the XYZ License, Version n - see LICENSE.txt. - ``` +::: details Example +```yaml +metadata: + name: my.company.project + copyright: |- + My Project + * (c) Copyright 2009-${currentYear} My Company + * Licensed under the XYZ License, Version n - see LICENSE.txt. +``` + +::: #### name @@ -117,81 +123,85 @@ Note that all configured paths must be written in POSIX (i.e. using only forward #### Available Path Mappings -=== "Applications" +#### Applications - `webapp`: Mapped to runtime path `/` (root) - ```yaml title="Default Configuration" - resources: - configuration: - paths: - webapp: webapp - ``` +```yaml title="Default Configuration" +resources: + configuration: + paths: + webapp: webapp +``` -=== "Libraries" +#### Libraries - `src`: Mapped to runtime path `/resources` - `test`: Mapped to runtime path `/test-resources` - ```yaml title="Default Configuration" - resources: - configuration: - paths: - src: src - test: test - ``` +```yaml title="Default Configuration" +resources: + configuration: + paths: + src: src + test: test +``` -=== "Modules" - Modules can map any virtual paths to any physical path within the project. +#### Modules +Modules can map any virtual paths to any physical path within the project. - However, it is recommended that modules include their namespace in the virtual path and use the `/resources` prefix (e.g. `/resources/my/library/module-xy/`) to avoid name clashes with other projects. +However, it is recommended that modules include their namespace in the virtual path and use the `/resources` prefix (e.g. `/resources/my/library/module-xy/`) to avoid name clashes with other projects. - ```yaml title="Example Configuration" - resources: - configuration: - paths: - /resources/my/library/module-xy/: lib - /resources/my/library/module-xy-min/: dist - ``` - -!!! example - For an application project with the following directory structure, you need the path mapping configuration given below: - - ``` hl_lines="3 4 5" title="Directory Structure" - my-app/ - \_ ui5.yaml - \_ lib/ - \_ js/ - \_ app/ - ``` - - ```yaml hl_lines="4" title="Path Mapping Configuration" - resources: - configuration: - paths: - webapp: lib/js/app - ``` +```yaml title="Example Configuration" +resources: + configuration: + paths: + /resources/my/library/module-xy/: lib + /resources/my/library/module-xy-min/: dist +``` +::: details Example +For an application project with the following directory structure, you need the path mapping configuration given below: + +``` +my-app/ +\_ ui5.yaml +\_ lib/ + \_ js/ + \_ app/ +``` + +```yaml +resources: + configuration: + paths: + webapp: lib/js/app +``` + + +::: ### Encoding of `*.properties` files -!!! info - This configuration is available since UI5 CLI [`v1.7.0`](https://github.com/SAP/ui5-cli/releases/tag/v1.7.0) +::: info Info +This configuration is available since UI5 CLI [`v1.7.0`](https://github.com/SAP/ui5-cli/releases/tag/v1.7.0) -!!! example - === "UTF-8" +::: details Example +#### UTF-8 + +```yaml +resources: + configuration: + propertiesFileSourceEncoding: UTF-8 +``` - ```yaml - resources: - configuration: - propertiesFileSourceEncoding: UTF-8 - ``` +#### ISO-8859-1 - === "ISO-8859-1" +```yaml +resources: + configuration: + propertiesFileSourceEncoding: ISO-8859-1 +``` - ```yaml - resources: - configuration: - propertiesFileSourceEncoding: ISO-8859-1 - ``` +::: By default UI5 CLI expects different encodings for `*.properties` i18n files, depending on the project's specification version: @@ -202,23 +212,25 @@ Specification Version | Default `propertiesFileSourceEncoding` If your project uses a different encoding for `*.properties` files, you need to set the `propertiesFileSourceEncoding` configuration property. -UI5 CLI will read the corresponding files of the project in the given encoding. Any non-ASCII characters will be replaced with the respective Unicode escape sequences. This allows you to deploy the resulting files to any environment, independent of how it expects `*.properties` files to be encoded. Please refer to [RFC 7](https://github.com/UI5/cli/blob/main/rfcs/0007-properties-file-encoding.md) for details. +UI5 CLI will read the corresponding files of the project in the given encoding. Any non-ASCII characters will be replaced with the respective Unicode escape sequences. This allows you to deploy the resulting files to any environment, independent of how it expects `*.properties` files to be encoded. Please refer to [RFC 7](https://github.com/UI5/cli/blob/main/rfcs/0007-properties-file-encoding) for details. ## Custom Configuration -!!! info - This configuration is available since UI5 CLI [`v2.2.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.2.0) - and applies only to projects defining [Specification Version](#specification-versions) - 2.1 or higher. +::: info +This configuration is available since UI5 CLI [`v2.2.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.2.0) +and applies only to projects defining [Specification Version](#specification-versions) +2.1 or higher. -!!! example - ```yaml - customConfiguration: - myTool: - key: value - myOtherTool: - otherKey: otherValue - ``` +::: details Example +```yaml +customConfiguration: + myTool: + key: value + myOtherTool: + otherKey: otherValue +``` + +::: Custom configuration that is ignored by UI5 CLI. This can be used to store UI5 specific configuration for third-party tools. @@ -228,10 +240,12 @@ For third-party tools it is recommended to follow a namespace-like structure. ## Framework Configuration -!!! info - This configuration is available since UI5 CLI [`v2.0.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.0.0) - and applies only to projects defining [Specification Version](#specification-versions) - 2.0 or higher. +::: info +This configuration is available since UI5 CLI [`v2.0.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.0.0) +and applies only to projects defining [Specification Version](#specification-versions) +2.0 or higher. + +::: Define your project's framework dependencies. @@ -239,21 +253,21 @@ Define your project's framework dependencies. In your project's framework configuration you must define whether you want to use the OpenUI5 or the SAPUI5 framework and which version: -=== "OpenUI5" - ```yaml - framework: - name: OpenUI5 - version: 1.82.0 - ``` +#### OpenUI5 +```yaml +framework: + name: OpenUI5 + version: 1.82.0 +``` -=== "SAPUI5" - ```yaml - framework: - name: SAPUI5 - version: 1.82.0 - ``` +#### SAPUI5 +```yaml +framework: + name: SAPUI5 + version: 1.82.0 +``` -If you are not sure which framework is right for you, see our [documentation on the differences between OpenUI5 and SAPUI5](./FAQ.md##whats-the-difference-between-openui5-and-sapui5). +If you are not sure which framework is right for you, see our [documentation on the differences between OpenUI5 and SAPUI5](./FAQ##whats-the-difference-between-openui5-and-sapui5). You can find an overview of the available versions for each framework here: @@ -262,81 +276,85 @@ You can find an overview of the available versions for each framework here: - [**SAPUI5** Version Overview](http://ui5.sap.com/versionoverview.html) - *The lowest version supported by UI5 CLI is __1.76.0__* -!!! info - Projects that use the OpenUI5 framework cannot depend on projects that use the SAPUI5 framework. +::: info +Projects that use the OpenUI5 framework cannot depend on projects that use the SAPUI5 framework. + +::: ### Dependencies -!!! example - === "application" - ```yaml - specVersion: "4.0" - type: application - metadata: - name: my.company.app - framework: - name: OpenUI5 - version: 1.82.0 - libraries: - - name: sap.ui.core - - name: sap.m - - name: sap.ui.table - - name: themelib_sap_fiori_3 - ``` - - === "library" - ```yaml - specVersion: "4.0" - type: library - metadata: - name: my.company.library - framework: - name: SAPUI5 - version: 1.82.0 - libraries: - - name: sap.ui.core - - name: sap.m - - name: themelib_sap_belize - optional: true - - name: themelib_sap_bluecrystal - optional: true - - name: themelib_sap_fiori_3 - optional: true - ``` - - When building an application depending on this library as well as one of the theme libraries, only that theme is built for this library. +::: details Example +#### application +```yaml +specVersion: "4.0" +type: application +metadata: + name: my.company.app +framework: + name: OpenUI5 + version: 1.82.0 + libraries: + - name: sap.ui.core + - name: sap.m + - name: sap.ui.table + - name: themelib_sap_fiori_3 +``` + +#### library +```yaml +specVersion: "4.0" +type: library +metadata: + name: my.company.library +framework: + name: SAPUI5 + version: 1.82.0 + libraries: + - name: sap.ui.core + - name: sap.m + - name: themelib_sap_belize + optional: true + - name: themelib_sap_bluecrystal + optional: true + - name: themelib_sap_fiori_3 + optional: true +``` + + When building an application depending on this library as well as one of the theme libraries, only that theme is built for this library. + +::: #### Runtime Dependencies All libraries required by your project must be listed in the `libraries` section of the framework configuration: -=== "OpenUI5" - ```yaml hl_lines="4-7" - framework: - name: OpenUI5 - version: 1.82.0 - libraries: - - name: sap.ui.core - - name: sap.m - - name: sap.ui.table - ``` - -=== "SAPUI5" - ```yaml hl_lines="4-7" - framework: - name: SAPUI5 - version: 1.82.0 - libraries: - - name: sap.ui.core - - name: sap.m - - name: sap.ui.comp - ``` +#### OpenUI5 +```yaml +framework: + name: OpenUI5 + version: 1.82.0 + libraries: + - name: sap.ui.core + - name: sap.m + - name: sap.ui.table +``` + +#### SAPUI5 +```yaml +framework: + name: SAPUI5 + version: 1.82.0 + libraries: + - name: sap.ui.core + - name: sap.m + - name: sap.ui.comp +``` #### Development Dependencies Development dependencies are only installed if the project defining them is the current root project. They are typically only required during the development of the project. -```yaml hl_lines="3" +```yaml libraries: - name: sap.ushell development: true @@ -348,7 +366,7 @@ Note that a development dependency cannot be optional and vice versa. Optional dependencies are installed either if the project defining them is the current root project or if the dependency is already part of the current dependency tree. A typical use case is libraries defining optional dependencies to all theme libraries they support. You can choose which theme library to use by the application that is consuming the library by declaring it as a non-optional dependency. -```yaml hl_lines="3" +```yaml libraries: - name: themelib_sap_fiori_3 optional: true @@ -357,43 +375,48 @@ You can choose which theme library to use by the application that is consuming t ## Build Configuration ### Exclude Resources -!!! example - === "application" - ```yaml - builder: - resources: - excludes: - # You can specify paths relative to the configured "webapp" directory - - "index.html" - # When defining absolute paths, make sure to specify the namespace plus the "/resources/" prefix - - "/resources/my/project/namespace/test/**" - ``` - - === "library or theme-library" - ```yaml - builder: - resources: - excludes: - # For libraries, all paths must be absolute, except for wildcards - - "/resources/some/project/name/test_results/**" - - "/test-resources/**" - - "!/test-resources/some/project/name/demo-app/**" - - "**/*.svg" - ``` - - === "module" - !!! info - For projects of type `module`, this configuration is available since UI5 CLI [`v3.5.0`](https://github.com/SAP/ui5-cli/releases/tag/v3.5.0) - and applies only to projects defining [Specification Version](#specification-versions) 3.1 or higher. - ```yaml - builder: - resources: - excludes: - # For modules, all paths must be absolute, except for wildcards - - "/resources/my/library/module-xy/min/**" - - "!/resources/my/library/module-xy/min/module-xy-bundle.js" - - "**/*.svg" - ``` +::: details Example + +#### application +```yaml +builder: + resources: + excludes: + # You can specify paths relative to the configured "webapp" directory + - "index.html" + # When defining absolute paths, make sure to specify the namespace plus the "/resources/" prefix + - "/resources/my/project/namespace/test/**" +``` + +#### library or theme-library +```yaml +builder: + resources: + excludes: + # For libraries, all paths must be absolute, except for wildcards + - "/resources/some/project/name/test_results/**" + - "/test-resources/**" + - "!/test-resources/some/project/name/demo-app/**" + - "**/*.svg" +``` + +#### module + +::: info + +For projects of type `module`, this configuration is available since UI5 CLI [`v3.5.0`](https://github.com/SAP/ui5-cli/releases/tag/v3.5.0) +and applies only to projects defining [Specification Version](#specification-versions) 3.1 or higher. + +```yaml +builder: + resources: + excludes: + # For modules, all paths must be absolute, except for wildcards + - "/resources/my/library/module-xy/min/**" + - "!/resources/my/library/module-xy/min/module-xy-bundle.js" + - "**/*.svg" +``` +::: You can exclude a projects resources from the build process using a list of glob patterns. Matching resources will be ignored by the builder and all build tasks. @@ -401,19 +424,21 @@ Patterns are applied to the **virtual resource paths** (i.e. the UI5 runtime pat ### Cachebuster -!!! example - === "time (default)" - ```yaml - builder: - cachebuster: - signatureType: time - ``` - === "hash" - ```yaml - builder: - cachebuster: - signatureType: hash - ``` +::: details Example +#### time (default) +```yaml +builder: + cachebuster: + signatureType: time +``` +#### hash +```yaml +builder: + cachebuster: + signatureType: hash +``` + +::: By default, the generated cachebuster info file signatures are based on timestamps (`time`). In setups like CI environments, a mechanism based on file hashes (`hash`) might be more reliable. Also see [PR #241](https://github.com/SAP/ui5-builder/pull/241) for more details. @@ -429,60 +454,66 @@ There are two ways to define the set of components for which preload bundles sho #### paths -!!! example - ```yaml - builder: - componentPreload: - paths: - - "my/awesome/app/**/Component.js" - ``` +::: details Example +```yaml +builder: + componentPreload: + paths: + - "my/awesome/app/**/Component.js" +``` + +::: The `paths` option takes one or multiple patterns. For every matched file a separate `Component-preload.js` will be generated. Patterns are always applied relative to the project's virtual source directory `/resources/`. #### namespaces -!!! example - ```yaml - builder: - componentPreload: - namespaces: - - "my/awesome/app" - - "my/awesome/app/componentOne" - - "my/awesome/app/componentTwo" - ``` +::: details Example +```yaml +builder: + componentPreload: + namespaces: + - "my/awesome/app" + - "my/awesome/app/componentOne" + - "my/awesome/app/componentTwo" +``` + +::: The `namespaces` option takes one or multiple component namespaces, which correspond to the directory structures. #### excludes -!!! info - This configuration is available since UI5 CLI [`v2.10.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.10.0) - and applies only to projects defining [Specification Version](#specification-versions) - 2.3 or higher. - -!!! example - === "Single Component" - - ```yaml - builder: - componentPreload: - excludes: - - "my/awesome/app/localService/**" - ``` - - === "Multiple Components" - - ```yaml - builder: - componentPreload: - namespaces: - - "my/awesome/app" - - "my/awesome/app/componentOne" - - "my/awesome/app/componentTwo" - excludes: - - "my/awesome/app/**/thirdparty/" - - "!my/awesome/app/componentTwo/thirdparty/NotExcluded.js" - ``` +::: info +This configuration is available since UI5 CLI [`v2.10.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.10.0) +and applies only to projects defining [Specification Version](#specification-versions) +2.3 or higher. + +::: details Example +#### Single Component + +```yaml +builder: + componentPreload: + excludes: + - "my/awesome/app/localService/**" +``` + +#### Multiple Components + +```yaml +builder: + componentPreload: + namespaces: + - "my/awesome/app" + - "my/awesome/app/componentOne" + - "my/awesome/app/componentTwo" + excludes: + - "my/awesome/app/**/thirdparty/" + - "!my/awesome/app/componentTwo/thirdparty/NotExcluded.js" +``` + +::: List of modules declared as glob patterns (resource name patterns) that are excluded from the component preload bundles. Similarly to the use of a single `*` or double `**` asterisk, a pattern ending with a slash `/` denotes an arbitrary number of characters or folder names. Re-includes have to be marked with a leading exclamation mark `!`. The order of filters is relevant; a later inclusion overrides an earlier exclusion, and vice versa. @@ -494,56 +525,62 @@ For projects of type `library` a `library-preload.js` bundle is generated by def #### excludes -!!! info - This configuration is available since UI5 CLI [`v2.10.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.10.0) - and applies only to projects defining [Specification Version](#specification-versions) - 2.3 or higher. - -!!! example - ```yaml - builder: - libraryPreload: - excludes: - - "my/lib/thirdparty/" - - "!my/lib/thirdparty/NotExcluded.js" - ``` +::: info +This configuration is available since UI5 CLI [`v2.10.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.10.0) +and applies only to projects defining [Specification Version](#specification-versions) +2.3 or higher. + +::: details Example +```yaml +builder: + libraryPreload: + excludes: + - "my/lib/thirdparty/" + - "!my/lib/thirdparty/NotExcluded.js" +``` +::: + List of modules declared as glob patterns (resource name patterns) that are excluded from `library-preload.js` bundle. Similarly to the use of a single `*` or double `**` asterisk, a pattern ending with a slash `/` denotes an arbitrary number of characters or folder names. Re-includes have to be marked with a leading exclamation mark `!`. The order of filters is relevant; a later inclusion overrides an earlier exclusion, and vice versa. Note that patterns are always applied relative to the project's virtual source directory `/resources/`. Re-includes must start with the library's namespace. ### Custom Tasks -!!! example - ```yaml - builder: - customTasks: - - name: custom-task-1 - beforeTask: replaceCopyright - configuration: - some-key: some value - - name: custom-task-2 - afterTask: custom-task-1 - configuration: - color: blue - ``` - -You can define custom build tasks that will be executed for the project. Please refer to the [Custom Tasks Documentation](./extensibility/CustomTasks.md) for a detailed explanation and examples of the build extensibility. +::: details Example +```yaml +builder: + customTasks: + - name: custom-task-1 + beforeTask: replaceCopyright + configuration: + some-key: some value + - name: custom-task-2 + afterTask: custom-task-1 + configuration: + color: blue +``` + +::: + +You can define custom build tasks that will be executed for the project. Please refer to the [Custom Tasks Documentation](./extensibility/CustomTasks) for a detailed explanation and examples of the build extensibility. Each `customTasks` entry must define the `name` of the custom task as defined in its `metadata.name` property. -In addition, the execution order needs to be defined by referencing a [standard task](./Builder.md#tasks) or an already configured custom task using the `afterTask` or `beforeTask` property. +In addition, the execution order needs to be defined by referencing a [standard task](./Builder#tasks) or an already configured custom task using the `afterTask` or `beforeTask` property. Optionally, arbitrary `configuration` can be passed to the custom task. ### JSDoc -!!! example - ```yaml - builder: - jsdoc: - excludes: - - "some/project/name/thirdparty/**" - ``` +::: details Example +```yaml +builder: + jsdoc: + excludes: + - "some/project/name/thirdparty/**" +``` + +::: You can exclude the resources of a project from the JSDoc build process using a list of glob patterns. Matching resources will be ignored by the JSDoc build task. @@ -553,22 +590,24 @@ These excludes are applied *before* any general builder excludes that have been ### Include Dependencies -!!! info - This configuration is available since UI5 CLI [`v2.12.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.12.0) - and applies only to projects defining [Specification Version](#specification-versions) - 2.5 or higher. - -!!! example - ```yaml - builder: - settings: - includeDependency: - - shimmed.thirdparty.library - includeDependencyRegExp: - - ^com\.namespace - includeDependencyTree: - - sap.m - ``` +::: info +This configuration is available since UI5 CLI [`v2.12.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.12.0) +and applies only to projects defining [Specification Version](#specification-versions) +2.5 or higher. + +::: details Example +```yaml +builder: + settings: + includeDependency: + - shimmed.thirdparty.library + includeDependencyRegExp: + - ^com\.namespace + includeDependencyTree: + - sap.m +``` + +::: You can include certain dependencies into the build process using the `includeDependency` builder setting. By using `includeDependencyRegExp`, a regular expression can be used, for example to specify a namespace to dynamically select a group of dependencies that have to be included into the build result. By using `includeDependencyTree`, a selected dependency including all of its sub-dependencies is used. @@ -582,29 +621,33 @@ The project's `ui5.yaml` file can contain a list of modules declared as glob pat Note that patterns are always applied relative to the project's virtual source directory `/resources/`. -!!! info - This configuration is available since UI5 CLI [`v2.14.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.14.0) - and applies only to projects defining [Specification Version](#specification-versions) - 2.6 or higher. +::: info +This configuration is available since UI5 CLI [`v2.14.0`](https://github.com/SAP/ui5-cli/releases/tag/v2.14.0) +and applies only to projects defining [Specification Version](#specification-versions) +2.6 or higher. -!!! example - ```yaml - builder: - minification: - excludes: - - "my/lib/thirdparty/" - - "!my/lib/thirdparty/NotExcluded.js" - ``` +::: details Example +```yaml +builder: + minification: + excludes: + - "my/lib/thirdparty/" + - "!my/lib/thirdparty/NotExcluded.js" +``` + +::: ## Server Configuration -!!! example - ```yaml - server: - settings: - httpPort: 1337 - httpsPort: 1443 - ``` +::: details Example +```yaml +server: + settings: + httpPort: 1337 + httpsPort: 1443 +``` + +::: By default, UI5 CLI will serve applications using Port `8080`. When running in HTTP/2 or HTTPS mode, Port `8443` will be used. @@ -616,30 +659,32 @@ The default and configured server ports can always be overwritten with the CLI p ## Extension Configuration -!!! example - ```yaml - specVersion: "4.0" - type: application - metadata: - name: my.application - --- - specVersion: "4.0" - kind: extension - type: project-shim - metadata: - name: my.application.thirdparty - shims: - configurations: - lodash: - specVersion: "4.0" - type: module - metadata: - name: lodash - resources: - configuration: - paths: - /resources/my/application/thirdparty/: "" - ``` +::: details Example +```yaml +specVersion: "4.0" +type: application +metadata: + name: my.application +--- +specVersion: "4.0" +kind: extension +type: project-shim +metadata: + name: my.application.thirdparty +shims: + configurations: + lodash: + specVersion: "4.0" + type: module + metadata: + name: lodash + resources: + configuration: + paths: + /resources/my/application/thirdparty/: "" +``` + +::: Extensions configuration can be added to any projects `ui5.yaml`. For better readability, it should to be located *after* the projects configuration, separated by [three dashes](https://yaml.org/spec/1.2/spec.html#id2760395) "`---`". @@ -648,41 +693,43 @@ In cases where an extension shall be reused across multiple projects you can mak Extensions can be identified by the `kind: extension` configuration. Note that if no `kind` configuration is given, [`project`](#project-configuration) is assumed. ### Available Extensions -- [Custom Tasks](./extensibility/CustomTasks.md) -- [Custom Server Middleware](./extensibility/CustomServerMiddleware.md) -- [Project Shims](./extensibility/ProjectShims.md) +- [Custom Tasks](./extensibility/CustomTasks) +- [Custom Server Middleware](./extensibility/CustomServerMiddleware) +- [Project Shims](./extensibility/ProjectShims) ## Custom Bundling -!!! example - ```yaml - builder: - bundles: - - bundleDefinition: - name: "sap-ui-custom.js" - sections: - - mode: raw - filters: - - ui5loader-autoconfig.js - resolve: true - sort: true - bundleOptions: - optimize: true - - bundleDefinition: - name: "app.js" - sections: - - mode: preload - filters: - - some/app/Component.js - resolve: true - sort: true - - mode: provided - filters: - - ui5loader-autoconfig.js - resolve: true - bundleOptions: - optimize: true - ``` +::: details Example +```yaml +builder: + bundles: + - bundleDefinition: + name: "sap-ui-custom.js" + sections: + - mode: raw + filters: + - ui5loader-autoconfig.js + resolve: true + sort: true + bundleOptions: + optimize: true + - bundleDefinition: + name: "app.js" + sections: + - mode: preload + filters: + - some/app/Component.js + resolve: true + sort: true + - mode: provided + filters: + - ui5loader-autoconfig.js + resolve: true + bundleOptions: + optimize: true +``` + +::: Custom bundles can be defined in the `ui5.yaml`. Within the `builder/bundles` configuration a list of `bundleDefinitions` can be described. @@ -759,11 +806,11 @@ Version | UI5 CLI Release **Breaking changes:** - Removed bundle option [`usePredefineCalls`](#properties). UI5 CLI v4.0.0 and above will always use predefine calls in bundles, making this option obsolete. -- Adds new a new option `async` for `bundleDefinition`-section configuration, see [Configuration: `bundleDefinition.sections`](../pages/Configuration.md#properties) for details. +- Adds new a new option `async` for `bundleDefinition`-section configuration, see [Configuration: `bundleDefinition.sections`](./Configuration#properties) for details. Specification Version 4.0 projects are supported by [UI5 CLI](https://github.com/SAP/ui5-cli) v4.0.0 and above. -Also see [Migrate to v4](../updates/migrate-v4.md#changes-for-projects) for details on these breaking changes. +Also see [Migrate to v4](../updates/migrate-v4#changes-for-projects) for details on these breaking changes. ### Specification Version 3.2 @@ -830,7 +877,7 @@ Specification Version 2.3 projects are supported by [UI5 CLI](https://github.com **Features:** -- Custom task extensions can make use of the [`TaskUtil` Helper Class](./extensibility/CustomTasks.md#helper-class-taskutil) +- Custom task extensions can make use of the [`TaskUtil` Helper Class](./extensibility/CustomTasks#helper-class-taskutil) Specification Version 2.2 projects are supported by [UI5 CLI](https://github.com/SAP/ui5-cli) v2.4.0 and above. @@ -839,7 +886,7 @@ Specification Version 2.2 projects are supported by [UI5 CLI](https://github.com **Features:** - Adds support for the ["customConfiguration"](#custom-configuration) configuration -- Custom middleware extensions can make use of the [`MiddlewareUtil` Helper Class](./extensibility/CustomServerMiddleware.md#helper-class-middlewareutil) +- Custom middleware extensions can make use of the [`MiddlewareUtil` Helper Class](./extensibility/CustomServerMiddleware#helper-class-middlewareutil) Specification Version 2.1 projects are supported by [UI5 CLI](https://github.com/SAP/ui5-cli) v2.2.0 and above. diff --git a/packages/documentation/docs/pages/ESSupport.md b/packages/documentation/docs/pages/ESSupport.md index b7ac05687a1..bf1c12f2db8 100644 --- a/packages/documentation/docs/pages/ESSupport.md +++ b/packages/documentation/docs/pages/ESSupport.md @@ -9,7 +9,7 @@ UI5 CLI offers general support for `ES2023` ECMAScript features. While a `ui5 bu | 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 CLI check out [Code Analysis](./CodeAnalysis.md). +The following section describes all restrictions grouped by the kind of ECMAScript language feature. To get more insights into the code analyzing executed by UI5 CLI check out [Code Analysis](./CodeAnalysis). ## Language Features with Restrictions @@ -21,24 +21,24 @@ In general, UI5 CLI only analyzes **JavaScript** files of type `script`. [JavaSc UI5 CLI and the UI5 Runtime does not support the usage of `export` and `import` of JavaScript Modules. Therefore, `sap.ui.define` has to be used. -=== "Supported" +#### Supported - ```javascript - sap.ui.define([ - "ModuleA", - "ModuleB" - ], function(ModuleA, ModuleB) { - return ModuleA.extend("ModuleC", {}); - }); - ``` +```js +sap.ui.define([ + "ModuleA", + "ModuleB" +], function(ModuleA, ModuleB) { + return ModuleA.extend("ModuleC", {}); +}); +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="1 2 3" - import ModuleA from "ModuleA"; - import ModuleB from "ModuleB"; - export default class ModuleC extends ModuleA {}; - ``` +```js +import ModuleA from "ModuleA"; +import ModuleB from "ModuleB"; +export default class ModuleC extends ModuleA {}; +``` ### Template Literal @@ -48,26 +48,26 @@ UI5 CLI and the UI5 Runtime does not support the usage of `export` and `import` Template Literals with one or more expressions inside a `sap.ui.define` or `sap.ui.require` call are not supported. -=== "Supported" +#### Supported - ```javascript - sap.ui.define([ - `ModuleA`, - `ModuleB` - ], function(ModuleA, ModuleB) { - }); - ``` +```js +sap.ui.define([ + `ModuleA`, + `ModuleB` +], function(ModuleA, ModuleB) { +}); +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="4" - const i = `B`; - sap.ui.define([ - `ModuleA`, - `Module${i}` - ], function(ModuleA, ModuleB) { - }); - ``` +```js +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`. @@ -75,50 +75,50 @@ The same rule applies also for the usage of deprecated or no longer recommended When declaring a **Smart Template** using a **Template Literal** with one or more expressions in the name of the **Smart Template** is not supported. -=== "Supported" - - ```javascript - 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` - } +#### Supported + +```js +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` } - ); - }); - ``` - -=== "Not Supported" - - ```javascript hl_lines="6" - 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` - } + } + ); +}); +``` + +#### Not Supported + +```js +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 @@ -126,47 +126,47 @@ The **XMLComposite** control is deprecated since version UI5 1.88. Nevertheless Declaring an **XMLComposite** control using a **Template Literal** with one or more expressions in the name, is not supported. -=== "Supported" +#### Supported - ```javascript - sap.ui.define([ - `sap/ui/core/XMLComposite` - ], function(XMLComposite) { - return XMLComposite.extend(`composites.MyComposite`, {} - }); - ``` +```js +sap.ui.define([ + `sap/ui/core/XMLComposite` +], function(XMLComposite) { + return XMLComposite.extend(`composites.MyComposite`, {} +}); +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="5" - sap.ui.define([ - `sap/ui/core/XMLComposite` - ], function(XMLComposite) { - const name = `MyComposite`; - return XMLComposite.extend(`composites.${name}`, {}); - }); - ``` +```js +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. -=== "Supported" +#### Supported - ```javascript - sap.ui.getCore().initLibrary({ - name: `my.lib` - }); - ``` +```js +sap.ui.getCore().initLibrary({ + name: `my.lib` +}); +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="3" - const libraryName = `lib`; - sap.ui.getCore().initLibrary({ - name: `my.${libraryName}` - }); - ``` +```js +const libraryName = `lib`; +sap.ui.getCore().initLibrary({ + name: `my.${libraryName}` +}); +``` #### Reserved Variable Names in a Template Literal @@ -177,19 +177,19 @@ While UI5 CLI performs a build placeholders are replaced with a values offered b - `buildtime` - `copyright` -=== "Supported" +#### Supported - ```javascript - const myVersion = `1.2`; - const transformedVersion `v${myVersion}` - ``` +```js +const myVersion = `1.2`; +const transformedVersion `v${myVersion}` +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="3" - const version = `1.2`; - const transformedVersion `v${version}` - ``` +```js +const version = `1.2`; +const transformedVersion `v${version}` +``` UI5 CLI searches for the exact match of `${version}`, so with adding whitespaces before and after the variable name `${ version }` UI5 CLI won't replace this occurence. This can be enforced by the dedicated ESLint config [template-curly-spacing](https://eslint.org/docs/latest/rules/template-curly-spacing) with option `always`. @@ -201,25 +201,25 @@ A [Spread Element](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer A **Spread Element** as a parameter in a `sap.ui.define` or `sap.ui.require` call is not supported. -=== "Supported" +#### Supported - ```javascript - sap.ui.define([ - "ModuleA", - "ModuleB" - ], function(ModuleA, ModuleB) { - }); - ``` +```js +sap.ui.define([ + "ModuleA", + "ModuleB" +], function(ModuleA, ModuleB) { +}); +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="3" - const dependencies = ["ModuleA", "ModuleB"]; - sap.ui.define([ - ...dependencies - ], function(ModuleA, ModuleB) { - }); - ``` +```js +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`. @@ -227,52 +227,52 @@ The same rule applies also for the usage of deprecated or no longer recommended When declaring a **Smart Template**, the usage of a **Spread Element** in the configuration is not supported. -=== "Supported" - - ```javascript - 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" - } - } - ); - }); - ``` - -=== "Not Supported" - - ```javascript hl_lines="6" - 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 +#### Supported + +```js +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" + }, + manifest: "json + } + } + ); +}); +``` + +#### Not Supported + +```js +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 @@ -280,55 +280,55 @@ The **XMLComposite** control is deprecated since version UI5 1.88. Nevertheless When declaring an **XMLComposite**, the usage of a **Spread Element** in the configuration is not supported. -=== "Supported" - - ```javascript - sap.ui.define([ - "sap/ui/core/XMLComposite" - ], function(XMLComposite) { - return XMLComposite.extend("composites.MyComposite", { +#### Supported + +```js +sap.ui.define([ + "sap/ui/core/XMLComposite" +], function(XMLComposite) { + return XMLComposite.extend("composites.MyComposite", { + fragment: "composites.custom.MyComposite" + } +}); +``` + +#### Not Supported + +```js +sap.ui.define([ + "sap/ui/core/XMLComposite" +], function(XMLComposite) { + const myXMLComposite = { fragment: "composites.custom.MyComposite" - } - }); - ``` - -=== "Not Supported" - - ```javascript hl_lines="5" - sap.ui.define([ - "sap/ui/core/XMLComposite" - ], function(XMLComposite) { - const myXMLComposite = { - fragment: "composites.custom.MyComposite" - }; - return XMLComposite.extend(`composites.MyComposite`, { - ...myXMLComposite - }); + }; + 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**. -=== "Supported" +#### Supported - ```javascript - sap.ui.getCore().initLibrary({ - name: "my.lib" - }); - ``` +```js +sap.ui.getCore().initLibrary({ + name: "my.lib" +}); +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="5" - const mylib = { - name: "my.lib" - }; - sap.ui.getCore().initLibrary({ - ...mylib - }); - ``` +```js +const mylib = { + name: "my.lib" +}; +sap.ui.getCore().initLibrary({ + ...mylib +}); +``` ### Object Expression @@ -338,25 +338,25 @@ An **Object Expression** can be used in all places except in following places. An **Object Expression** as a parameter in a `sap.ui.define` or `sap.ui.require` call is not supported. -=== "Supported" +#### Supported - ```javascript - sap.ui.define([ - "Bar" - ], function(Bar){ - }); +```js +sap.ui.define([ + "Bar" +], function(Bar){ +}); - ``` +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="3" - const dependency = "Bar"; - sap.ui.define([ - dependency - ], function(Bar){ - }); - ``` +```js +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`. @@ -364,50 +364,50 @@ The same rule applies also for the usage of deprecated or no longer recommended When declaring a **Smart Template**, the usage of an **Object Expression** in the configuration is not supported. -=== "Supported" - - ```javascript - 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" - } +#### Supported + +```js +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" } - ); - }); - ``` - -=== "Not Supported" - - ```javascript hl_lines="9" - 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" - } + } + ); +}); +``` + +#### Not Supported + +```js +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" } + manifest: "json" } - ); - }); - ``` + } + ); +}); +``` #### Object Expression in XMLComposite Declaration @@ -415,51 +415,51 @@ The **XMLComposite** control is deprecated since version UI5 1.88. Nevertheless When declaring an **XMLComposite**, the usage of an **Object Expression** in the configuration is not supported. -=== "Supported" - - ```javascript - sap.ui.define([ - "sap/ui/core/XMLComposite" - ], function(XMLComposite) { - return XMLComposite.extend("composites.MyComposite", { - fragment: "composites.custom.MyComposite" - } - }); - ``` - -=== "Not Supported" - - ```javascript hl_lines="6" - sap.ui.define([ - "sap/ui/core/XMLComposite" - ], function(XMLComposite) { - const key = "fragment"; - return XMLComposite.extend("composites.MyComposite", { - [key]: "composites.custom.MyComposite" - }); +#### Supported + +```js +sap.ui.define([ + "sap/ui/core/XMLComposite" +], function(XMLComposite) { + return XMLComposite.extend("composites.MyComposite", { + fragment: "composites.custom.MyComposite" + } +}); +``` + +#### Not Supported + +```js +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**. -=== "Supported" +#### Supported - ```javascript - sap.ui.getCore().initLibrary({ - name: "my.lib" - }); - ``` +```js +sap.ui.getCore().initLibrary({ + name: "my.lib" +}); +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="3" - const key = "name"; - sap.ui.getCore().initLibrary({ - [key]: "my.lib" - }); - ``` +```js +const key = "name"; +sap.ui.getCore().initLibrary({ + [key]: "my.lib" +}); +``` ### Computed Property @@ -469,112 +469,112 @@ A **Computed Property** can be used in all places except in following places. One or more **Computed Property** as a parameter in an UI5 Module `extend` call is not supported. -=== "Supported" +#### Supported - ```javascript - sap.ui.define([ - "Bar" - ], function(Bar){ - return Bar.extend("my.Bar" {}); - }); +```js +sap.ui.define([ + "Bar" +], function(Bar){ + return Bar.extend("my.Bar" {}); +}); - ``` +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="3" - const name = "my"; - sap.ui.define([ - "Bar" - ], function(Bar){ - return Bar.extend(name + ".Bar", {}); - }); - ``` +```js +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**. -=== "Supported" +#### Supported - ```javascript - sap.ui.getCore().initLibrary({ - name: "my.lib" - }); - ``` +```js +sap.ui.getCore().initLibrary({ + name: "my.lib" +}); +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="3" - const name = "my"; - sap.ui.getCore().initLibrary({ - name: name + ".lib" - }); - ``` +```js +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. -=== "Supported" - - ```javascript - sap.ui.define([ - "Bar" - ], function(Bar){ - /** - * JSDoc block here - */ - class Foo extends Bar { - make () {} - } - - return Foo; - }); - ``` - -=== "Not Supported" - - ```javascript hl_lines="7" - sap.ui.define([ - "Bar" - ], function(Bar){ - /** - * JSDoc block here - */ - return class Foo extends Bar { - make () {} - } - }); - ``` - -### Arrow Function Expression +#### Supported -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. - -=== "Supported" - - ```javascript - sap.ui.define([ - "Bar" - ], +```js +sap.ui.define([ + "Bar" +], function(Bar){ /** * JSDoc block here */ - (Bar) => Bar.extends("Foo", { + class Foo extends Bar { + make () {} + } - })); - ``` + return Foo; +}); +``` -=== "Not Supported" +#### Not Supported - ```javascript hl_lines="1 2 3" +```js +sap.ui.define([ + "Bar" +], function(Bar){ /** * JSDoc block here */ - sap.ui.define([ - "Bar" - ], (Bar) => Bar.extends("Foo", { + 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. + +#### Supported + +```js +sap.ui.define([ + "Bar" +], +/** + * JSDoc block here + */ +(Bar) => Bar.extends("Foo", { + +})); +``` + +#### Not Supported + +```js +/** + * JSDoc block here + */ +sap.ui.define([ + "Bar" +], (Bar) => Bar.extends("Foo", { - })); - ``` +})); +``` diff --git a/packages/documentation/docs/pages/FAQ.md b/packages/documentation/docs/pages/FAQ.md index 97d4154214d..0e875114880 100644 --- a/packages/documentation/docs/pages/FAQ.md +++ b/packages/documentation/docs/pages/FAQ.md @@ -1,9 +1,9 @@ # FAQ ### How Can I Contribute? -Please check our [Contribution Guidelines](https://github.com/UI5/cli/blob/main/CONTRIBUTING.md). +Please check our [Contribution Guidelines](https://github.com/UI5/cli/blob/main/CONTRIBUTING). ### How Can I Obtain Support? -Please follow our [Contribution Guidelines](https://github.com/UI5/cli/blob/main/CONTRIBUTING.md#report-an-issue) on how to report an issue. +Please follow our [Contribution Guidelines](https://github.com/UI5/cli/blob/main/CONTRIBUTING#report-an-issue) on how to report an issue. ### What's the Difference Between OpenUI5 and SAPUI5? The open source project [OpenUI5](https://openui5.org/) provides most of the fundamental framework features. [SAPUI5](https://ui5.sap.com/) enhances this by providing **additional libraries** under a **different license**. diff --git a/packages/documentation/docs/pages/FileSystem.md b/packages/documentation/docs/pages/FileSystem.md index 6ddb8ec8f14..fa4a2f4f4b9 100644 --- a/packages/documentation/docs/pages/FileSystem.md +++ b/packages/documentation/docs/pages/FileSystem.md @@ -2,7 +2,11 @@ The [UI5 FS](https://github.com/SAP/ui5-fs) provides a UI5-specific file system abstraction. -[**API Reference**](https://ui5.github.io/cli/v4/api/){: .md-button .sap-icon-initiative } + ## Overview diff --git a/packages/documentation/docs/pages/GettingStarted.md b/packages/documentation/docs/pages/GettingStarted.md index c7187ef4c3d..3b73b17beb2 100644 --- a/packages/documentation/docs/pages/GettingStarted.md +++ b/packages/documentation/docs/pages/GettingStarted.md @@ -16,7 +16,7 @@ npm install --save-dev @ui5/cli ui5 --help ``` -The globally installed UI5 CLI will always try to invoke a locally installed version of the UI5 CLI (if present). This way you can use different versions of the UI5 CLI across your projects. Please see the [UI5 CLI documentation](./CLI.md#local-vs-global-installation) for details. +The globally installed UI5 CLI will always try to invoke a locally installed version of the UI5 CLI (if present). This way you can use different versions of the UI5 CLI across your projects. Please see the [UI5 CLI documentation](./CLI#local-vs-global-installation) for details. ## ⚡️ Quick Start: OpenUI5 Sample App Check out the [OpenUI5 Sample App](https://github.com/SAP/openui5-sample-app) featuring a full blown [How-to](https://github.com/SAP/openui5-sample-app/#openui5-sample-app) to play around with UI5 CLI! @@ -39,62 +39,62 @@ This file (with some exceptions) is required for all projects and their dependen If your project is not set up for use with the UI5 CLI yet, follow these steps: 1. If your project does not have a `package.json` file, let npm generate it: - ```sh - npm init --yes - ``` +```sh +npm init --yes +``` 1. Generate the `ui5.yaml` file: - ```sh - ui5 init - ``` +```sh +ui5 init +``` 1. Define the framework you want to use +::: info +**"OpenUI5"** - === "OpenUI5" +```sh +ui5 use openui5@latest +``` - ```sh - ui5 use openui5@latest - ``` +**"SAPUI5"** - === "SAPUI5" +```sh +ui5 use sapui5@latest +``` +::: +You can choose between the OpenUI5 and the SAPUI5 framework. - ```sh - ui5 use sapui5@latest - ``` +Don't know which one to choose? Check out our [documentation on the differences between OpenUI5 and SAPUI5](./FAQ##whats-the-difference-between-openui5-and-sapui5). - You can choose between the OpenUI5 and the SAPUI5 framework. +1. Add required libraries +```sh +ui5 add sap.ui.core sap.m sap.ui.table themelib_sap_fiori_3 # [...] +``` - Don't know which one to choose? Check out our [documentation on the differences between OpenUI5 and SAPUI5](./FAQ.md##whats-the-difference-between-openui5-and-sapui5). +You can find a documentation of all libraries, including samples and more, in the Demo Kit: -1. Add required libraries - ```sh - ui5 add sap.ui.core sap.m sap.ui.table themelib_sap_fiori_3 # [...] - ``` - - You can find a documentation of all libraries, including samples and more, in the Demo Kit: - - - [**OpenUI5** Demo Kit](https://openui5.hana.ondemand.com/api) - - [**SAPUI5** Demo Kit](https://ui5.sap.com/#/api) +- [**OpenUI5** Demo Kit](https://openui5.hana.ondemand.com/api) +- [**SAPUI5** Demo Kit](https://ui5.sap.com/#/api) 1. Start the server and work on your project! 🎉 - ```sh - ui5 serve - ``` +```sh +ui5 serve +``` - !!! tip - Use `ui5 serve` to start a local development server and `ui5 build --all` to produce an optimized, static version of your project, which you can then deploy to your production environment. +::: info +Use `ui5 serve` to start a local development server and `ui5 build --all` to produce an optimized, static version of your project, which you can then deploy to your production environment. + ::: - Find more information here: +Find more information here: - - [Server](./Server.md) - - [Builder](./Builder.md) - - [CLI](./CLI.md) +- [Server](./Server.md) +- [Builder](./Builder.md) +- [CLI](./CLI.md) 1. If you are using Git or similar version control, commit `package.json` and `ui5.yaml` to your repository. - ```sh - git add package.json ui5.yaml - git commit -m "Enable use with UI5 CLI" - ``` +```sh +git add package.json ui5.yaml +git commit -m "Enable use with UI5 CLI" +``` -**Hooray! You can now use UI5 CLI in your project!** -{: .sap-icon-ui5-after } +**🎉 Hooray! You can now use UI5 CLI in your project! 🎉** diff --git a/packages/documentation/docs/pages/Guidelines.md b/packages/documentation/docs/pages/Guidelines.md new file mode 100644 index 00000000000..9739695c094 --- /dev/null +++ b/packages/documentation/docs/pages/Guidelines.md @@ -0,0 +1,60 @@ +# Development Conventions and Guidelines +## JavaScript Coding Guidelines +We enforce code style rules using [ESLint](https://eslint.org). Execute `npm run lint` to check your code for style issues. +You may also find an ESLint integration for your favorite IDE [here](https://eslint.org/docs/user-guide/integrations). + +## Testing +Unit testing is based on the [ava](https://github.com/avajs/ava) test-framework. You can run all tests using `npm test` (this is what our CI will do for all pull requests). + +During development, you might want to use `npm run unit` or `npm run unit-watch` (re-runs tests automatically after file changes) to quickly execute all unit tests and see whether your change just broke one of them. 😉 + +## Git Guidelines +### No Merge Commits +Please use [rebase instead of merge](https://www.atlassian.com/git/tutorials/merging-vs-rebasing) to update a branch to the latest main. This helps keeping a clean commit history in the project. + +### Commit Message Style +#### Commit Summary +The commit summary is the first line of the commit message. + +- It should be **50-70 characters** long. +- It must be **prefixed** by `[FIX]`, `[FEATURE]` or `[INTERNAL]` accordingly, followed by the name of the component or module which was the main subject of the change. + + Use `[FIX]` for bugfixes. + + Use `[FEATURE]` for new features / enhancements. + + Use `[BREAKING]` for breaking / incompatible changes. + _**Note:** The commit body of a breaking change should also include a paragraph starting with `BREAKING CHANGE:`. + This paragraph will be highlighted in the changelog._ + + Use `[DEPENDENCY]` for dependency updates that should be mentioned in the changelog. + + Use `[INTERNAL]` for all other changes (e.g. refactorings, documentation, etc.). These changes will not be listed in the changelog. + + Exceptions are changes created by automated processes like releases or dependency updates +- It must not contain `[` or `]` anywhere but in the prefix. +- It shall be written in **imperative present tense** (as recommended by [Git](https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project)) + + Examples: Instead of *"Adding tests for"* or *"I added tests for"* use *"Add tests for"* or *"Add feature xy"*. + +#### Commit Body +After the commit summary there should be an empty line followed by the commit body. + +- Describe the intention and reasoning of the change +- If a change fixes an issue reported on GitHub, add the following line to the commit message: + + `Fixes: #` (e.g. `Fixes: #42`) +- Breaking changes should include a paragraph starting with `BREAKING CHANGE:`. This paragraph will be highlighted in the changelog. + +#### Example +``` +[FIX] npm translator: Correct handling of devDependencies + +- devDevependencies should only be included in certain cases +- Was caused by a refactoring + +Fixes: #42 +Fixes: #45 +``` + +## Work on Release Branches +Major releases are typically prepared on dedicated branches like `next`. + +There are some things to be aware of when working on these branches. + +### Implementing Changes in Multiple Code Lines +While working on a new major release (e.g. `5.0.0`), any fixes or new features implemented on the **current** (main) code line (e.g. 4.x) should be cherry-picked as `[INTERNAL]` to the dedicated (pre-)release branch (typically `next`). This is to prevent changes declared as `[FEATURE]` or `[FIX]` from appearing in the changelog twice, which can be confusing since the new major version has not yet been released and should naturally contain any fixes or features released in any of the preceding releases. Listing them twice might confuse users. Note that our changelog is generated based on all tags of the repository, independent of the currently checked out branch (also see [git-chglog/issues/123](https://github.com/git-chglog/git-chglog/issues/123)). + +However, once a new major release becomes **current** (i.e. "main", not a pre-release), any changes applied to multiple code lines should be cherry picked with the original prefix, so that they appear for multiple versions in the changelog. diff --git a/packages/documentation/docs/pages/OpenUI5.md b/packages/documentation/docs/pages/OpenUI5.md index d471e4560d6..032096f0382 100644 --- a/packages/documentation/docs/pages/OpenUI5.md +++ b/packages/documentation/docs/pages/OpenUI5.md @@ -1,25 +1,29 @@ # Consuming OpenUI5 Libraries -OpenUI5 consumption with UI5 CLI is very similar to SAPUI5 consumption. Please refer to the documentation on [Consuming SAPUI5 Libraries](./SAPUI5.md) for a general description of how UI5 CLI can fetch and provide framework dependencies to your project. +OpenUI5 consumption with UI5 CLI is very similar to SAPUI5 consumption. Please refer to the documentation on [Consuming SAPUI5 Libraries](./SAPUI5) for a general description of how UI5 CLI can fetch and provide framework dependencies to your project. Note that projects using the SAPUI5 framework can depend on projects using the OpenUI5 framework. However, OpenUI5 projects can't depend on SAPUI5 projects. -Please also refer to our documentation on the [differences between OpenUI5 and SAPUI5](./FAQ.md#whats-the-difference-between-openui5-and-sapui5). +Please also refer to our documentation on the [differences between OpenUI5 and SAPUI5](./FAQ#whats-the-difference-between-openui5-and-sapui5). -!!! info - The minimum OpenUI5 version that can be consumed by UI5 CLI is **1.52.5** +::: info +The minimum OpenUI5 version that can be consumed by UI5 CLI is **1.52.5** + +::: ## Configuration Your project's `ui5.yaml` provides a configuration section dedicated to framework dependency handling. This configuration can be maintained by editing the file, or by using the UI5 CLI: -!!! example - Using the [UI5 CLI](./CLI.md): - ```sh - ui5 use openui5@latest - ui5 add sap.ui.core sap.m sap.ui.table themelib_sap_fiori_3 - ``` +::: details Example +Using the [UI5 CLI](./CLI): +```sh +ui5 use openui5@latest +ui5 add sap.ui.core sap.m sap.ui.table themelib_sap_fiori_3 +``` + +::: **Example ui5.yaml of an application** ```yaml @@ -56,9 +60,9 @@ framework: optional: true ``` -Please make sure that your project defines [Specification Version 2.0](./Configuration.md#specification-version-20) or higher. +Please make sure that your project defines [Specification Version 2.0](./Configuration#specification-version-20) or higher. -For details, please see the corresponding [framework configuration documentation](./Configuration.md#framework-configuration). +For details, please see the corresponding [framework configuration documentation](./Configuration#framework-configuration). ## Linking Framework Dependencies When working on UI5 applications or libraries that use OpenUI5, you can link a local OpenUI5 repository into that project. This allows you to make changes to the project itself as well as to the OpenUI5 libraries simultaneously and test them immediately. @@ -66,4 +70,4 @@ When working on UI5 applications or libraries that use OpenUI5, you can link a l A detailed step-by-step guide on how to achieve such a setup with the OpenUI5 Sample App can be found [here](https://github.com/SAP/openui5-sample-app#working-with-local-dependencies). ## OpenUI5 Framework Development -Please refer to the [OpenUI5 Framework Development Documentation](https://github.com/SAP/openui5/blob/-/docs/developing.md#developing-ui5). +Please refer to the [OpenUI5 Framework Development Documentation](https://github.com/SAP/openui5/blob/-/docs/developing#developing-ui5). diff --git a/packages/documentation/docs/pages/Overview.md b/packages/documentation/docs/pages/Overview.md index 78adbe1dfbe..9fdf2fd0b68 100644 --- a/packages/documentation/docs/pages/Overview.md +++ b/packages/documentation/docs/pages/Overview.md @@ -9,10 +9,10 @@ UI5 CLI differentiates between "framework dependencies" and "project dependencie **Framework dependencies** are generally libraries and themes provided by the SAP frameworks "OpenUI5" and "SAPUI5". UI5 CLI will take care of downloading them and handling their versions for you. Please see the corresponding documentation on both options: -* [Working with **OpenUI5** Framework Dependencies](./OpenUI5.md) -* [Working with **SAPUI5** Framework Dependencies](./SAPUI5.md) +* [Working with **OpenUI5** Framework Dependencies](./OpenUI5) +* [Working with **SAPUI5** Framework Dependencies](./SAPUI5) -**Project dependencies** are all other libraries, custom themes, UI5 CLI extensions or JavaScript modules your project depends on. In general these dependencies are maintained in the package.json of your project. See also: [FAQ: Why package.json? / Why npm?](./FAQ.md#why-packagejson-why-npm). +**Project dependencies** are all other libraries, custom themes, UI5 CLI extensions or JavaScript modules your project depends on. In general these dependencies are maintained in the package.json of your project. See also: [FAQ: Why package.json? / Why npm?](./FAQ#why-packagejson-why-npm). ## Linking Projects Would you like to work on an application project and one or more of its dependencies at the same time? We got you covered! @@ -20,7 +20,7 @@ Would you like to work on an application project and one or more of its dependen ### UI5 Workspaces The recommended approach for setting up a development environment where simultaneous work on multiple UI5 projects is required. -Head over to the [UI5 Workspaces](./Workspace.md) documentation for the details. Below is an example based on a simple scenario with an application and a reuse library project: +Head over to the [UI5 Workspaces](./Workspace) documentation for the details. Below is an example based on a simple scenario with an application and a reuse library project: **Example: Your Directory Structure** ``` @@ -54,7 +54,7 @@ That's it! Start a server via `ui5 serve`, and you will see that any changes you ## Package Managers -By leaving dependency management up to the tool of your choice (see [FAQ: Why package.json? / Why npm?](./FAQ.md#why-packagejson-why-npm)) you have a variety of other options for linking dependencies into your project. +By leaving dependency management up to the tool of your choice (see [FAQ: Why package.json? / Why npm?](./FAQ#why-packagejson-why-npm)) you have a variety of other options for linking dependencies into your project. Here is an example using the [npm CLI](https://www.npmjs.com/get-npm) in Version 8, an application, and a reuse library project: @@ -94,7 +94,7 @@ That's it. You can check whether the linking worked by executing `ui5 tree` in t As an alternative to defining your project dependencies in the `package.json`, you can define a static dependency hierarchy for the project in a YAML file. This is typically only advised in special cases where none of the other concepts work. -To use such a file in UI5 CLI, provide a path to it using the [`--dependency-definition`](./CLI.md#common-options) parameter. Note that all `package.json` dependencies will be ignored (including UI5 CLI extensions), but UI5 framework dependencies defined in `ui5.yaml` will still be used. +To use such a file in UI5 CLI, provide a path to it using the [`--dependency-definition`](./CLI#common-options) parameter. Note that all `package.json` dependencies will be ignored (including UI5 CLI extensions), but UI5 framework dependencies defined in `ui5.yaml` will still be used. **Example: `projectDependencies.yaml`** @@ -119,9 +119,9 @@ The UI5 CLI contains a web server to serve the project via HTTP/2 protocol. ui5 serve --h2 ``` -This requires an SSL certificate. You are guided through the automatic generation process. Also see the [UI5 Server documentation](./Server.md#ssl-certificates) +This requires an SSL certificate. You are guided through the automatic generation process. Also see the [UI5 Server documentation](./Server#ssl-certificates) ## Integration in Other Tools One of the key features of the UI5 CLI is its modularization. Single parts of UI5 CLI can easily be integrated in other `Node.js`-based tools and frameworks like [Grunt](https://gruntjs.com/) or [Gulp](https://gulpjs.com/). -All JavaScript APIs available for direct consumption are listed [here](https://ui5.github.io/cli/v4/api/index.html). However, for standard UI5 development, the [UI5 CLI](./CLI.md) should always be the first choice. +All JavaScript APIs available for direct consumption are listed [here](https://ui5.github.io/cli/v4/api/index.html). However, for standard UI5 development, the [UI5 CLI](./CLI) should always be the first choice. diff --git a/packages/documentation/docs/pages/Project.md b/packages/documentation/docs/pages/Project.md index 1d2d7260ce0..76dc14c0394 100644 --- a/packages/documentation/docs/pages/Project.md +++ b/packages/documentation/docs/pages/Project.md @@ -1,11 +1,11 @@ # UI5 Project -The [UI5 Project](https://github.com/SAP/ui5-project) module provides functionality to build a UI5 project. Also see [Development Overview: Project Dependencies](./Overview.md#project-dependencies). +The [UI5 Project](https://github.com/SAP/ui5-project) module provides functionality to build a UI5 project. Also see [Development Overview: Project Dependencies](./Overview#project-dependencies). ## Types Types define how a project can be configured and how it is built. A type orchestrates a set of tasks and defines the order in which they get applied during build phase. Furthermore, it takes care of formatting and validating the project-specific configuration. -Also see [UI5 Project: Configuration](./Configuration.md#general-configuration) +Also see [UI5 Project: Configuration](./Configuration#general-configuration) ### application Projects of type `application` are typically the main or root project. In a projects dependency tree, there should only be one project of type `application`. If multiple are found, those further away from the root are ignored. @@ -15,14 +15,14 @@ The source directory of an application (typically named `webapp`) is mapped to t An applications source directory may or may not contain a `Component.js` file. If it does, it must also contain a `manifest.json` file. If there is a `Component.js` file, an optimized `Component-preload.js` file will be generated during the build. ### library -UI5 libraries are often referred to as reuse-, custom- or [control libraries](https://github.com/SAP/openui5/blob/-/docs/controllibraries.md). They are a key component in sharing code across multiple projects in UI5. +UI5 libraries are often referred to as reuse-, custom- or [control libraries](https://github.com/SAP/openui5/blob/-/docs/controllibraries). They are a key component in sharing code across multiple projects in UI5. A project of type `library` must have a source directory (typically named `src`). It may also feature a "test" directory. These directories are mapped to the virtual directories `/resources` for the sources and `/test-resources` for the test resources. These directories should contain a directory structure representing the namespace of the library (e.g. `src/my/first/library`) to prevent name clashes between the resources of different libraries. ### theme-library -*Available since [Specification Version](./Configuration.md#specification-versions) 1.1* +*Available since [Specification Version](./Configuration#specification-versions) 1.1* UI5 theme libraries provide theming resources for the controls of one or multiple libraries. @@ -64,4 +64,8 @@ In the table below you can find the available combinations of project type & out ^3^ Modules have explicit path mappings configured and no namespace concept. -[**API Reference**](https://ui5.github.io/cli/v4/api/@ui5_project_build_ProjectBuilder.html){: .md-button .sap-icon-initiative } + diff --git a/packages/documentation/docs/pages/SAPUI5.md b/packages/documentation/docs/pages/SAPUI5.md index a2b89a062aa..bc8bdc44a22 100644 --- a/packages/documentation/docs/pages/SAPUI5.md +++ b/packages/documentation/docs/pages/SAPUI5.md @@ -1,17 +1,21 @@ # Consuming SAPUI5 Libraries -!!! info - Make sure you have installed the UI5 CLI in Version 2.0 or later: `npm install --global @ui5/cli` +::: info Info +Make sure you have installed the UI5 CLI in Version 2.0 or later: `npm install --global @ui5/cli` - The minimum version of SAPUI5 that can be consumed by UI5 CLI as described below is **1.76.0.** - For lower versions, consider using the [CDN bootstrap](https://ui5.sap.com/#/topic/2d3eb2f322ea4a82983c1c62a33ec4ae) or a custom middleware like [ui5-middleware-simpleproxy](https://www.npmjs.com/package/ui5-middleware-simpleproxy). +The minimum version of SAPUI5 that can be consumed by UI5 CLI as described below is **1.76.0.** +For lower versions, consider using the [CDN bootstrap](https://ui5.sap.com/#/topic/2d3eb2f322ea4a82983c1c62a33ec4ae) or a custom middleware like [ui5-middleware-simpleproxy](https://www.npmjs.com/package/ui5-middleware-simpleproxy). + +::: ## Overview SAPUI5 libraries are hosted on the public npm registry at `registry.npmjs.org`. However, you should not install them using node package managers such as npm. Let UI5 CLI handle them instead by following this guide. -!!! note - For more background information also see the Blog Post ["UI5ers Buzz #49: The UI5 CLI and SAPUI5 – The Next Step"](https://blogs.sap.com/2020/04/01/ui5ers-buzz-49-the-ui5-tooling-and-sapui5-the-next-step/) +::: info Note +For more background information also see the Blog Post ["UI5ers Buzz #49: The UI5 CLI and SAPUI5 – The Next Step"](https://blogs.sap.com/2020/04/01/ui5ers-buzz-49-the-ui5-tooling-and-sapui5-the-next-step/) + +::: ## Usage Since Version 2.0 of the UI5 CLI, it will automatically download all required framework dependencies of a project that have been listed in the corresponding `ui5.yaml` file. They will be cached in a `.ui5` directory located in the user's home directory. This happens transparently whenever you execute the `ui5 serve` or `ui5 build` commands. @@ -24,13 +28,15 @@ Your project's `ui5.yaml` provides a configuration section dedicated to framewor This configuration can be maintained by editing the file, or by using the UI5 CLI: -!!! example - Using the [UI5 CLI](./CLI.md): - ```sh - ui5 use sapui5@latest - ui5 add sap.ui.core sap.m sap.ui.comp themelib_sap_fiori_3 - ui5 add -D sap.ushell - ``` +::: details Example +Using the [UI5 CLI](./CLI): +```sh +ui5 use sapui5@latest +ui5 add sap.ui.core sap.m sap.ui.comp themelib_sap_fiori_3 +ui5 add -D sap.ushell +``` + +::: **Example ui5.yaml of an application** ```yaml @@ -69,10 +75,10 @@ framework: optional: true ``` -Please make sure that your project defines [Specification Version 2.0](./Configuration.md#specification-version-20) or higher. +Please make sure that your project defines [Specification Version 2.0](./Configuration#specification-version-20) or higher. -For details please refer to the [framework configuration documentation](././Configuration.md#framework-configuratio). +For details please refer to the [framework configuration documentation](././Configuration#framework-configuratio). ## Differences Between OpenUI5 and SAPUI5 -Please refer to our documentation on the [differences between OpenUI5 and SAPUI5](./FAQ.md##whats-the-difference-between-openui5-and-sapui5) +Please refer to our documentation on the [differences between OpenUI5 and SAPUI5](./FAQ##whats-the-difference-between-openui5-and-sapui5) diff --git a/packages/documentation/docs/pages/Server.md b/packages/documentation/docs/pages/Server.md index 7d8f6a06df6..20da340dd90 100644 --- a/packages/documentation/docs/pages/Server.md +++ b/packages/documentation/docs/pages/Server.md @@ -2,13 +2,17 @@ The [UI5 Server](https://github.com/SAP/ui5-server) module provides server capabilities for local development of UI5 projects. -[**API Reference**](https://ui5.github.io/cli/v4/api/module-@ui5_server.html){: .md-button .sap-icon-initiative } + ## Standard Middleware All available standard middleware are listed below in the order of their execution. -A project can also add custom middleware to the server by using the [Custom Server Middleware Extensibility](./extensibility/CustomServerMiddleware.md). +A project can also add custom middleware to the server by using the [Custom Server Middleware Extensibility](./extensibility/CustomServerMiddleware). | Middleware | Description | | ---- | ---- | @@ -48,8 +52,8 @@ This middleware resolves requests using the [ui5-fs](https://github.com/SAP/ui5- The following file content transformations are executed: -- Escaping non-ASCII characters in `.properties` translation files based on a project's [configuration](./Configuration.md#encoding-of-properties-files) -- Enhancing the `manifest.json` with supported locales determined by available `.properties` [translation files](./Builder.md#generation-of-supported-locales) +- Escaping non-ASCII characters in `.properties` translation files based on a project's [configuration](./Configuration#encoding-of-properties-files) +- Enhancing the `manifest.json` with supported locales determined by available `.properties` [translation files](./Builder#generation-of-supported-locales) ### testRunner Serves a static version of the UI5 QUnit TestRunner at `/test-resources/sap/ui/qunit/testrunner.html`. @@ -73,5 +77,7 @@ When starting the UI5 Server in HTTPS- or HTTP/2 mode, for example by using UI5 Follow the given instructions and enter your password to install the generated certificate as trusted. You can find the generated certificate and corresponding private key under `.ui5/server` in your user's home directory. -!!! tip - If Chrome unintentionally redirects an HTTP-URL to HTTPS, you need to delete the HSTS mapping in [chrome://net-internals/#hsts](chrome://net-internals/#hsts) by entering the domain name (e.g. localhost) and pressing "delete". +::: tip +If Chrome unintentionally redirects an HTTP-URL to HTTPS, you need to delete the HSTS mapping in [chrome://net-internals/#hsts](chrome://net-internals/#hsts) by entering the domain name (e.g. localhost) and pressing "delete". + +::: \ No newline at end of file diff --git a/packages/documentation/docs/pages/Troubleshooting.md b/packages/documentation/docs/pages/Troubleshooting.md index 681e778c189..de9b5382ed0 100644 --- a/packages/documentation/docs/pages/Troubleshooting.md +++ b/packages/documentation/docs/pages/Troubleshooting.md @@ -7,7 +7,7 @@ An HTTPS server or proxy that was previously running on a domain (e.g. `localhos You need to delete the HSTS mapping in [chrome://net-internals/#hsts](chrome://net-internals/#hsts) by entering the domain name (e.g. `localhost`) and pressing "delete". ## Issues Not Listed Here -Please follow our [Contribution Guidelines](https://github.com/UI5/cli/blob/main/CONTRIBUTING.md#report-an-issue) on how to report an issue. +Please follow our [Contribution Guidelines](https://github.com/UI5/cli/blob/main/CONTRIBUTING#report-an-issue) on how to report an issue. ## UI5 Project ### `~/.ui5` Taking too Much Disk Space @@ -50,8 +50,10 @@ UI5 + Karma: `cross-env UI5_LOG_LVL=verbose npm run karma` -!!! warning - The combination of the `UI5_LOG_LVL` environment variable with the `--log-level` CLI parameter might lead to unexpected results; they should be used interchangeably but not together. The CLI parameter takes precedence over the `UI5_LOG_LVL` environment variable. +::: warning +The combination of the `UI5_LOG_LVL` environment variable with the `--log-level` CLI parameter might lead to unexpected results; they should be used interchangeably but not together. The CLI parameter takes precedence over the `UI5_LOG_LVL` environment variable. + +::: ### Changing UI5 CLI's Data Directory @@ -60,8 +62,10 @@ In some cases and environments this is not a convenient location and the user ne The path to it can either be provided via environment variable or permanently set in the configuration. -!!! info - Paths are resolved relative to the current root project path (i.e. where the package.json is located). +::: info +Paths are resolved relative to the current root project path (i.e. where the package.json is located). + +::: #### Environment variable `UI5_DATA_DIR` diff --git a/packages/documentation/docs/pages/Workspace.md b/packages/documentation/docs/pages/Workspace.md index effc25e1ddb..d640d23e3ac 100644 --- a/packages/documentation/docs/pages/Workspace.md +++ b/packages/documentation/docs/pages/Workspace.md @@ -1,17 +1,19 @@ # UI5 Workspaces -!!! info - **UI5 Workspaces is a new feature available since UI5 CLI [`v3.0.0`](https://github.com/SAP/ui5-cli/releases/tag/v3.0.0)** - -!!! example - ```yaml title="ui5-workspace.yaml" - specVersion: workspace/1.0 - metadata: - name: default - dependencyManagement: +::: info +**UI5 Workspaces is a new feature available since UI5 CLI [`v3.0.0`](https://github.com/SAP/ui5-cli/releases/tag/v3.0.0)** + +::: details +```yaml title="ui5-workspace.yaml" +specVersion: workspace/1.0 +metadata: + name: default +dependencyManagement: resolutions: - - path: ../heavy.library - ``` + - path: ../heavy.library +``` + +::: ## General Concept @@ -19,24 +21,26 @@ UI5 Workspaces can be used to create a personalized local development environmen Workspaces are typically configured in a `ui5-workspace.yaml` file, located next to the project's `ui5.yaml`. The file can contain one or many workspace configurations, each separated by [three dashes](https://yaml.org/spec/1.2.2/#22-structures). For example: -!!! example - ```yaml title="ui5-workspace.yaml" - specVersion: workspace/1.0 - metadata: - name: default - dependencyManagement: +::: details Example +```yaml title="ui5-workspace.yaml" +specVersion: workspace/1.0 +metadata: + name: default +dependencyManagement: resolutions: - - path: ../heavy.library - --- - specVersion: workspace/1.0 - metadata: - name: extended - dependencyManagement: + - path: ../heavy.library +--- +specVersion: workspace/1.0 +metadata: + name: extended +dependencyManagement: resolutions: - - path: ../heavy.library - - path: ../light.library - - path: ../test.library - ``` + - path: ../heavy.library + - path: ../light.library + - path: ../test.library +``` + +::: If a workspace configuration named `default` exists, it will be used automatically; otherwise the workspace must be specified using the UI5 CLI parameter `--workspace`. @@ -53,12 +57,14 @@ specVersion: "workspace/1.0" ### Metadata -!!! example - ```yaml - specVersion: workspace/1.0 - metadata: - name: dolphin - ``` +::: details Example +```yaml +specVersion: workspace/1.0 +metadata: + name: dolphin +``` + +::: #### name @@ -66,7 +72,7 @@ A workspace must have a `name`. This allows to easily switch between individual If a workspace is named `default`, **it will be used automatically**, unless a different workspace is selected using the `--workspace` CLI parameter. -The `name` property must satisfy the following conditions. They are identical to [project names](./Configuration.md#name): +The `name` property must satisfy the following conditions. They are identical to [project names](./Configuration#name): * Must be at least 3 characters long * Must be no longer than 80 characters @@ -83,17 +89,19 @@ The `name` property must satisfy the following conditions. They are identical to UI5 Workspace configurations allow to influence the dependency resolution when working with a UI5 project. -!!! example - ```yaml - specVersion: workspace/1.0 - metadata: - name: dolphin - dependencyManagement: +::: details +```yaml +specVersion: workspace/1.0 +metadata: + name: dolphin +dependencyManagement: resolutions: - - path: ../light.library - - path: ../heavy.library - - path: ../test.library - ``` + - path: ../light.library + - path: ../heavy.library + - path: ../test.library +``` + +::: ### Resolutions diff --git a/packages/documentation/docs/pages/extensibility/CustomServerMiddleware.md b/packages/documentation/docs/pages/extensibility/CustomServerMiddleware.md index 7a164ca4d89..fbff1365eb0 100644 --- a/packages/documentation/docs/pages/extensibility/CustomServerMiddleware.md +++ b/packages/documentation/docs/pages/extensibility/CustomServerMiddleware.md @@ -10,7 +10,7 @@ Please note that custom middleware packages from third parties can not only modi In a projects `ui5.yaml` file, you can define additional server middleware modules that will be executed when the request is received by the server. This configuration exclusively affects the server started in this project. Custom middleware configurations defined in any dependencies are ignored. -A middleware may be executed before or after any other middleware. This can either be a [standard middleware](../Server.md#standard-middleware) or another custom middleware. +A middleware may be executed before or after any other middleware. This can either be a [standard middleware](../Server#standard-middleware) or another custom middleware. ### Example: Basic configuration @@ -89,161 +89,162 @@ middleware: A custom middleware implementation needs to return a function with the following signature: -=== "ESM" - - ```js linenums="1" - /** - * Custom UI5 Server middleware API - * - * @param {object} parameters Parameters - * @param {@ui5/logger/Logger} parameters.log - * Logger instance for use in the custom middleware. - * This parameter is only provided to custom middleware - * extensions defining Specification Version 3.0 and later. - * @param {@ui5/server.middleware.MiddlewareUtil} parameters.middlewareUtil - * Specification version-dependent interface to a - * MiddlewareUtil instance. See the corresponding API reference for details: - * https://ui5.github.io/cli/v4/api/@ui5_server_middleware_MiddlewareUtil.html - * @param {object} parameters.options Options - * @param {string} parameters.options.configuration - * Custom middleware configuration, as defined in the project's ui5.yaml - * @param {string} parameters.options.middlewareName - * Name of the custom middleware. - * This parameter is only provided to custom middleware extensions - * defining Specification Version 3.0 and later - * @param {object} parameters.resources Readers for accessing resources - * @param {module:@ui5/fs.AbstractReader} parameters.resources.all - * Reader to access resources of the root project and its dependencies - * @param {module:@ui5/fs.AbstractReader} parameters.resources.rootProject - * Reader to access resources of the root project - * @param {module:@ui5/fs.AbstractReader} parameters.resources.dependencies - * Reader to access resources of the project's dependencies. - * @returns {function} Middleware function to use - */ - export default function({log, middlewareUtil, options, resources}) { - return async function (req, res, next) { - // [...] - } - }; - ``` - -=== "CommonJS" - - ```js linenums="1" - /** - * Custom UI5 Server middleware API - * - * @param {object} parameters Parameters - * @param {@ui5/logger/Logger} parameters.log - * Logger instance for use in the custom middleware. - * This parameter is only provided to custom middleware - * extensions defining Specification Version 3.0 and later. - * @param {@ui5/server.middleware.MiddlewareUtil} parameters.middlewareUtil - * Specification version-dependent interface to a - * MiddlewareUtil instance. See the corresponding API reference for details: - * https://ui5.github.io/cli/v4/api/@ui5_server_middleware_MiddlewareUtil.html - * @param {object} parameters.options Options - * @param {string} parameters.options.configuration - * Custom middleware configuration, as defined in the project's ui5.yaml - * @param {string} parameters.options.middlewareName - * Name of the custom middleware. - * This parameter is only provided to custom middleware extensions - * defining Specification Version 3.0 and later - * @param {object} parameters.resources Readers for accessing resources - * @param {module:@ui5/fs.AbstractReader} parameters.resources.all - * Reader to access resources of the root project and its dependencies - * @param {module:@ui5/fs.AbstractReader} parameters.resources.rootProject - * Reader to access resources of the root project - * @param {module:@ui5/fs.AbstractReader} parameters.resources.dependencies - * Reader to access resources of the project's dependencies. - * @returns {function} Middleware function to use - */ - module.exports = function({log, middlewareUtil, options, resources}) { - return async function (req, res, next) { - // [...] - } - }; - ``` +#### ESM + +```js linenums="1 +/** + * Custom UI5 Server middleware API + * + * @param {object} parameters Parameters + * @param {@ui5/logger/Logger} parameters.log + * Logger instance for use in the custom middleware. + * This parameter is only provided to custom middleware + * extensions defining Specification Version 3.0 and later. + * @param {@ui5/server.middleware.MiddlewareUtil} parameters.middlewareUtil + * Specification version-dependent interface to a + * MiddlewareUtil instance. See the corresponding API reference for details: + * https://ui5.github.io/cli/v4/api/@ui5_server_middleware_MiddlewareUtil.html + * @param {object} parameters.options Options + * @param {string} parameters.options.configuration + * Custom middleware configuration, as defined in the project's ui5.yaml + * @param {string} parameters.options.middlewareName + * Name of the custom middleware. + * This parameter is only provided to custom middleware extensions + * defining Specification Version 3.0 and later + * @param {object} parameters.resources Readers for accessing resources + * @param {module:@ui5/fs.AbstractReader} parameters.resources.all + * Reader to access resources of the root project and its dependencies + * @param {module:@ui5/fs.AbstractReader} parameters.resources.rootProject + * Reader to access resources of the root project + * @param {module:@ui5/fs.AbstractReader} parameters.resources.dependencies + * Reader to access resources of the project's dependencies. + * @returns {function} Middleware function to use + */ +export default function({log, middlewareUtil, options, resources}) { + return async function (req, res, next) { + // [...] + } +}; +``` + +#### CommonJS + +```js linenums="1 +/** + * Custom UI5 Server middleware API + * + * @param {object} parameters Parameters + * @param {@ui5/logger/Logger} parameters.log + * Logger instance for use in the custom middleware. + * This parameter is only provided to custom middleware + * extensions defining Specification Version 3.0 and later. + * @param {@ui5/server.middleware.MiddlewareUtil} parameters.middlewareUtil + * Specification version-dependent interface to a + * MiddlewareUtil instance. See the corresponding API reference for details: + * https://ui5.github.io/cli/v4/api/@ui5_server_middleware_MiddlewareUtil.html + * @param {object} parameters.options Options + * @param {string} parameters.options.configuration + * Custom middleware configuration, as defined in the project's ui5.yaml + * @param {string} parameters.options.middlewareName + * Name of the custom middleware. + * This parameter is only provided to custom middleware extensions + * defining Specification Version 3.0 and later + * @param {object} parameters.resources Readers for accessing resources + * @param {module:@ui5/fs.AbstractReader} parameters.resources.all + * Reader to access resources of the root project and its dependencies + * @param {module:@ui5/fs.AbstractReader} parameters.resources.rootProject + * Reader to access resources of the root project + * @param {module:@ui5/fs.AbstractReader} parameters.resources.dependencies + * Reader to access resources of the project's dependencies. + * @returns {function} Middleware function to use + */ +module.exports = function({log, middlewareUtil, options, resources}) { + return async function (req, res, next) { + // [...] + } +}; +``` ### Example: lib/middleware/markdownHandler.(m)js -=== "ESM" +#### ESM - ```js linenums="1" - import MarkdownIt from "markdown-it"; +```js linenums="1 +import MarkdownIt from "markdown-it"; - export default async function({log, middlewareUtil, options, resources}) { - const md = new MarkdownIt(); - return function (req, res, next) { - if (!req.path || !req.path.endsWith(".html")) { - // Do not handle non-HTML requests +export default async function({log, middlewareUtil, options, resources}) { + const md = new MarkdownIt(); + return function (req, res, next) { + if (!req.path || !req.path.endsWith(".html")) { + // Do not handle non-HTML requests + next(); + return; + } + // Try to read a corresponding markdown file + resources.rootProject.byPath(req.path.replace(".html", ".md")).then(async (resource) => { + if (!resource) { + // No file found, hand over to next middleware next(); return; } - // Try to read a corresponding markdown file - resources.rootProject.byPath(req.path.replace(".html", ".md")).then(async (resource) => { - if (!resource) { - // No file found, hand over to next middleware - next(); - return; - } - log.info(`Rendering markdown for ${resource.getPath()}`); - const markdown = await resource.getBuffer(); - // Generate HTML from markdown string - const html = md.render(markdown.toString()); - res.type('.html'); - res.end(html); - }).catch((err) => { - next(err); - }); + log.info(`Rendering markdown for ${resource.getPath()}`); + const markdown = await resource.getBuffer(); + // Generate HTML from markdown string + const html = md.render(markdown.toString()); + res.type('.html'); + res.end(html); + }).catch((err) => { + next(err); + }); + } +}; +``` +Live demo of the above example: [openui5-sample-app with custom middleware](https://github.com/SAP/openui5-sample-app/tree/demo-server-middleware-extensibility-v3-esm) + +#### CommonJS + +```js linenums="1 +module.exports = async function({log, middlewareUtil, options, resources}) { + const MarkdownIt = require("markdown-it"); + const md = new MarkdownIt(); + return function (req, res, next) { + if (!req.path || !req.path.endsWith(".html")) { + // Do not handle non-HTML requests + next(); + return; } - }; - ``` - Live demo of the above example: [openui5-sample-app with custom middleware](https://github.com/SAP/openui5-sample-app/tree/demo-server-middleware-extensibility-v3-esm) - -=== "CommonJS" - - ```js linenums="1" - module.exports = async function({log, middlewareUtil, options, resources}) { - const MarkdownIt = require("markdown-it"); - const md = new MarkdownIt(); - return function (req, res, next) { - if (!req.path || !req.path.endsWith(".html")) { - // Do not handle non-HTML requests + // Try to read a corresponding markdown file + resources.rootProject.byPath(req.path.replace(".html", ".md")).then(async (resource) => { + if (!resource) { + // No file found, hand over to next middleware next(); return; } - // Try to read a corresponding markdown file - resources.rootProject.byPath(req.path.replace(".html", ".md")).then(async (resource) => { - if (!resource) { - // No file found, hand over to next middleware - next(); - return; - } - log.info(`Rendering markdown for ${resource.getPath()}`); - const markdown = await resource.getBuffer(); - // Generate HTML from markdown string - const html = md.render(markdown.toString()); - res.type('.html'); - res.end(html); - }).catch((err) => { - next(err); - }); - } - }; - ``` - Live demo of the above example: [openui5-sample-app with custom middleware](https://github.com/SAP/openui5-sample-app/tree/demo-server-middleware-extensibility-v3) + log.info(`Rendering markdown for ${resource.getPath()}`); + const markdown = await resource.getBuffer(); + // Generate HTML from markdown string + const html = md.render(markdown.toString()); + res.type('.html'); + res.end(html); + }).catch((err) => { + next(err); + }); + } +}; +``` +Live demo of the above example: [openui5-sample-app with custom middleware](https://github.com/SAP/openui5-sample-app/tree/demo-server-middleware-extensibility-v3) ## Helper Class `MiddlewareUtil` -Custom middleware defining [Specification Version](../Configuration.md#specification-versions) 2.0 or higher have access to an interface of a [MiddlewareUtil](https://ui5.github.io/cli/v4/api/@ui5_server_middleware_MiddlewareUtil.html) instance. +Custom middleware defining [Specification Version](../Configuration#specification-versions) 2.0 or higher have access to an interface of a [MiddlewareUtil](https://ui5.github.io/cli/v4/api/@ui5_server_middleware_MiddlewareUtil.html) instance. In this case, a `middlewareUtil` object is provided as a part of the custom middleware's [parameters](#custom-middleware-implementation). Depending on the specification version of the custom middleware, a set of helper functions is available to the implementation. The lowest required specification version for every function is listed in the [MiddlewareUtil API reference](https://ui5.github.io/cli/v4/api/@ui5_server_middleware_MiddlewareUtil.html). ## Integration with `karma-ui5` -!!! Warning - The Karma project has been [deprecated](https://github.com/karma-runner/karma#karma-is-deprecated-and-is-not-accepting-new-features-or-general-bug-fixes) as of 2023 +::: warning +The Karma project has been [deprecated](https://github.com/karma-runner/karma#karma-is-deprecated-and-is-not-accepting-new-features-or-general-bug-fixes) as of 2023 +::: [`karma-ui5`](https://github.com/SAP/karma-ui5) is a plugin for the popular [Karma test runner](https://karma-runner.github.io/). Based on your [configuration](https://github.com/SAP/karma-ui5#url), it can fetch resources from a dedicated server or start an internal server using parts of UI5 CLI. diff --git a/packages/documentation/docs/pages/extensibility/CustomTasks.md b/packages/documentation/docs/pages/extensibility/CustomTasks.md index a5e6bd0509a..b23a399a0b4 100644 --- a/packages/documentation/docs/pages/extensibility/CustomTasks.md +++ b/packages/documentation/docs/pages/extensibility/CustomTasks.md @@ -1,6 +1,6 @@ # Custom UI5 Builder Tasks -The UI5 Build Extensibility enables you to enhance the build process of any UI5 project. In addition to the [standard tasks](../Builder.md#standard-tasks), custom tasks can be created. +The UI5 Build Extensibility enables you to enhance the build process of any UI5 project. In addition to the [standard tasks](../Builder#standard-tasks), custom tasks can be created. The UI5 community already created many custom tasks which you can integrate into your project. They are often prefixed by `ui5-task-` to make them easily searchable in the [npm registry](https://www.npmjs.com/search?q=ui5-task-). @@ -8,9 +8,9 @@ Please note that custom tasks from third parties can not only modify your projec ## Configuration -You can configure your build process with additional build task. These custom tasks are defined in the project [configuration](../Configuration.md). +You can configure your build process with additional build task. These custom tasks are defined in the project [configuration](../Configuration). -To hook your custom tasks into the different build phases of a project, they need to reference other tasks to be executed before or after. This can be a [standard task](../Builder.md#standard-tasks) or another custom task. +To hook your custom tasks into the different build phases of a project, they need to reference other tasks to be executed before or after. This can be a [standard task](../Builder#standard-tasks) or another custom task. Standard tasks that are disabled, even though they are not executed, can still be referenced by custom tasks, which will be performed in their designated position. In the below example, when building the library `my.library` the custom `babel` task will be executed before the standard task `generateComponentPreload`. @@ -107,90 +107,92 @@ task: A custom task implementation needs to return a function with the following signature: -=== "ESM" - - ```js linenums="1" - /** - * Custom task API - * - * @param {object} parameters - * - * @param {module:@ui5/fs.AbstractReader} parameters.dependencies - * Reader to access resources of the project's dependencies - * @param {@ui5/logger/Logger} parameters.log - * Logger instance for use in the custom task. - * This parameter is only available to custom task extensions - * defining Specification Version 3.0 and later. - * @param {object} parameters.options Options - * @param {string} parameters.options.projectName - * Name of the project currently being built - * @param {string} parameters.options.projectNamespace - * Namespace of the project currently being built - * @param {string} parameters.options.configuration - * Custom task configuration, as defined in the project's ui5.yaml - * @param {string} parameters.options.taskName - * Name of the custom task. - * This parameter is only provided to custom task extensions - * defining Specification Version 3.0 and later. - * @param {@ui5/builder.tasks.TaskUtil} parameters.taskUtil - * Specification Version-dependent interface to a TaskUtil instance. - * See the corresponding API reference for details: - * https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html - * @param {module:@ui5/fs.DuplexCollection} parameters.workspace - * Reader/Writer to access and modify resources of the - * project currently being built - * @returns {Promise} - * Promise resolving once the task has finished - */ - export default async function({dependencies, log, options, taskUtil, workspace}) { - // [...] - }; - ``` - -=== "CommonJS" - - ```js linenums="1" - /** - * Custom task API - * - * @param {object} parameters - * - * @param {module:@ui5/fs.AbstractReader} parameters.dependencies - * Reader to access resources of the project's dependencies - * @param {@ui5/logger/Logger} parameters.log - * Logger instance for use in the custom task. - * This parameter is only available to custom task extensions - * defining Specification Version 3.0 and later. - * @param {object} parameters.options Options - * @param {string} parameters.options.projectName - * Name of the project currently being built - * @param {string} parameters.options.projectNamespace - * Namespace of the project currently being built - * @param {string} parameters.options.configuration - * Custom task configuration, as defined in the project's ui5.yaml - * @param {string} parameters.options.taskName - * Name of the custom task. - * This parameter is only provided to custom task extensions - * defining Specification Version 3.0 and later. - * @param {@ui5/builder.tasks.TaskUtil} parameters.taskUtil - * Specification Version-dependent interface to a TaskUtil instance. - * See the corresponding API reference for details: - * https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html - * @param {module:@ui5/fs.DuplexCollection} parameters.workspace - * Reader/Writer to access and modify resources of the - * project currently being built - * @returns {Promise} - * Promise resolving once the task has finished - */ - module.exports = async function({dependencies, log, options, taskUtil, workspace}) { - // [...] - }; - ``` +#### ESM + +```js linenums="1 +/** + * Custom task API + * + * @param {object} parameters + * + * @param {module:@ui5/fs.AbstractReader} parameters.dependencies + * Reader to access resources of the project's dependencies + * @param {@ui5/logger/Logger} parameters.log + * Logger instance for use in the custom task. + * This parameter is only available to custom task extensions + * defining Specification Version 3.0 and later. + * @param {object} parameters.options Options + * @param {string} parameters.options.projectName + * Name of the project currently being built + * @param {string} parameters.options.projectNamespace + * Namespace of the project currently being built + * @param {string} parameters.options.configuration + * Custom task configuration, as defined in the project's ui5.yaml + * @param {string} parameters.options.taskName + * Name of the custom task. + * This parameter is only provided to custom task extensions + * defining Specification Version 3.0 and later. + * @param {@ui5/builder.tasks.TaskUtil} parameters.taskUtil + * Specification Version-dependent interface to a TaskUtil instance. + * See the corresponding API reference for details: + * https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html + * @param {module:@ui5/fs.DuplexCollection} parameters.workspace + * Reader/Writer to access and modify resources of the + * project currently being built + * @returns {Promise} + * Promise resolving once the task has finished + */ +export default async function({dependencies, log, options, taskUtil, workspace}) { + // [...] +}; +``` + +#### CommonJS + +```js linenums="1 +/** + * Custom task API + * + * @param {object} parameters + * + * @param {module:@ui5/fs.AbstractReader} parameters.dependencies + * Reader to access resources of the project's dependencies + * @param {@ui5/logger/Logger} parameters.log + * Logger instance for use in the custom task. + * This parameter is only available to custom task extensions + * defining Specification Version 3.0 and later. + * @param {object} parameters.options Options + * @param {string} parameters.options.projectName + * Name of the project currently being built + * @param {string} parameters.options.projectNamespace + * Namespace of the project currently being built + * @param {string} parameters.options.configuration + * Custom task configuration, as defined in the project's ui5.yaml + * @param {string} parameters.options.taskName + * Name of the custom task. + * This parameter is only provided to custom task extensions + * defining Specification Version 3.0 and later. + * @param {@ui5/builder.tasks.TaskUtil} parameters.taskUtil + * Specification Version-dependent interface to a TaskUtil instance. + * See the corresponding API reference for details: + * https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html + * @param {module:@ui5/fs.DuplexCollection} parameters.workspace + * Reader/Writer to access and modify resources of the + * project currently being built + * @returns {Promise} + * Promise resolving once the task has finished + */ +module.exports = async function({dependencies, log, options, taskUtil, workspace}) { + // [...] +}; +``` ### Required Dependencies -!!! info - This functionality has been added with UI5 CLI [`v3.0.0`](https://github.com/SAP/ui5-cli/releases/tag/v3.0.0) +::: info +This functionality has been added with UI5 CLI [`v3.0.0`](https://github.com/SAP/ui5-cli/releases/tag/v3.0.0) + +::: Custom tasks can export an optional callback function `determineRequiredDependencies` to control which dependency-resources are made available through the `dependencies`-reader that is provided to the task. By reducing the amount of required dependencies or by not requiring any, UI5 CLI might be able to build a project faster. @@ -202,89 +204,89 @@ If this callback is not provided, UI5 CLI will make an assumption as to whether * **Specification Versions before 3.0:** If no callback is provided, UI5 CLI assumes that all dependencies are required. -*For more details, see also [RFC 0012 UI5 CLI Extension API v3](https://github.com/UI5/cli/blob/main/rfcs/0012-UI5-Tooling-Extension-API-3.md)* - -=== "ESM" - - ```js linenums="1" - /** - * Callback function to define the list of required dependencies - * - * @param {object} parameters - * @param {Set} parameters.availableDependencies - * Set containing the names of all direct dependencies of - * the project currently being built. - * @param {function} parameters.getDependencies - * Identical to TaskUtil#getDependencies - * (see https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html). - * Creates a list of names of all direct dependencies - * of a given project. - * @param {function} parameters.getProject - * Identical to TaskUtil#getProject - * (see https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html). - * Retrieves a Project-instance for a given project name. - * @param {object} parameters.options - * Identical to the options given to the standard task function. - * @returns {Promise} - * Promise resolving with a Set containing all dependencies - * that should be made available to the task. - * UI5 CLI will ensure that those dependencies have been - * built before executing the task. - */ - export async function determineRequiredDependencies({availableDependencies, getDependencies, getProject, options}) { - // "availableDependencies" could look like this: Set(3) { "sap.ui.core", "sap.m", "my.lib" } - - // Reduce list of required dependencies: Do not require any UI5 framework projects - availableDependencies.forEach((depName) => { - if (getProject(depName).isFrameworkProject()) { - availableDependencies.delete(depName) - } - }); - // => Only resources of project "my.lib" will be available to the task - return availableDependencies; - } - ``` - -=== "CommonJS" - - ```js linenums="1" - /** - * Callback function to define the list of required dependencies - * - * @param {object} parameters - * @param {Set} parameters.availableDependencies - * Set containing the names of all direct dependencies of - * the project currently being built. - * @param {function} parameters.getDependencies - * Identical to TaskUtil#getDependencies - * (see https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html). - * Creates a list of names of all direct dependencies - * of a given project. - * @param {function} parameters.getProject - * Identical to TaskUtil#getProject - * (see https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html). - * Retrieves a Project-instance for a given project name. - * @param {object} parameters.options - * Identical to the options given to the standard task function. - * @returns {Promise} - * Promise resolving with a Set containing all dependencies - * that should be made available to the task. - * UI5 CLI will ensure that those dependencies have been - * built before executing the task. - */ - module.exports.determineRequiredDependencies = async function({availableDependencies, getDependencies, getProject, options}) { - // "availableDependencies" could look like this: Set(3) { "sap.ui.core", "sap.m", "my.lib" } - - // Reduce list of required dependencies: Do not require any UI5 framework projects - availableDependencies.forEach((depName) => { - if (getProject(depName).isFrameworkProject()) { - availableDependencies.delete(depName) - } - }); - // => Only resources of project "my.lib" will be available to the task - return availableDependencies; - } - ``` +*For more details, see also [RFC 0012 UI5 CLI Extension API v3](https://github.com/UI5/cli/blob/rfc-ui5-tooling-extension-api-v3/rfcs/0012-UI5-Tooling-Extension-API-3#3-tasks-requiring-dependencies)* + +#### ESM + +```js linenums="1 +/** + * Callback function to define the list of required dependencies + * + * @param {object} parameters + * @param {Set} parameters.availableDependencies + * Set containing the names of all direct dependencies of + * the project currently being built. + * @param {function} parameters.getDependencies + * Identical to TaskUtil#getDependencies + * (see https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html). + * Creates a list of names of all direct dependencies + * of a given project. + * @param {function} parameters.getProject + * Identical to TaskUtil#getProject + * (see https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html). + * Retrieves a Project-instance for a given project name. + * @param {object} parameters.options + * Identical to the options given to the standard task function. + * @returns {Promise} + * Promise resolving with a Set containing all dependencies + * that should be made available to the task. + * UI5 CLI will ensure that those dependencies have been + * built before executing the task. + */ +export async function determineRequiredDependencies({availableDependencies, getDependencies, getProject, options}) { + // "availableDependencies" could look like this: Set(3) { "sap.ui.core", "sap.m", "my.lib" } + + // Reduce list of required dependencies: Do not require any UI5 framework projects + availableDependencies.forEach((depName) => { + if (getProject(depName).isFrameworkProject()) { + availableDependencies.delete(depName) + } + }); + // => Only resources of project "my.lib" will be available to the task + return availableDependencies; +} +``` + +#### CommonJS + +```js linenums="1 +/** + * Callback function to define the list of required dependencies + * + * @param {object} parameters + * @param {Set} parameters.availableDependencies + * Set containing the names of all direct dependencies of + * the project currently being built. + * @param {function} parameters.getDependencies + * Identical to TaskUtil#getDependencies + * (see https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html). + * Creates a list of names of all direct dependencies + * of a given project. + * @param {function} parameters.getProject + * Identical to TaskUtil#getProject + * (see https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html). + * Retrieves a Project-instance for a given project name. + * @param {object} parameters.options + * Identical to the options given to the standard task function. + * @returns {Promise} + * Promise resolving with a Set containing all dependencies + * that should be made available to the task. + * UI5 CLI will ensure that those dependencies have been + * built before executing the task. + */ +module.exports.determineRequiredDependencies = async function({availableDependencies, getDependencies, getProject, options}) { + // "availableDependencies" could look like this: Set(3) { "sap.ui.core", "sap.m", "my.lib" } + + // Reduce list of required dependencies: Do not require any UI5 framework projects + availableDependencies.forEach((depName) => { + if (getProject(depName).isFrameworkProject()) { + availableDependencies.delete(depName) + } + }); + // => Only resources of project "my.lib" will be available to the task + return availableDependencies; +} +``` ### Examples @@ -296,72 +298,74 @@ This example is making use of the `resourceFactory` [TaskUtil](https://ui5.githu API to create new resources based on the output of a third-party module for rendering Markdown files. The created resources are added to the build result by writing them into the provided `workspace`. -=== "ESM" - - ```js linenums="1" - import path from "node:path"; - import renderMarkdown from "./renderMarkdown.js"; - - /* - * Render all .md (Markdown) files in the project to HTML - */ - export default async function({dependencies, log, options, taskUtil, workspace}) { - const {createResource} = taskUtil.resourceFactory; - const textResources = await workspace.byGlob("**/*.md"); - await Promise.all(textResources.map(async (resource) => { - const markdownResourcePath = resource.getPath(); - - log.info(`Rendering markdown file ${markdownResourcePath}...`); - const htmlString = await renderMarkdown(await resource.getString(), options.configuration); - - // Note: @ui5/fs virtual paths are always (on *all* platforms) POSIX. Therefore using path.posix here - const newResourceName = path.posix.basename(markdownResourcePath, ".md") + ".html"; - const newResourcePath = path.posix.join(path.posix.dirname(markdownResourcePath), newResourceName); - - const markdownResource = createResource({ - path: newResourcePath, - string: htmlString - }); - await workspace.write(markdownResource); - })); - }; - ``` - -=== "CommonJS" - - ```js linenums="1" - const path = require("node:path"); - const renderMarkdown = require("./renderMarkdown.js"); - - /* - * Render all .md (Markdown) files in the project to HTML - */ - module.exports = async function({dependencies, log, options, taskUtil, workspace}) { - const {createResource} = taskUtil.resourceFactory; - const textResources = await workspace.byGlob("**/*.md"); - await Promise.all(textResources.map(async (resource) => { - const markdownResourcePath = resource.getPath(); - - log.info(`Rendering markdown file ${markdownResourcePath}...`); - const htmlString = await renderMarkdown(await resource.getString(), options.configuration); - - // Note: @ui5/fs virtual paths are always (on *all* platforms) POSIX. Therefore using path.posix here - const newResourceName = path.posix.basename(markdownResourcePath, ".md") + ".html"; - const newResourcePath = path.posix.join(path.posix.dirname(markdownResourcePath), newResourceName); - - const markdownResource = createResource({ - path: newResourcePath, - string: htmlString - }); - await workspace.write(markdownResource); - })); - }; - ``` +#### ESM + +```js linenums="1 +import path from "node:path"; +import renderMarkdown from "./renderMarkdown.js"; + +/* +* Render all .md (Markdown) files in the project to HTML +*/ +export default async function({dependencies, log, options, taskUtil, workspace}) { + const {createResource} = taskUtil.resourceFactory; + const textResources = await workspace.byGlob("**/*.md"); + await Promise.all(textResources.map(async (resource) => { + const markdownResourcePath = resource.getPath(); + + log.info(`Rendering markdown file ${markdownResourcePath}...`); + const htmlString = await renderMarkdown(await resource.getString(), options.configuration); + + // Note: @ui5/fs virtual paths are always (on *all* platforms) POSIX. Therefore using path.posix here + const newResourceName = path.posix.basename(markdownResourcePath, ".md") + ".html"; + const newResourcePath = path.posix.join(path.posix.dirname(markdownResourcePath), newResourceName); + + const markdownResource = createResource({ + path: newResourcePath, + string: htmlString + }); + await workspace.write(markdownResource); + })); +}; +``` + +#### CommonJS + +```js linenums="1 +const path = require("node:path"); +const renderMarkdown = require("./renderMarkdown.js"); + +/* +* Render all .md (Markdown) files in the project to HTML +*/ +module.exports = async function({dependencies, log, options, taskUtil, workspace}) { + const {createResource} = taskUtil.resourceFactory; + const textResources = await workspace.byGlob("**/*.md"); + await Promise.all(textResources.map(async (resource) => { + const markdownResourcePath = resource.getPath(); -!!! warning - Depending on your project setup, UI5 CLI tends to open many files simultaneously during a build. To prevent errors like `EMFILE: too many open files`, we urge custom task implementations to use the [graceful-fs](https://github.com/isaacs/node-graceful-fs#readme) module as a drop-in replacement for the native `fs` module in case it is used. + log.info(`Rendering markdown file ${markdownResourcePath}...`); + const htmlString = await renderMarkdown(await resource.getString(), options.configuration); - Tasks should ideally use the reader/writer APIs provided by UI5 CLI for working with project resources. + // Note: @ui5/fs virtual paths are always (on *all* platforms) POSIX. Therefore using path.posix here + const newResourceName = path.posix.basename(markdownResourcePath, ".md") + ".html"; + const newResourcePath = path.posix.join(path.posix.dirname(markdownResourcePath), newResourceName); + + const markdownResource = createResource({ + path: newResourcePath, + string: htmlString + }); + await workspace.write(markdownResource); + })); +}; +``` + +::: warning +Depending on your project setup, UI5 CLI tends to open many files simultaneously during a build. To prevent errors like `EMFILE: too many open files`, we urge custom task implementations to use the [graceful-fs](https://github.com/isaacs/node-graceful-fs#readme) module as a drop-in replacement for the native `fs` module in case it is used. + +Tasks should ideally use the reader/writer APIs provided by UI5 CLI for working with project resources. + +::: ### Example: lib/tasks/compileLicenseSummary.js @@ -369,108 +373,108 @@ This example is making use of multiple [TaskUtil](https://ui5.github.io/cli/v4/a APIs to retrieve additional information about the project currently being built (`taskUtil.getProject()`) and its direct dependencies (`taskUtil.getDependencies()`). Project configuration files like `package.json` can be accessed directly using `project.getRootReader()`. -=== "ESM" +#### ESM - ```js linenums="1" - import path from "node:path"; +```js linenums="1 +import path from "node:path"; - /* - * Compile a list of all licenses of the project's dependencies - * and write it to "dependency-license-summary.json" - */ - export default async function({dependencies, log, options, taskUtil, workspace}) { - const {createResource} = taskUtil.resourceFactory; - const licenses = new Map(); - const projectsVisited = new Set(); - - async function processProject(project) { - return Promise.all(taskUtil.getDependencies().map(async (projectName) => { - if (projectsVisited.has(projectName)) { - return; - } - projectsVisited.add(projectName); - const project = taskUtil.getProject(projectName); - const pkgResource = await project.getRootReader().byPath("/package.json"); - if (pkgResource) { - const pkg = JSON.parse(await pkgResource.getString()) - - // Add project to list of licenses - if (licenses.has(pkg.license)) { - licenses.get(pkg.license).push(project.getName()); - } else { - // License not yet in map. Define it - licenses.set(pkg.license, [project.getName()]); - } +/* +* Compile a list of all licenses of the project's dependencies +* and write it to "dependency-license-summary.json +*/ +export default async function({dependencies, log, options, taskUtil, workspace}) { + const {createResource} = taskUtil.resourceFactory; + const licenses = new Map(); + const projectsVisited = new Set(); + async function processProject(project) { + return Promise.all(taskUtil.getDependencies().map(async (projectName) => { + if (projectsVisited.has(projectName)) { + return; + } + projectsVisited.add(projectName); + const project = taskUtil.getProject(projectName); + const pkgResource = await project.getRootReader().byPath(../package.json"); + if (pkgResource) { + const pkg = JSON.parse(await pkgResource.getString()) + + // Add project to list of licenses + if (licenses.has(pkg.license)) { + licenses.get(pkg.license).push(project.getName()); } else { - log.info(`Could not find package.json file in project ${project.getName()}`); + // License not yet in map. Define it + licenses.set(pkg.license, [project.getName()]); } - return processProject(project); - })); - } - // Start processing dependencies of the root project - await processProject(taskUtil.getProject()); - const summaryResource = createResource({ - path: "/dependency-license-summary.json", - string: JSON.stringify(Object.fromEntries(licenses), null, "\t") - }); - await workspace.write(summaryResource); - }; - ``` - -=== "CommonJS" - - ```js linenums="1" - const path = require("node:path"); - - /* - * Compile a list of all licenses of the project's dependencies - * and write it to "dependency-license-summary.json" - */ - module.exports = async function({dependencies, log, options, taskUtil, workspace}) { - const {createResource} = taskUtil.resourceFactory; - const licenses = new Map(); - const projectsVisited = new Set(); - - async function processProject(project) { - return Promise.all(taskUtil.getDependencies().map(async (projectName) => { - if (projectsVisited.has(projectName)) { - return; - } - projectsVisited.add(projectName); - const project = taskUtil.getProject(projectName); - const pkgResource = await project.getRootReader().byPath("/package.json"); - if (pkgResource) { - const pkg = JSON.parse(await pkgResource.getString()) - - // Add project to list of licenses - if (licenses.has(pkg.license)) { - licenses.get(pkg.license).push(project.getName()); - } else { - // License not yet in map. Define it - licenses.set(pkg.license, [project.getName()]); - } + } else { + log.info(`Could not find package.json file in project ${project.getName()}`); + } + return processProject(project); + })); + } + // Start processing dependencies of the root project + await processProject(taskUtil.getProject()); + + const summaryResource = createResource({ + path: "/dependency-license-summary.json", + string: JSON.stringify(Object.fromEntries(licenses), null, "\t") + }); + await workspace.write(summaryResource); +}; +``` + +#### CommonJS +```js linenums="1" +const path = require("node:path"); + +/* +* Compile a list of all licenses of the project's dependencies +* and write it to "dependency-license-summary.json" +*/ +module.exports = async function({dependencies, log, options, taskUtil, workspace}) { + const {createResource} = taskUtil.resourceFactory; + const licenses = new Map(); + const projectsVisited = new Set(); + + async function processProject(project) { + return Promise.all(taskUtil.getDependencies().map(async (projectName) => { + if (projectsVisited.has(projectName)) { + return; + } + projectsVisited.add(projectName); + const project = taskUtil.getProject(projectName); + const pkgResource = await project.getRootReader().byPath("/package.json"); + if (pkgResource) { + const pkg = JSON.parse(await pkgResource.getString()) + + // Add project to list of licenses + if (licenses.has(pkg.license)) { + licenses.get(pkg.license).push(project.getName()); } else { - log.info(`Could not find package.json file in project ${project.getName()}`); + // License not yet in map. Define it + licenses.set(pkg.license, [project.getName()]); } - return processProject(project); - })); - } - // Start processing dependencies of the root project - await processProject(taskUtil.getProject()); - const summaryResource = createResource({ - path: "/dependency-license-summary.json", - string: JSON.stringify(Object.fromEntries(licenses), null, "\t") - }); - await workspace.write(summaryResource); - }; - ``` + } else { + log.info(`Could not find package.json file in project ${project.getName()}`); + } + return processProject(project); + })); + } + // Start processing dependencies of the root project + await processProject(taskUtil.getProject()); + + const summaryResource = createResource({ + path: "/dependency-license-summary.json", + string: JSON.stringify(Object.fromEntries(licenses), null, "\t") + }); + await workspace.write(summaryResource); +}; +``` ## Helper Class `TaskUtil` -Custom tasks defining [Specification Version](../Configuration.md#specification-versions) 2.2 or higher have access to an interface of a [TaskUtil](https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html) instance. +Custom tasks defining [Specification Version](../Configuration#specification-versions) 2.2 or higher have access to an interface of a [TaskUtil](https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html) instance. In this case, a `taskUtil` object is provided as a part of the custom task's [parameters](#task-implementation). Depending on the specification version of the custom task, a set of helper functions is available to the implementation. The lowest required specification version for every function is listed in the [TaskUtil API reference](https://ui5.github.io/cli/v4/api/@ui5_project_build_helpers_TaskUtil.html). diff --git a/packages/documentation/docs/pages/extensibility/ProjectShims.md b/packages/documentation/docs/pages/extensibility/ProjectShims.md index bdda5bd2cb8..2e80c9c5f19 100644 --- a/packages/documentation/docs/pages/extensibility/ProjectShims.md +++ b/packages/documentation/docs/pages/extensibility/ProjectShims.md @@ -1,7 +1,7 @@ ### Project Shims A project shim extension can be used to define or extend a project configuration of a module. The most popular use case is probably to add UI5 project configuration to a third party module that otherwise could not be used with the UI5 CLI. -Also see [RFC 0002 Project Shims](https://github.com/UI5/cli/blob/main/rfcs/0002-project-shims.md). +Also see [RFC 0002 Project Shims](https://github.com/UI5/cli/blob/main/rfcs/0002-project-shims). #### Structure ```yaml diff --git a/packages/documentation/docs/pages/index.md b/packages/documentation/docs/pages/index.md new file mode 100644 index 00000000000..f3f69b57e4c --- /dev/null +++ b/packages/documentation/docs/pages/index.md @@ -0,0 +1,144 @@ +![UI5 logo](../images/UI5_logo_wide.png) + +# UI5 CLI + +An open and modular toolchain to develop state-of-the-art applications based on the [UI5](https://ui5.sap.com) framework. + +::: warning Project Rename +**UI5 Tooling has been renamed to UI5 CLI 🚨** + +Read the announcement blog post: **[SAP Community: Goodbye UI5 Tooling - Hello UI5 CLI!](https://community.sap.com/t5/technology-blog-posts-by-sap/goodbye-ui5-tooling-hello-ui5-cli/ba-p/14211769)** +::: + +::: tip New Release +**UI5 CLI V4 is here 🎉** + +Read the announcement blog post: **[SAP Community: UI5 CLI 4.0](https://community.sap.com/t5/technology-blogs-by-sap/ui5-tooling-4-0/ba-p/13769578)** + +And checkout the **[Migrate to v4](../updates/migrate-v4)** documentation. +::: + + + +## Main Features + +### 💻 UI5 CLI + +*Also see the [UI5 CLI Documentation](./CLI)* + +```sh +# Global +npm install --global @ui5/cli + +# In your project +npm install --save-dev @ui5/cli +``` + +#### ⚙️ Project Setup + +Configure your project for use with UI5 CLI. +*Also see the [Configuration Documentation](./Configuration)* + +``` +❯ ui5 init +Wrote ui5.yaml: + +specVersion: "4.0 +metadata: + name: my-app +type: application +``` + +#### 🚚 Dependency Management + +UI5 framework dependencies are managed by UI5 CLI. All other dependencies are managed by your favorite node package manager. + +``` +❯ ui5 use SAPUI5@1.117.0 +Updated configuration written to ui5.yaml +This project is now using SAPUI5 version 1.117.0 + +❯ ui5 add sap.ui.core sap.m themelib_sap_fiori_3 +Updated configuration written to ui5.yaml +Added framework libraries sap.ui.core sap.m themelib_sap_fiori_3 as dependencies +``` + +#### 🏄 Development Server + +Start a local development server to work on your project. +*Also see the [Server Documentation](./Server)* + +``` +❯ ui5 serve +Server started +URL: http://localhost:8080 +``` + +#### 🛠 Build for Production + +Build an optimized version of your project. +*Also see the [Builder Documentation](./Builder)* + +``` bash +❯ ui5 build +info graph:helpers:ui5Framework Using OpenUI5 version: 1.117.0 +info ProjectBuilder Preparing build for project my-app +info ProjectBuilder Target directory: ./dist +info ProjectBuilder Cleaning target directory... +info Project 1 of 1: ❯ Building application project my-app... +info my-app › Running task escapeNonAsciiCharacters... +info my-app › Running task replaceCopyright... +info my-app › Running task replaceVersion... +info my-app › Running task minify... +info my-app › Running task generateFlexChangesBundle... +info my-app › Running task generateComponentPreload... +info ProjectBuilder Build succeeded in 296 ms +info ProjectBuilder Executing cleanup tasks... +``` + +### 🧪 Node.js API + +Most UI5 CLI modules provide JavaScript APIs for direct consumption in other Node.js projects. +This allows you to rely on UI5 CLI for UI5-specific build functionality and project handling, while creating your own tools to perfectly match the needs of your project. + +All available APIs are documented in the [UI5 CLI API Reference](https://ui5.github.io/cli/v4/api/index.html). + +#### ESM + +```js linenums="1 +import {graphFromPackageDependencies} from "@ui5/project/graph"; + +async function buildApp(projectPath, destinationPath) { + const graph = await graphFromPackageDependencies({ + cwd: projectPath + }); + await graph.build({ + destPath: destinationPath, + selfContained: true, + excludedTasks: ["transformBootstrapHtml"], + includedDependencies: ["*"] + }); +} +``` + +#### CommonJS + +```js linenums="1 +async function buildApp(projectPath, destinationPath) { + const {graphFromPackageDependencies} = + await import("@ui5/project/graph"); + const graph = await graphFromPackageDependencies({ + cwd: projectPath + }); + await graph.build({ + destPath: destinationPath, + selfContained: true, + excludedTasks: ["transformBootstrapHtml"], + includedDependencies: ["*"] + }); +} +``` diff --git a/packages/documentation/docs/pages/indexJsdoc.md b/packages/documentation/docs/pages/indexJsdoc.md new file mode 100644 index 00000000000..e05da464efd --- /dev/null +++ b/packages/documentation/docs/pages/indexJsdoc.md @@ -0,0 +1,7 @@ +# UI5 CLI API Reference + +## Support +Please follow our [Contribution Guidelines](https://github.com/UI5/cli/blob/main/CONTRIBUTING#report-an-issue) on how to report an issue. Or chat with us in the [`#tooling`](https://openui5.slack.com/archives/C0A7QFN6B) channel of the [OpenUI5 Community Slack](https://ui5-slack-invite.cfapps.eu10.hana.ondemand.com) + +## License +This project is licensed under the Apache Software License, Version 2.0 except as noted otherwise in the [LICENSE](https://github.com/UI5/cli/blob/main/LICENSE.txt) file. From a153524177e62ffb2d17cd652dc99e04756bb708 Mon Sep 17 00:00:00 2001 From: d3xter666 Date: Fri, 3 Oct 2025 11:14:17 +0300 Subject: [PATCH 08/51] fix: CLI.md parsing for vitepress --- packages/documentation/docs/pages/CLI.md | 393 +++++++++++++++++++++++ scripts/generateCliDoc.js | 8 +- 2 files changed, 399 insertions(+), 2 deletions(-) create mode 100644 packages/documentation/docs/pages/CLI.md diff --git a/packages/documentation/docs/pages/CLI.md b/packages/documentation/docs/pages/CLI.md new file mode 100644 index 00000000000..d08ff01c55f --- /dev/null +++ b/packages/documentation/docs/pages/CLI.md @@ -0,0 +1,393 @@ +# UI5 CLI +## Requirements +- [Node.js](https://nodejs.org/) version v20.11.0 and higher or v22.0.0 and higher (v21 is not supported) +- [npm](https://www.npmjs.com/) version v8.0.0 or higher + +## Installation + +Install the CLI using the npm package manager: + +```sh +npm install --global @ui5/cli + +# Verify installation +ui5 --help +``` + +## Usage/Syntax + +` + ui5 [options] +` + +The CLI automatically checks for updates using [update-notifier](https://github.com/yeoman/update-notifier). While this is skipped in CI environments, you might also opt-out manually by following the steps described [here](https://github.com/yeoman/update-notifier/blob/-/readme.md#user-settings). + +## Common options + +These options you can use with each command. + +| Option | Description | Details | +| --- | --- | --- | +| -h, --help | Show help | [boolean] | +| -v, --version | Show version number | [boolean] | +| -c, --config | Path to project configuration file in YAML format | [string] | +| --dependency-definition | Path to a YAML file containing the project's dependency tree. This option will disable resolution of node package dependencies. | [string] | +| --workspace-config | Path to workspace configuration file in YAML format | [string] | +| -w, --workspace | Name of the workspace configuration to use | [string] [default: "default"] | +| --loglevel, --log-level | Set the logging level | [string] [choices: "silent", "error", "warn", "info", "perf", "verbose", "silly"] [default: "info"] | +| --verbose | Enable verbose logging. | [boolean] [default: false] | +| --perf | Enable performance measurements and related logging. | [boolean] [default: false] | +| --silent | Disable all log output. | [boolean] [default: false] | + +## Examples + +Execute command using a static dependency tree instead of resolving node package dependencies +``` +ui5 --dependency-definition /path/to/projectDependencies.yaml +``` +Execute command using a project configuration from custom path +``` +ui5 --config /path/to/ui5.yaml +``` +Execute command using the 'dolphin' workspace of a ui5-workspace.yaml +``` +ui5 --workspace dolphin +``` +Execute command with the maximum log output +``` +ui5 --log-level silly +``` + +## Commands + +### ui5 add + +**Description** + +Add SAPUI5/OpenUI5 framework libraries to the project configuration. + +**Usage** + +` +ui5 add [--development] [--optional] +` + + +**Options** + +| Option | Description | Details | +| --- | --- | --- | +| -D, --development, --dev | Add as development dependency | [boolean] [default: false] | +| -O, --optional | Add as optional dependency | [boolean] [default: false] | + +**Positionals** + +| Positional | Description | Details | +| --- | --- | --- | +| framework-libraries | Framework library names | [array] [required] [default: []] | + +**Examples** + +Add the framework libraries sap.ui.core and sap.m as dependencies +``` +ui5 add sap.ui.core sap.m +``` +Add the framework library sap.ui.support as development dependency +``` +ui5 add -D sap.ui.support +``` +Add the framework library themelib_sap_fiori_3 as optional dependency +``` +ui5 add --optional themelib_sap_fiori_3 +``` +### ui5 build + +**Description** + +Build project in current directory + +**Usage** + +` +ui5 build +` + +**Child Commands** + +| Command | Description | +| --- | --- | +| ui5 build jsdoc | Build JSDoc resources | +| ui5 build preload | (default) Build project and create preload bundles | +| ui5 build self-contained | Build project and create self-contained bundle. Recommended to be used in conjunction with --include-all-dependencies | + +**Options** + +| Option | Description | Details | +| --- | --- | --- | +| -a, --include-all-dependencies, --all | Include all dependencies in the build result. This is equivalent to '--include-dependency "*"' | [boolean] [default: false] | +| --include-dependency | A list of dependencies to be included in the build result. You can use the asterisk '*' as an alias for including all dependencies in the build result. The listed dependencies cannot be overruled by dependencies defined in 'exclude-dependency'. The provided name must match with the dependency name shown in 'ui5 ls --flat' | [array] | +| --include-dependency-regexp | A list of regular expressions defining dependencies to be included in the build result. This list is prioritized like 'include-dependency'. | [array] | +| --include-dependency-tree | A list of dependencies to be included in the build result. Transitive dependencies are implicitly included and do not need to be part of this list. These dependencies overrule the selection of 'exclude-dependency-tree' but can be overruled by 'exclude-dependency'. | [array] | +| --exclude-dependency | A list of dependencies to be excluded from the build result. The listed dependencies can be overruled by dependencies defined in 'include-dependency'. The provided name must match with the dependency name shown in 'ui5 ls --flat' | [array] | +| --exclude-dependency-regexp | A list of regular expressions defining dependencies to be excluded from the build result. This list is prioritized like 'exclude-dependency'. | [array] | +| --exclude-dependency-tree | A list of dependencies to be excluded from the build result. Transitive dependencies are implicitly included and do not need to be part of this list. | [array] | +| --dest | Path of build destination | [string] [default: "./dist"] | +| --clean-dest | If present, clean the destination directory before building | [boolean] [default: false] | +| --create-build-manifest | Store build metadata in a '.ui5' directory in the build destination, allowing reuse of the build result in other builds | [boolean] [default: false] | +| --include-task | A list of tasks to be added to the default execution set. This option takes precedence over any excludes. | [array] | +| --exclude-task | A list of tasks to be excluded from the default task execution set | [array] | +| --framework-version | Overrides the framework version defined by the project. Takes the same value as the version part of "ui5 use" | [string] | +| --cache-mode | Cache mode to use when consuming SNAPSHOT versions of framework dependencies. The 'Default' behavior is to invalidate the cache after 9 hours. 'Force' uses the cache only and does not create any requests. 'Off' invalidates any existing cache and updates from the repository | [string] [choices: "Default", "Force", "Off"] [default: "Default"] | +| --experimental-css-variables | Generate CSS variables (css-variables.css, css-variables.source.less) and skeleton (library-skeleton(-RTL).css) for all themes | [boolean] [default: false] | +| --output-style | Processes build results into a specific directory structure.
- Flat: Omits the project namespace and the "resources" directory.
- Namespace: Respects the project namespace and the "resources" directory, maintaining the original structure.
- Default: The default directory structure for every project type. For applications, this is identical to "Flat", and for libraries, it is "Namespace". Other types have a more distinct default output style. | [string] [choices: "Default", "Flat", "Namespace"] [default: "Default"] | + + +**Examples** + +Preload build for project without dependencies +``` +ui5 build +``` +Self-contained build for project +``` +ui5 build self-contained +``` +Build project but only apply the minify- and generateComponentPreload tasks +``` +ui5 build --exclude-task=* --include-task=minify generateComponentPreload +``` +Build project by applying all default tasks including the minify task and excluding the generateComponentPreload task +``` +ui5 build --include-task=minify --exclude-task=generateComponentPreload +``` +Preload build with experimental CSS variables artifacts +``` +ui5 build --experimental-css-variables +``` +### ui5 config + +**Description** + +Get and set UI5 CLI configuration options + +**Usage** + +` +ui5 config +` + +**Child Commands** + +| Command | Description | +| --- | --- | +| ui5 config set <option> [value] | Set the value for a given configuration option. Clear an existing configuration by omitting the value | +| ui5 config get <option> | Get the value for a given configuration option | +| ui5 config list | Display the current configuration | + + + +**Examples** + +Set a value for the ui5DataDir configuration +``` +ui5 config set ui5DataDir /path/to/.ui5 +``` +Unset the current value of the ui5DataDir configuration +``` +ui5 config set ui5DataDir +``` +### ui5 init + +**Description** + +Initialize the UI5 CLI configuration for an application or library project. + +**Usage** + +` +ui5 init +` + + + + +### ui5 remove + +**Description** + +Remove SAPUI5/OpenUI5 framework libraries from the project configuration. + +**Usage** + +` +ui5 remove +` + + + +**Positionals** + +| Positional | Description | Details | +| --- | --- | --- | +| framework-libraries | Framework library names | [array] [required] [default: []] | + +**Examples** + +Remove the framework libraries sap.ui.core and sap.m as dependencies +``` +ui5 remove sap.ui.core sap.m +``` +### ui5 serve + +**Description** + +Start a web server for the current project + +**Usage** + +` +ui5 serve +` + + +**Options** + +| Option | Description | Details | +| --- | --- | --- | +| -p, --port | Port to bind on (default for HTTP: 8080, HTTP/2: 8443) | [number] | +| -o, --open | Open web server root directory in default browser. Optionally, supplied relative path will be appended to the root URL | [string] | +| --h2 | Shortcut for enabling the HTTP/2 protocol for the web server | [boolean] [default: false] | +| --simple-index | Use a simplified view for the server directory listing | [boolean] [default: false] | +| --accept-remote-connections | Accept remote connections. By default the server only accepts connections from localhost | [boolean] [default: false] | +| --key | Path to the private key | [string] [default: "~/.ui5/server/server.key"] | +| --cert | Path to the certificate | [string] [default: "~/.ui5/server/server.crt"] | +| --sap-csp-policies | Always send content security policies 'sap-target-level-1' and 'sap-target-level-3' in report-only mode | [boolean] [default: false] | +| --serve-csp-reports | Collects and serves CSP reports upon request to '/.ui5/csp/csp-reports.json' | [boolean] [default: false] | +| --framework-version | Overrides the framework version defined by the project. Takes the same value as the version part of "ui5 use" | [string] | +| --cache-mode | Cache mode to use when consuming SNAPSHOT versions of framework dependencies. The 'Default' behavior is to invalidate the cache after 9 hours. 'Force' uses the cache only and does not create any requests. 'Off' invalidates any existing cache and updates from the repository | [string] [choices: "Default", "Force", "Off"] [default: "Default"] | + + +**Examples** + +Start a web server for the current project +``` +ui5 serve +``` +Enable the HTTP/2 protocol for the web server (requires SSL certificate) +``` +ui5 serve --h2 +``` +Use the project configuration from a custom path +``` +ui5 serve --config /path/to/ui5.yaml +``` +Use a static dependency definition file +``` +ui5 serve --dependency-definition /path/to/projectDependencies.yaml +``` +Listen to port 1337 and launch default browser with http://localhost:1337/test/QUnit.html +``` +ui5 serve --port 1337 --open tests/QUnit.html +``` +### ui5 tree + +**Description** + +Outputs the dependency tree of the current project to stdout. It takes all relevant parameters of ui5 build into account. + +**Usage** + +` +ui5 tree +` + + +**Options** + +| Option | Description | Details | +| --- | --- | --- | +| --flat | Output a flat list of all dependencies instead of a tree hierarchy | [boolean] [default: false] | +| --level | Limit the number of levels shown in the tree hierarchy | [number] | +| --framework-version | Overrides the framework version defined by the project. Takes the same value as the version part of "ui5 use" | [string] | +| --cache-mode | Cache mode to use when consuming SNAPSHOT versions of framework dependencies. The 'Default' behavior is to invalidate the cache after 9 hours. 'Force' uses the cache only and does not create any requests. 'Off' invalidates any existing cache and updates from the repository | [string] [choices: "Default", "Force", "Off"] [default: "Default"] | +| | | | + + +### ui5 use + +**Description** + +Initialize or update the project's framework configuration. + +**Usage** + +` +ui5 use +` + + + +**Positionals** + +| Positional | Description | Details | +| --- | --- | --- | +| framework-info | Framework name, version or both (name@version).
Name can be "SAPUI5" or "OpenUI5" (case-insensitive).
Version can be "latest" (default), a version or range according to the Semantic Versioning specification (https://semver.org/), or a tag available in the npm registry.
For SAP-internal usage the version can also be "latest-snapshot", a version or range ending with -SNAPSHOT, or a simplified range such as "1-SNAPSHOT", "1.x-SNAPSHOT" or "1.108-SNAPSHOT". | [string] [required] | + +**Examples** + +Use SAPUI5 in the latest available version +``` +ui5 use sapui5@latest +``` +Use OpenUI5 in the latest available 1.76 patch version +``` +ui5 use openui5@1.76 +``` +Use the latest available version of the configured framework +``` +ui5 use latest +``` +Use OpenUI5 in the latest available version +``` +ui5 use openui5 +``` +### ui5 versions + +**Description** + +Shows the versions of all UI5 CLI modules + +**Usage** + +` +ui5 versions +` + + + + + +## Local vs. Global Installation +In general, we recommend a global installation of the UI5 CLI (`npm install --global @ui5/cli`). + +However, it makes sense to add the UI5 CLI as a [devDependency](https://docs.npmjs.com/files/package.json#devdependencies) (`npm install --save-dev @ui5/cli`) to a project's `package.json`. This ensures that every developer working on the project uses the same version of the UI5 CLI and your continuous integration environments also uses this version. + +In case you have both, a local installation in one of your projects as well as a global installation, the UI5 CLI will always try to invoke the local installation. This is in part because [npm scripts](https://docs.npmjs.com/misc/scripts) defined in your `package.json` will also always invoke the local installation. + +This behavior can be disabled by setting the environment variable `UI5_CLI_NO_LOCAL`. + +**Example** +You have a project located in the directory `/my-application`. + +You have installed the UI5 CLI globally. In addition, the project's `package.json` defines a `devDependency` to `@ui5/cli` and a start script `"ui5 serve"`. This means there are at least two installations of `@ui5/cli` on your system. Their versions might not match. + +This table illustrates which of the two installations is used in different scenarios. Note how the UI5 CLI always tries to prefer the version installed in the project. + +| Current Working Directory | Command | Global UI5 CLI | Local UI5 CLI | +| ------------------------- | ------------------------------- | :-----------------------------: | :----------------------------: | +| `/` | `ui5 --version` | enabled | +| `/my-application` | `ui5 --version` | | enabled | +| `/my-application` | `ui5 serve` | | enabled | +| `/my-application` | `UI5_CLI_NO_LOCAL=X ui5 serve` | enabled | +| `/my-application` | `npm start` | | enabled | +| `/my-application` | `UI5_CLI_NO_LOCAL=X npm start` | | enabled | diff --git a/scripts/generateCliDoc.js b/scripts/generateCliDoc.js index f44db6071a5..9ce8e62fd20 100644 --- a/scripts/generateCliDoc.js +++ b/scripts/generateCliDoc.js @@ -179,7 +179,11 @@ function generateDoc() { commands: commandsArray }); - content = content.split("<").join("<").split(">").join(">"); + content = content + .split("<").join("<") + .split(">").join(">") + // Escape