# UI5 Linter - Configuration Complete Reference **Source**: [https://github.com/UI5/linter/blob/main/README.md](https://github.com/UI5/linter/blob/main/README.md) **Last Updated**: 2025-11-21 **UI5 Linter Version**: 1.20.5 --- ## Configuration Overview UI5 Linter supports configuration files to customize linting behavior, define ignore patterns, and specify target files. Configuration is optional but recommended for projects with specific requirements. --- ## Configuration File Location ### Requirements Configuration files **must**: - Reside in the project root directory - Be in the same directory as `ui5.yaml` and `package.json` - Use one of the supported filenames ### Supported Filenames | Filename | Module Type | Recommended | |----------|-------------|-------------| | `ui5lint.config.js` | Auto-detected (based on package.json) | ✅ General use | | `ui5lint.config.mjs` | ES Module | ✅ ESM projects | | `ui5lint.config.cjs` | CommonJS | ✅ CJS projects | **Detection Order**: 1. `ui5lint.config.js` 2. `ui5lint.config.mjs` 3. `ui5lint.config.cjs` The first file found is used. --- ## Configuration File Formats ### ES Module (ESM) Format **File**: `ui5lint.config.mjs` or `ui5lint.config.js` (with `"type": "module"` in package.json) ```javascript export default { ignores: [ "webapp/thirdparty/**", "webapp/test/**", "!webapp/test/integration/**", ], files: [ "webapp/**/*.js", "webapp/**/*.xml", ], }; ``` **When to Use**: - Modern JavaScript projects - Projects using `"type": "module"` in package.json - New projects (recommended) --- ### CommonJS Format **File**: `ui5lint.config.cjs` or `ui5lint.config.js` (without `"type": "module"`) ```javascript module.exports = { ignores: [ "webapp/thirdparty/**", "webapp/test/**", "!webapp/test/integration/**", ], files: [ "webapp/**/*.js", "webapp/**/*.xml", ], }; ``` **When to Use**: - Traditional Node.js projects - Projects without ESM support - Legacy projects --- ## Configuration Options ### ignores **Type**: `string[]` **Description**: Array of glob patterns to exclude files from analysis. **Default**: `[]` (no files ignored) **Pattern Characteristics**: - Relative to project root - Supports glob syntax (`*`, `**`, `?`, `[]`, `{}`) - Supports negation with `!` prefix - **Order matters**: Later patterns override earlier ones **Basic Examples**: ```javascript export default { ignores: [ // Ignore entire directory "webapp/thirdparty/**", // Ignore all test files "**/*.test.js", "**/*.spec.js", // Ignore specific file "webapp/libs/legacy.js", ], }; ``` **Advanced Patterns**: ```javascript export default { ignores: [ // Ignore all test directories "webapp/test/**", // BUT include integration tests (negation) "!webapp/test/integration/**", // Ignore generated files "dist/**", "build/**", // Ignore third-party libraries "webapp/thirdparty/**", "webapp/vendor/**", "node_modules/**", // Usually excluded by default // Ignore specific file types "**/*.min.js", "**/*.bundle.js", ], }; ``` **Negation Example**: ```javascript export default { ignores: [ // Ignore all test files "webapp/test/**", // Except integration tests "!webapp/test/integration/**", // And except this specific file "!webapp/test/TestUtils.js", ], }; ``` **Pattern Order Matters**: ```javascript // ❌ WRONG: Negation comes first, then overridden export default { ignores: [ "!webapp/test/integration/**", // Won't work as expected "webapp/test/**", // This overrides above ], }; // ✅ CORRECT: Broader pattern first, then negation export default { ignores: [ "webapp/test/**", // Ignore all tests "!webapp/test/integration/**", // Except integration tests ], }; ``` **Common Use Cases**: ```javascript // UI5 Application export default { ignores: [ "webapp/thirdparty/**", // Third-party libs "webapp/localService/**", // Mock data "webapp/test/**", // Tests "!webapp/test/integration/**", // Keep integration tests ], }; // UI5 Library export default { ignores: [ "test/**", // Test files "docs/**", // Documentation ".internal/**", // Internal dev files ], }; // Fiori Elements App export default { ignores: [ "webapp/ext/**", // Extensions (might use legacy patterns) "webapp/localService/**", // Mock server "webapp/test/**", // Tests ], }; ``` --- ### files **Type**: `string[]` **Description**: Array of glob patterns specifying which files to lint. **Default**: All files in project (except default exclusions) **Restrictions**: - ❌ Cannot include files typically excluded (e.g., `node_modules/`) - ❌ Cannot include non-webapp directories in applications - ✅ Must use POSIX separators (`/`) regardless of platform **Basic Examples**: ```javascript export default { files: [ // Lint all JavaScript in webapp "webapp/**/*.js", // Lint all XML views "webapp/**/*.xml", // Lint manifest "webapp/manifest.json", ], }; ``` **Target Specific Areas**: ```javascript export default { files: [ // Controllers only "webapp/controller/**/*.js", // Views and fragments "webapp/view/**/*.xml", "webapp/fragment/**/*.xml", // Component and manifest "webapp/Component.js", "webapp/manifest.json", ], }; ``` **Multi-Language Projects**: ```javascript export default { files: [ // JavaScript "webapp/**/*.js", // TypeScript "webapp/**/*.ts", // XML "webapp/**/*.xml", // YAML "ui5.yaml", "ui5-*.yaml", ], }; ``` **Library Projects**: ```javascript export default { files: [ "src/**/*.js", // Source files "src/**/*.xml", // Control templates "src/**/*.json", // Metadata ], }; ``` --- ## Complete Configuration Examples ### Example 1: Basic UI5 Application ```javascript // ui5lint.config.mjs export default { ignores: [ "webapp/thirdparty/**", "webapp/test/**", ], }; ``` **Explanation**: - Ignores third-party libraries - Ignores all test files - Lints everything else in the project --- ### Example 2: Advanced Application with Selective Testing ```javascript // ui5lint.config.mjs export default { ignores: [ // Third-party code "webapp/thirdparty/**", "webapp/vendor/**", // Mock data "webapp/localService/**", // All tests "webapp/test/**", // Except integration and unit tests "!webapp/test/integration/**", "!webapp/test/unit/**", // Ignore generated files "dist/**", "build/**", // Ignore minified files "**/*.min.js", ], files: [ "webapp/**/*.js", "webapp/**/*.xml", "webapp/manifest.json", ], }; ``` --- ### Example 3: UI5 Library ```javascript // ui5lint.config.mjs export default { ignores: [ "test/**", "docs/**", ".internal/**", "playground/**", ], files: [ "src/**/*.js", "src/**/*.xml", "src/**/*.json", ], }; ``` --- ### Example 4: TypeScript Project ```javascript // ui5lint.config.mjs export default { ignores: [ "webapp/thirdparty/**", "dist/**", "**/*.d.ts", // Ignore type definitions ], files: [ "webapp/**/*.ts", "webapp/**/*.xml", "webapp/manifest.json", ], }; ``` --- ### Example 5: Monorepo with Multiple Apps ```javascript // ui5lint.config.mjs (in root) export default { ignores: [ "**/thirdparty/**", "**/test/**", "**/dist/**", "node_modules/**", ], files: [ "apps/*/webapp/**/*.js", "apps/*/webapp/**/*.xml", "apps/*/webapp/manifest.json", ], }; ``` --- ### Example 6: Fiori Elements Application ```javascript // ui5lint.config.mjs export default { ignores: [ // Standard ignores "webapp/localService/**", "webapp/test/**", // Fiori Elements ignores "webapp/ext/**", // Extensions might use legacy patterns // Generated files "webapp/changes/**", // UI Adaptation changes ], files: [ "webapp/manifest.json", "webapp/Component.js", "webapp/ext/**/*.js", // Lint extensions separately if needed ], }; ``` --- ## Using CLI Options to Override Config CLI options can override or extend configuration file settings. ### Override Ignore Patterns ```bash # Add additional ignore pattern ui5lint --ignore-pattern "webapp/experimental/**" # Multiple additional patterns ui5lint --ignore-pattern "**/*.old.js" --ignore-pattern "webapp/archive/**" ``` **Note**: CLI patterns are **added to** config file patterns, not replaced. --- ### Override File Patterns ```bash # Lint specific files (ignores config file 'files' option) ui5lint "webapp/controller/**/*.js" # Lint specific areas ui5lint "webapp/view/" "webapp/fragment/" ``` **Note**: Positional file arguments **override** the config file `files` option. --- ### Use Custom Config File ```bash # Use different config ui5lint --config config/lint-strict.config.js # Use environment-specific config ui5lint --config .ui5lint.ci.config.js ``` --- ## Integration with package.json ### Add npm Script ```json { "scripts": { "lint": "ui5lint", "lint:fix": "ui5lint --fix", "lint:ci": "ui5lint --quiet --format json > lint-results.json" } } ``` ### Usage ```bash npm run lint npm run lint:fix npm run lint:ci ``` --- ## Integration with ui5.yaml UI5 Linter reads `ui5.yaml` to understand project structure. ### Custom ui5.yaml Location ```bash ui5lint --ui5-config config/ui5-dev.yaml ``` ### Example ui5.yaml ```yaml specVersion: "3.0" type: application metadata: name: my.app resources: configuration: paths: webapp: webapp builder: resources: excludes: - "/test/**" - "/localService/**" ``` **Note**: UI5 Linter respects UI5 Tooling configuration but uses its own ignore patterns from config file. --- ## Platform-Specific Considerations ### Path Separators **Always use POSIX separators (`/`)** in configuration files, regardless of platform: ```javascript // ✅ CORRECT (works on all platforms) export default { ignores: [ "webapp/thirdparty/**", ], }; // ❌ WRONG (doesn't work) export default { ignores: [ "webapp\\thirdparty\\**", // Windows-style separators ], }; ``` ### Case Sensitivity **File systems**: - Linux/macOS: Case-sensitive - Windows: Case-insensitive (usually) **Recommendation**: Always match exact case in patterns. ```javascript // ✅ CORRECT: Match exact case export default { ignores: [ "webapp/ThirdParty/**", // If directory is "ThirdParty" ], }; ``` --- ## Debugging Configuration ### Verbose Output See which files are being processed: ```bash ui5lint --verbose ``` **Output**: ``` verbose Loading configuration from /project/ui5lint.config.js verbose Ignoring: webapp/thirdparty/** verbose Processing: webapp/controller/Main.controller.js verbose Processing: webapp/view/Main.view.xml ... ``` ### Test Patterns Use `--ignore-pattern` to test without modifying config: ```bash # Test if pattern works ui5lint --ignore-pattern "webapp/test/**" --verbose ``` --- ## Common Configuration Patterns ### Gradual Migration ```javascript // Start with strict ignores, gradually reduce export default { ignores: [ // Ignore everything except what we've migrated "webapp/**", // Include migrated files "!webapp/controller/Main.controller.js", "!webapp/view/Main.view.xml", ], }; ``` ### Focus on Specific Issues ```javascript // Lint manifest and component only export default { files: [ "webapp/manifest.json", "webapp/Component.js", ], }; ``` ### Exclude Generated Code ```javascript export default { ignores: [ "**/*.gen.js", // Generated JavaScript "**/gen/**", // Generated directory "dist/**", // Distribution build "build/**", // Build output "webapp/changes/**", // UI Adaptation changes ], }; ``` --- ## Environment-Specific Configurations ### Development Config ```javascript // ui5lint.config.js export default { ignores: [ "webapp/thirdparty/**", // Allow test files in development ], }; ``` ### CI/CD Config ```javascript // .ui5lint.ci.config.js export default { ignores: [ "webapp/thirdparty/**", "webapp/test/**", // Ignore all tests in CI "webapp/localService/**", ], }; ``` **Usage**: ```bash # CI pipeline ui5lint --config .ui5lint.ci.config.js --quiet --format json ``` --- ## Best Practices ### 1. Start Broad, Then Narrow ```javascript // Start with broad ignores export default { ignores: [ "webapp/thirdparty/**", "webapp/test/**", ], }; // Later, as code improves, reduce ignores export default { ignores: [ "webapp/thirdparty/**", "webapp/test/**", "!webapp/test/integration/**", // Now lint integration tests ], }; ``` ### 2. Document Complex Patterns ```javascript export default { ignores: [ // Third-party libraries (no control over code quality) "webapp/thirdparty/**", // Mock data (auto-generated from OData metadata) "webapp/localService/**", // Legacy code (planned for refactor in Q2) "webapp/legacy/**", ], }; ``` ### 3. Use Consistent Patterns ```javascript // ✅ GOOD: Consistent pattern style export default { ignores: [ "webapp/thirdparty/**", "webapp/vendor/**", "webapp/test/**", ], }; // ❌ BAD: Inconsistent patterns export default { ignores: [ "webapp/thirdparty/**", // Double star "webapp/vendor/*", // Single star "webapp/test", // No star ], }; ``` ### 4. Version Control Configuration **Commit** configuration file: ```bash git add ui5lint.config.js git commit -m "Add UI5 Linter configuration" ``` **Document** in README: ```markdown ## Linting ```bash npm run lint ``` Configuration: `ui5lint.config.js` ``` --- ## Troubleshooting ### Issue: Config File Not Found **Symptoms**: Linter uses default settings despite config file existing. **Solutions**: 1. Verify filename exactly matches: `ui5lint.config.{js,mjs,cjs}` 2. Ensure file is in project root (same as `ui5.yaml`) 3. Check file extension matches module type 4. Verify no syntax errors in config file --- ### Issue: Patterns Not Working **Symptoms**: Files still linted despite ignore patterns. **Solutions**: 1. Verify POSIX separators (`/` not `\`) 2. Check pattern order (broad first, negations last) 3. Use `--verbose` to see what's being processed 4. Test patterns with `--ignore-pattern` flag first --- ### Issue: Negation Patterns Not Working **Symptoms**: Negated files still ignored. **Solutions**: 1. Ensure negation comes **after** broader pattern: ```javascript ignores: [ "webapp/test/**", // First: broad "!webapp/test/integration/**", // Then: negation ] ``` 2. Verify `!` prefix is directly before pattern (no space) --- ## Further Reading - **Main Repository**: [https://github.com/UI5/linter](https://github.com/UI5/linter) - **README**: [https://github.com/UI5/linter/blob/main/README.md](https://github.com/UI5/linter/blob/main/README.md) - **CLI Options**: See cli-options.md reference - **Node.js Glob Patterns**: [https://github.com/isaacs/node-glob#glob-primer](https://github.com/isaacs/node-glob#glob-primer) --- **Document Version**: 1.0 **Last Verified**: 2025-11-21 **Next Review**: 2026-02-21