| name | fix-manifest-json |
| description | Fix manifest.json issues that UI5 linter reports but cannot auto-fix. Use this skill when linter outputs these rules:
- `no-outdated-manifest-version` - For _version not being 2.x
- `no-legacy-ui5-version-in-manifest` - For minUI5Version below 1.136
- `no-deprecated-library` - For deprecated libraries in dependencies
- `no-deprecated-component` - For deprecated components in dependencies
- `no-deprecated-api` - For deprecated view types, resources/js, deprecated model types
- `no-removed-manifest-property` - For async flags in manifest v2
Trigger on manifest.json files with errors about version, libraries, components, view types.
Automatically updates manifest.json to be modern UI5 compatible.
|
Fix manifest.json
This skill fixes manifest.json issues that the UI5 linter detects but cannot auto-fix because they may require understanding of the application's dependencies and structure.
Linter Rules Handled
| Rule ID | Message Pattern | This Skill's Action |
|---|
no-outdated-manifest-version | manifest.json must be modernized to Version 2 | Update _version to "2.0.0" |
no-legacy-ui5-version-in-manifest | Use UI5 version 1.136.0 or higher | Update minUI5Version to "1.136.0" |
no-deprecated-library | Use of deprecated library '...' | Remove from dependencies/libs |
no-deprecated-component | Use of deprecated component '...' | Remove from dependencies/components |
no-deprecated-api | Use of deprecated view type '...' | Change to "XML" |
no-deprecated-api | Use of deprecated property 'sap.ui5/resources/js' | Remove if empty |
no-deprecated-api | Use of deprecated class '...' (model types) | Flag for manual modernization |
no-removed-manifest-property | Property '...' has been removed in Manifest Version 2 | Remove the property |
When to Use
Apply this skill when you see linter output like:
manifest.json:2:3 error manifest.json must be modernized to Version 2 no-outdated-manifest-version
manifest.json:15:5 error Use UI5 version 1.136.0 or higher in manifest.json no-legacy-ui5-version-in-manifest
manifest.json:20:7 error Use of deprecated library 'sap.ui.commons' no-deprecated-library
manifest.json:25:7 error Use of deprecated view type 'JSON' no-deprecated-api
manifest.json:30:9 error Property '/sap.ui5/rootView/async' has been removed in Manifest Version 2 no-removed-manifest-property
Fix Strategy
1. no-outdated-manifest-version - Update _version to 2.0.0
IMPORTANT: Only update the root _version to "2.0.0". Do NOT change nested _version properties inside sap.app, sap.ui, sap.ui5, etc. — those should remain at their current values (e.g., "1.1.0", "1.2.0").
{
"_version": "1.12.0",
"sap.app": {
"_version": "1.1.0",
...
},
"sap.ui5": {
"_version": "1.2.0",
...
}
}
{
"_version": "2.0.0",
"sap.app": {
"_version": "1.1.0",
...
},
"sap.ui5": {
"_version": "1.2.0",
...
}
}
After updating to version 2.0.0, you MUST also apply these consequential changes:
- Remove async properties (see section 6)
- Rename routing configuration properties (see section 8)
- Add
type: "View" to routing config or targets (see section 8)
2. no-legacy-ui5-version-in-manifest - Update minUI5Version
"dependencies": {
"minUI5Version": "1.120.0",
...
}
"dependencies": {
"minUI5Version": "1.136.0",
...
}
If minUI5Version is an array, update all entries below 1.136.0.
3. no-deprecated-library - Remove Deprecated Libraries
Remove these deprecated libraries from sap.ui5/dependencies/libs:
sap.ui.commons - Use sap.m instead
sap.ui.ux3 - Use sap.m and sap.f instead
sap.makit - Use sap.viz instead
sap.me - Use sap.m instead
sap.ca.ui - Use standard controls
sap.landvisz - Deprecated
sap.ui.vtm - Deprecated
sap.sac.grid - Deprecated since 1.112, removed 1.114
sap.ui.suite - Deprecated since 1.108
sap.zen.commons - Deprecated since 1.89
sap.zen.crosstab - Deprecated since 1.89
sap.zen.dsh - Deprecated since 1.89
"libs": {
"sap.m": {},
"sap.ui.commons": {},
"sap.ui.layout": {}
}
"libs": {
"sap.m": {},
"sap.ui.layout": {}
}
4. no-deprecated-component - Remove Deprecated Components
Remove deprecated components from sap.ui5/dependencies/components.
5. no-deprecated-api - Fix View Types
Change deprecated view types to "XML" (or "Typed" for JS-heavy view cases):
JSON → XML
HTML → XML
JS → XML (or consider Typed view as an alternative for complex JS logic)
Template → XML
Applies to:
sap.ui5/rootView/type
sap.ui5/routing/config/viewType
sap.ui5/routing/targets/*/viewType
"rootView": {
"viewName": "my.app.view.Main",
"type": "JSON"
}
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML"
}
Important: When changing view types, the actual view file must also be converted to XML format. Flag this for manual review.
6. no-removed-manifest-property - Remove Async Properties (Manifest v2)
In manifest version 2.0.0+, the async flag is implicitly true for the root view and the routing configuration, so it must be removed from exactly these two locations:
sap.ui5/rootView/async
sap.ui5/routing/config/async
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML",
"async": true
}
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML"
}
SCOPE WARNING — do NOT remove async from anywhere else. The implicit-async behavior applies only to rootView and routing.config. Other locations where async may legitimately appear (and must be preserved) include:
sap.ui5/models/*/settings/async (e.g., OData/JSON model async loading flag)
sap.app/dataSources/* settings that include async
- Any custom configuration under
sap.ui5/extends, sap.ui5/componentUsages, or third-party namespaces
- Any
async inside route definitions that is not the top-level routing.config.async
The linter rule no-removed-manifest-property only fires for the two paths above. Trust the linter's pointer — only remove the exact properties it flags.
7. no-deprecated-api - Remove sap.ui5/resources/js
If the array is empty, remove the entire js property (and resources if it becomes empty).
"resources": {
"js": []
}
If not empty, this requires manual modernization to proper module dependencies.
8. Routing Configuration — Rename Properties for Manifest Version 2
When _version is updated to "2.0.0", the routing configuration properties must also be renamed. The view-prefixed property names are deprecated in version 2.
Property renaming rules:
| Old Property (v1.x) | New Property (v2.0.0) | Where |
|---|
viewPath | path | routing.config |
viewName | name | routing.config and routing.targets.* |
viewId | id | routing.targets.* |
viewLevel | level | routing.targets.* |
viewType | viewType | Unchanged — keep as-is |
New required property:
| Property | Value | Where |
|---|
type | "View" | routing.config (applies to all targets) OR each individual routing.targets.* entry |
Before (v1.x):
"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"viewPath": "my.app.view",
"controlId": "app",
"controlAggregation": "pages",
"async": true
},
"routes": [
{
"name": "main",
"pattern": "",
"target": "main"
}
],
"targets": {
"main": {
"viewName": "Main",
"viewId": "main",
"viewLevel": 1
},
"detail": {
"viewName": "Detail",
"viewId": "detail",
"viewLevel": 2
}
}
}
After (v2.0.0):
"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"path": "my.app.view",
"controlId": "app",
"controlAggregation": "pages",
"type": "View"
},
"routes": [
{
"name": "main",
"pattern": "",
"target": "main"
}
],
"targets": {
"main": {
"name": "Main",
"id": "main",
"level": 1
},
"detail": {
"name": "Detail",
"id": "detail",
"level": 2
}
}
}
Changes summary:
viewPath → path in config
viewName → name in each target
viewId → id in each target
viewLevel → level in each target
viewType stays as viewType (unchanged)
async removed only from routing.config (implicit true in v2). Do NOT touch async on models, dataSources, or other unrelated config — see Section 6 scope warning.
type: "View" added to config (alternatively, add "type": "View" to each individual target if mixing views and components)
When to add type to config vs per target:
type in config (most common): All targets are views
type per target: Mixed routing targets (some views, some components)
Implementation Steps
- Read and parse the manifest.json file
- For each linter error (identified by rule ID and message):
no-outdated-manifest-version: Update root _version to "2.0.0" (keep nested _version values unchanged)
no-legacy-ui5-version-in-manifest: Update minUI5Version to "1.136.0"
no-deprecated-library: Remove the library from dependencies
no-deprecated-component: Remove the component from dependencies
no-deprecated-api (view type): Change to "XML"
no-deprecated-api (resources/js): Remove if empty
no-removed-manifest-property: Remove the property
- If
_version was updated to 2.0.0, also apply routing modernization:
- Rename
viewPath → path, viewName → name, viewId → id, viewLevel → level in routing config and targets
- Add
type: "View" to routing.config (or per target)
- Remove
async only from sap.ui5/rootView and sap.ui5/routing/config. Do NOT remove async from model settings, dataSources, or any other path — those keep their async flag.
- Preserve JSON formatting (indentation)
- Write the updated file
Example Fix
Given linter output:
manifest.json:2:3 error manifest.json must be modernized to Version 2 no-outdated-manifest-version
manifest.json:15:5 error Use UI5 version 1.136.0 or higher in manifest.json no-legacy-ui5-version-in-manifest
manifest.json:20:7 error Use of deprecated library 'sap.ui.commons' no-deprecated-library
manifest.json:35:9 error Property '/sap.ui5/rootView/async' has been removed in Manifest Version 2 no-removed-manifest-property
manifest.json:40:9 error Property '/sap.ui5/routing/config/async' has been removed in Manifest Version 2 no-removed-manifest-property
Transform:
{
"_version": "1.12.0",
"sap.app": {
"_version": "1.1.0",
...
},
"sap.ui5": {
"_version": "1.2.0",
"dependencies": {
"minUI5Version": "1.84.0",
"libs": {
"sap.m": {},
"sap.ui.commons": {},
"sap.ui.layout": {}
}
},
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML",
"async": true
},
"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"viewPath": "my.app.view",
"controlId": "app",
"controlAggregation": "pages",
"async": true
},
"routes": [
{ "name": "main", "pattern": "", "target": "main" }
],
"targets": {
"main": {
"viewName": "Main",
"viewId": "main",
"viewLevel": 1
}
}
}
}
}
{
"_version": "2.0.0",
"sap.app": {
"_version": "1.1.0",
...
},
"sap.ui5": {
"_version": "1.2.0",
"dependencies": {
"minUI5Version": "1.136.0",
"libs": {
"sap.m": {},
"sap.ui.layout": {}
}
},
"rootView": {
"viewName": "my.app.view.Main",
"type": "XML"
},
"routing": {
"config": {
"routerClass": "sap.m.routing.Router",
"viewType": "XML",
"path": "my.app.view",
"controlId": "app",
"controlAggregation": "pages",
"type": "View"
},
"routes": [
{ "name": "main", "pattern": "", "target": "main" }
],
"targets": {
"main": {
"name": "Main",
"id": "main",
"level": 1
}
}
}
}
}
Notes
- Only update the root
_version to 2.0.0 — do NOT change nested _version properties inside sap.app, sap.ui, sap.ui5, etc.
- When updating
_version to 2.0.0, always apply routing property renames and add type: "View" in the same pass
- Changing view types from JSON/HTML/JS to XML requires the actual view files to be converted - flag this as a follow-up task
- When removing deprecated libraries, check if there are any imports from those libraries in the codebase that need modernization
- The
minUI5Version update means the app won't run on older UI5 versions - this is intentional for modern UI5 compatibility
- After updating
_version to 2.0.0, synchronizationMode and other v1-specific properties should also be removed if present
- Manifest v2 strictness: Manifest v2.0.0 enables stricter error handling — syntactical errors in views/fragments now throw errors instead of failing silently
sap.ui/supportedThemes causes an error in manifest v2 — remove it if present
IAsyncContentCreation is NOT enforced by manifest v2 — it must be explicitly added in Component.js by the fix-component-async skill (this skill does not handle it)
- Typed View alternative: When changing deprecated view types (
JS, JSON, HTML) the default replacement is XML, but for complex JS-heavy views, consider Typed views as an alternative
Related Skills
- fix-component-async: After updating manifest.json, Component.js needs the
IAsyncContentCreation interface — defer to that skill for correct placement
- fix-bootstrap-params: For deprecated libraries referenced in HTML bootstrap (
data-sap-ui-libs), use fix-bootstrap-params instead of this skill