Skip to content
Back to skills

Source C7276cb8916354b968815bc3

ASecurity

Fix Library.init() apiVersion issues and modernize enums to DataType.registerEnum. Use this skill when linter outputs: - `no-deprecated-api` with message "Deprecated call to ... Use the {apiVersion: 2} parameter instead" Trigger on library.js files with errors about: "Deprecated call to", "Lib.init", "Library.init", "{apiVersion: 2} parameter" Adds apiVersion: 2 to Library.init() calls and modernizes enum definitions to use DataType.registerEnum, which is required for type validation when usi...

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 7, 2026
developmentjavascriptgojavabashapi

Works with

  • api

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned November 7, 2026

npx -y skills add gutsofpratik/OpenClaude-Skills --skill source-c7276cb8916354b968815bc3 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Source C7276cb8916354b968815bc3?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Source C7276cb8916354b968815bc3
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/gutsofpratik-source-c7276cb8916354b968815bc3/badge)](https://www.skillsdirectory.com/skills/gutsofpratik-source-c7276cb8916354b968815bc3)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: fix-library-init
description: |
  Fix Library.init() apiVersion issues and modernize enums to DataType.registerEnum. Use this skill when linter outputs:
  - `no-deprecated-api` with message "Deprecated call to ... Use the {apiVersion: 2} parameter instead"
  Trigger on library.js files with errors about: "Deprecated call to", "Lib.init", "Library.init", "{apiVersion: 2} parameter"
  Adds apiVersion: 2 to Library.init() calls and modernizes enum definitions to use DataType.registerEnum, which is required for type validation when using apiVersion: 2.
---

# Fix Library.init() Modernization

This skill fixes `Library.init()` / `Lib.init()` calls that the UI5 linter detects as missing `apiVersion: 2`, and modernizes enum definitions to use `DataType.registerEnum` — which is required when using `apiVersion: 2`.

## Linter Rules Handled

| Rule ID | Message Pattern | This Skill's Action |
|---------|-----------------|---------------------|
| `no-deprecated-api` | Deprecated call to Library.init(). Use the {apiVersion: 2} parameter instead | Add `apiVersion: 2` to the init call |
| `no-deprecated-api` | Deprecated call to Lib.init(). Use the {apiVersion: 2} parameter instead | Add `apiVersion: 2` to the init call |
| `no-deprecated-api` | Deprecated call to init(). Use the {apiVersion: 2} parameter instead | Add `apiVersion: 2` (destructured init) |

## When to Use

Apply this skill when you see linter output like:
```
library.js:9:2 error Deprecated call to Library.init(). Use the {apiVersion: 2} parameter instead  no-deprecated-api
library.js:11:2 error Deprecated call to Lib.init(). Use the {apiVersion: 2} parameter instead  no-deprecated-api
library.js:51:2 error Deprecated call to init(). Use the {apiVersion: 2} parameter instead  no-deprecated-api
```

## Background: What Library.init() Does

`sap/ui/core/Lib.init()` registers a UI5 library with the framework, declaring its metadata: name, dependencies, controls, elements, types (enums), and interfaces. The `apiVersion: 2` parameter signals that the library uses the modern initialization pattern.

**Important**: Only `apiVersion: 2` is valid for `Lib.init()`. Unlike control renderers where `apiVersion: 4` is also valid, library initialization only accepts `2`.

## Fix Strategy

### 1. No Arguments

**Problem**: `Lib.init()` called with no arguments at all.

```javascript
// Before — triggers no-deprecated-api
sap.ui.define([
    "sap/ui/core/Lib"
], function(Library) {
    "use strict";

    Library.init();
});
```

**Fix**: Add an object argument with `apiVersion: 2`.

```javascript
// After
sap.ui.define([
    "sap/ui/core/Lib"
], function(Library) {
    "use strict";

    Library.init({
        apiVersion: 2
    });
});
```

### 2. Object Argument Without apiVersion

**Problem**: `Lib.init()` receives an object but it has no `apiVersion` property.

```javascript
// Before — triggers no-deprecated-api
Library.init({
    name: "my.lib",
    dependencies: ["sap.ui.core", "sap.m"]
});
```

**Fix**: Add `apiVersion: 2` as the first property in the object.

```javascript
// After
Library.init({
    apiVersion: 2,
    name: "my.lib",
    dependencies: ["sap.ui.core", "sap.m"]
});
```

### 3. apiVersion Is Not a Number

**Problem**: `apiVersion` is a string instead of a numeric literal.

```javascript
// Before — triggers no-deprecated-api
Library.init({
    apiVersion: "2"
});
```

**Fix**: Change to numeric literal `2`.

```javascript
// After
Library.init({
    apiVersion: 2
});
```

### 4. apiVersion Is Wrong Number

**Problem**: `apiVersion` is a number but not `2`.

```javascript
// Before — triggers no-deprecated-api
Library.init({
    apiVersion: 1
});
```

**Fix**: Change to `2`.

```javascript
// After
Library.init({
    apiVersion: 2
});
```

### 5. Element Access Syntax

The same patterns apply when `init` is called via bracket notation:

```javascript
// Before
Library["init"]({
    apiVersion: 1,
    dependencies: ["sap.ui.core"]
});

// After
Library["init"]({
    apiVersion: 2,
    dependencies: ["sap.ui.core"]
});
```

### 6. Destructured or Assigned init

The linter also detects these patterns:

```javascript
// Assignment
const LibInit = Library.init;
LibInit({ apiVersion: 1 });

// Destructuring
const {init} = Library;
init({ apiVersion: 1 });

// Destructuring with rename
const {init: libInit} = Library;
libInit({ apiVersion: 1 });
```

**Fix**: Same — change `apiVersion` to `2` in each call.

## Modernize Enums to DataType.registerEnum

When upgrading `Lib.init()` to `apiVersion: 2`, the old approach of defining enums on the global namespace no longer works. The framework cannot resolve type strings used in control metadata without explicit registration, which can lead to **XSS vulnerabilities** because type checking is silently skipped.

This skill must **find existing enum definitions** in the library.js and **modernize them** to use `DataType.registerEnum`.

### How to Find Enums

1. **Check the `types` array** in the `Lib.init()` call — it lists the fully qualified names of all types (enums) defined by the library
2. **Search for global namespace assignments** — e.g. `my.lib.ValueColor = { ... }` where `my.lib` is the library namespace
3. **Look for existing enum objects** defined as plain objects with string key-value pairs

### Modernization Steps

1. **Capture the return value** of `Lib.init()` in a variable if not already done:
   ```javascript
   // Before
   Library.init({ name: "my.lib", apiVersion: 2, types: ["my.lib.ValueColor"] });

   // After
   var oThisLibrary = Library.init({ name: "my.lib", apiVersion: 2, types: ["my.lib.ValueColor"] });
   ```

2. **Move enum definitions** from the global namespace to the library object:
   ```javascript
   // Before — global namespace
   my.lib.ValueColor = { Color1: "Color1", Color2: "Color2" };

   // After — on library object
   oThisLibrary.ValueColor = { Color1: "Color1", Color2: "Color2" };
   ```

3. **Add `DataType.registerEnum` call** immediately after each enum definition:
   ```javascript
   oThisLibrary.ValueColor = { Color1: "Color1", Color2: "Color2" };
   DataType.registerEnum("my.lib.ValueColor", oThisLibrary.ValueColor);
   ```

4. **Add `sap/ui/base/DataType`** to the `sap.ui.define` dependency list if not already present:
   ```javascript
   sap.ui.define([
       "sap/ui/base/DataType",  // Add this
       "sap/ui/core/Lib"
   ], function(DataType, Library) {
   ```

### Key Rules

- The first argument to `registerEnum` must **exactly match** the string used as `type` in control metadata (e.g. `"my.lib.ValueColor"`)
- All enum definitions should stay in `library.js` for library preload compatibility
- Each enum listed in the `types` array needs its own `registerEnum` call

## Complete Example

### Before

```javascript
/*!
 * ${copyright}
 */
sap.ui.define([
    "sap/ui/core/Lib"
], function(Library) {
    "use strict";

    Library.init({
        name: "my.lib",
        dependencies: ["sap.ui.core", "sap.m"],
        types: [
            "my.lib.ValueColor",
            "my.lib.StatusType"
        ],
        controls: [
            "my.lib.MyControl"
        ]
    });

    // Enums defined on global namespace
    my.lib.ValueColor = {
        Good: "Good",
        Critical: "Critical",
        Error: "Error",
        Neutral: "Neutral"
    };

    my.lib.StatusType = {
        Active: "Active",
        Inactive: "Inactive"
    };
});
```

### After

```javascript
/*!
 * ${copyright}
 */
sap.ui.define([
    "sap/ui/base/DataType",
    "sap/ui/core/Lib"
], function(DataType, Library) {
    "use strict";

    var oThisLibrary = Library.init({
        apiVersion: 2,
        name: "my.lib",
        dependencies: ["sap.ui.core", "sap.m"],
        types: [
            "my.lib.ValueColor",
            "my.lib.StatusType"
        ],
        controls: [
            "my.lib.MyControl"
        ]
    });

    oThisLibrary.ValueColor = {
        Good: "Good",
        Critical: "Critical",
        Error: "Error",
        Neutral: "Neutral"
    };
    DataType.registerEnum("my.lib.ValueColor", oThisLibrary.ValueColor);

    oThisLibrary.StatusType = {
        Active: "Active",
        Inactive: "Inactive"
    };
    DataType.registerEnum("my.lib.StatusType", oThisLibrary.StatusType);

    return oThisLibrary;
});
```

## Implementation Steps

1. **Run linter with --details** to get additional context:
   ```bash
   npx @ui5/linter --details
   ```

2. **Read the library.js file** and identify:
   - The `Lib.init()` / `Library.init()` call and its current arguments
   - Whether the return value is captured in a variable
   - Any enum definitions (check `types` array and global namespace assignments)

3. **Fix the apiVersion**:
   - If no arguments: add `{ apiVersion: 2 }`
   - If object without apiVersion: add `apiVersion: 2` as the first property
   - If apiVersion is wrong value or type: change to numeric `2`

4. **Modernize enums** (if any exist):
   - Capture `Lib.init()` return value in a variable if not already done
   - Move each enum from global namespace to the library object
   - Add `DataType.registerEnum` call for each enum
   - Add `sap/ui/base/DataType` to the dependency list

5. **Ensure the module returns the library object** (`return oThisLibrary;`)

6. **Verify the fix** by re-running the linter

## Notes

- Only `apiVersion: 2` is valid for `Lib.init()` — `apiVersion: 4` is NOT valid (that is for renderers only)
- `apiVersion` must be a numeric literal, not a string
- Libraries without enums only need the `apiVersion: 2` fix (no `DataType.registerEnum` needed)
- If the library already returns the init result and has no global enum definitions, only the apiVersion fix is needed
- The `types` array in the init call is your guide to which enums need `registerEnum` calls

## Related Skills

- **fix-control-renderer**: For renderer `apiVersion` issues (missing `apiVersion: 2` or `4` in renderer objects) — different from library init apiVersion
- **fix-pseudo-modules**: If consumer code imports enums via pseudo-modules (e.g. `sap.ui.require(["my/lib/ValueColor"])`), use fix-pseudo-modules to convert them to library module imports
- **fix-js-globals**: If library.js also has global access patterns beyond enum definitions (e.g. `sap.ui.getCore()`), use fix-js-globals for those

Files in this skill

  • PROVENANCE.json236 B
  • SKILL.md10.1 KB
  • UPSTREAM-LICENSE.txt11.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.