# Fix Manifest JSON

> 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.

- Skill: `ui5/fix-manifest-json` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ui5/fix-manifest-json`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ui5/fix-manifest-json/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: ui5 (https://skillmd.com/u/ui5)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ui5/fix-manifest-json

---


# 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"`).

```json
// Before
{
  "_version": "1.12.0",
  "sap.app": {
    "_version": "1.1.0",
    ...
  },
  "sap.ui5": {
    "_version": "1.2.0",
    ...
  }
}

// After — only root _version changed
{
  "_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`

```json
// Before
"dependencies": {
  "minUI5Version": "1.120.0",
  ...
}

// After
"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

```json
// Before
"libs": {
  "sap.m": {},
  "sap.ui.commons": {},
  "sap.ui.layout": {}
}

// After
"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`

```json
// Before
"rootView": {
  "viewName": "my.app.view.Main",
  "type": "JSON"
}

// After
"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`

```json
// Before (v2)
"rootView": {
  "viewName": "my.app.view.Main",
  "type": "XML",
  "async": true
}

// After (v2)
"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).

```json
// Before
"resources": {
  "js": []
}

// After
// (resources section removed if empty)
```

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):**
```json
"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):**
```json
"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

1. Read and parse the manifest.json file
2. 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
3. **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.
4. Preserve JSON formatting (indentation)
5. 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:
```json
// Before
{
  "_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
        }
      }
    }
  }
}

// After
{
  "_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

