Initial commit
This commit is contained in:
832
references/advanced-ci-cd.md
Normal file
832
references/advanced-ci-cd.md
Normal file
@@ -0,0 +1,832 @@
|
||||
# UI5 Linter - Advanced CI/CD Integration
|
||||
|
||||
**Source**: [https://github.com/UI5/linter/blob/main/.github/workflows/ci.yml](https://github.com/UI5/linter/blob/main/.github/workflows/ci.yml)
|
||||
**Last Updated**: 2025-11-21
|
||||
**UI5 Linter Version**: 1.20.5
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
This guide covers advanced CI/CD integration patterns for UI5 Linter, including the UI5 Linter project's own CI workflow, coverage reporting, license checking, dependency analysis, and multi-environment strategies.
|
||||
|
||||
---
|
||||
|
||||
## UI5 Linter's Own CI Workflow (Real-World Example)
|
||||
|
||||
The UI5 Linter project itself uses a comprehensive CI pipeline that demonstrates best practices.
|
||||
|
||||
### Complete Workflow
|
||||
|
||||
**File**: `.github/workflows/ci.yml`
|
||||
|
||||
**Note**: This is the actual CI workflow used by the UI5 Linter project itself, demonstrating production best practices.
|
||||
|
||||
```yaml
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Test
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci --engine-strict
|
||||
|
||||
- name: Run linter
|
||||
run: npm run lint
|
||||
|
||||
- name: Check licenses
|
||||
run: npm run check-licenses
|
||||
|
||||
- name: Check dependencies
|
||||
run: npm run depcheck
|
||||
|
||||
- name: Build
|
||||
run: npm run build-test
|
||||
|
||||
- name: Run tests with coverage
|
||||
run: npm run coverage
|
||||
|
||||
- name: Report coverage
|
||||
uses: coverallsapp/github-action@v2.3.6
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
continue-on-error: true
|
||||
```
|
||||
|
||||
### Key Patterns Demonstrated
|
||||
|
||||
**1. Engine-Strict Installation**
|
||||
```yaml
|
||||
- name: Install dependencies
|
||||
run: npm ci --engine-strict
|
||||
```
|
||||
|
||||
**Why**: Fails fast if Node.js version is incompatible, preventing hidden issues.
|
||||
|
||||
---
|
||||
|
||||
**2. Multi-Step Quality Checks**
|
||||
```yaml
|
||||
- run: npm run lint # Code quality
|
||||
- run: npm run check-licenses # Legal compliance
|
||||
- run: npm run depcheck # Dependency health
|
||||
- run: npm run build-test # Build verification
|
||||
- run: npm run coverage # Test coverage
|
||||
```
|
||||
|
||||
**Why**: Layered validation catches different types of issues.
|
||||
|
||||
---
|
||||
|
||||
**3. Coverage Reporting**
|
||||
```yaml
|
||||
- uses: coverallsapp/github-action@v2.3.6
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
continue-on-error: true
|
||||
```
|
||||
|
||||
**Why**: `continue-on-error` prevents workflow failure if Coveralls is down.
|
||||
|
||||
---
|
||||
|
||||
**4. Minimal Permissions**
|
||||
```yaml
|
||||
permissions: {}
|
||||
```
|
||||
|
||||
**Why**: Security best practice - grant only necessary permissions.
|
||||
|
||||
---
|
||||
|
||||
## Advanced GitHub Actions Patterns
|
||||
|
||||
### Multi-Platform Testing
|
||||
|
||||
Test across operating systems:
|
||||
|
||||
```yaml
|
||||
name: Cross-Platform Lint
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-24.04, macos-latest, windows-latest]
|
||||
node: ['24', '22']
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
cache: 'npm'
|
||||
|
||||
- run: npm ci
|
||||
|
||||
- name: Run UI5 Linter
|
||||
run: npm run lint
|
||||
```
|
||||
|
||||
**Use Cases**:
|
||||
- Ensure linter works on all platforms
|
||||
- Catch platform-specific path issues
|
||||
- Verify compatibility with multiple Node versions
|
||||
|
||||
---
|
||||
|
||||
### Multi-Job Workflow with Dependencies
|
||||
|
||||
Organize checks into separate jobs:
|
||||
|
||||
```yaml
|
||||
name: Complete Validation
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
lint-ui5:
|
||||
name: UI5 Linter
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'npm'
|
||||
- run: npm ci
|
||||
- run: npm run lint
|
||||
|
||||
lint-js:
|
||||
name: ESLint
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'npm'
|
||||
- run: npm ci
|
||||
- run: npm run eslint
|
||||
|
||||
test:
|
||||
name: Tests
|
||||
needs: [lint-ui5, lint-js] # Only run if linting passes
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'npm'
|
||||
- run: npm ci
|
||||
- run: npm test
|
||||
|
||||
deploy:
|
||||
name: Deploy
|
||||
needs: test # Only deploy if tests pass
|
||||
if: github.ref == 'refs/heads/main'
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- run: echo "Deploy to production"
|
||||
```
|
||||
|
||||
**Benefits**:
|
||||
- Parallel execution (faster)
|
||||
- Clear separation of concerns
|
||||
- Conditional deployment
|
||||
|
||||
---
|
||||
|
||||
### Caching for Performance
|
||||
|
||||
Optimize workflow performance with caching:
|
||||
|
||||
```yaml
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'npm' # Automatic npm cache
|
||||
|
||||
- name: Cache UI5 Linter results
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: .ui5lint-cache
|
||||
key: ui5lint-${{ hashFiles('webapp/**/*.js', 'webapp/**/*.xml', 'ui5lint.config.*') }}
|
||||
restore-keys: |
|
||||
ui5lint-
|
||||
|
||||
- run: npm ci
|
||||
|
||||
- name: Run UI5 Linter
|
||||
run: npm run lint
|
||||
```
|
||||
|
||||
**Performance Gain**: 30-50% faster on cache hit
|
||||
|
||||
---
|
||||
|
||||
### Diff-Based Linting (Lint Only Changed Files)
|
||||
|
||||
Lint only files changed in PR:
|
||||
|
||||
```yaml
|
||||
name: Incremental Lint
|
||||
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
lint-changed:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 0 # Fetch all history for diff
|
||||
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
|
||||
- run: npm ci
|
||||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
run: |
|
||||
echo "files=$(git diff --name-only --diff-filter=ACMRT ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep -E '\.(js|xml|json)$' | tr '\n' ' ')" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Lint changed files
|
||||
if: steps.changed-files.outputs.files != ''
|
||||
run: |
|
||||
npx ui5lint ${{ steps.changed-files.outputs.files }}
|
||||
```
|
||||
|
||||
**Benefits**:
|
||||
- Faster on large codebases
|
||||
- Immediate feedback on changes
|
||||
|
||||
---
|
||||
|
||||
## Coverage Reporting Integration
|
||||
|
||||
### Coveralls Integration
|
||||
|
||||
**Setup**:
|
||||
```bash
|
||||
npm install --save-dev nyc
|
||||
```
|
||||
|
||||
**package.json**:
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"test": "ava",
|
||||
"coverage": "nyc npm test",
|
||||
"lint": "ui5lint"
|
||||
},
|
||||
"nyc": {
|
||||
"reporter": ["lcov", "text"],
|
||||
"include": ["src/**/*.js"],
|
||||
"exclude": ["test/**"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**GitHub Actions**:
|
||||
```yaml
|
||||
- name: Run tests with coverage
|
||||
run: npm run coverage
|
||||
|
||||
- name: Upload to Coveralls
|
||||
uses: coverallsapp/github-action@v2.3.6
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
continue-on-error: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Codecov Integration
|
||||
|
||||
```yaml
|
||||
- name: Run tests with coverage
|
||||
run: npm run coverage
|
||||
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v3
|
||||
with:
|
||||
files: ./coverage/lcov.info
|
||||
flags: unittests
|
||||
name: codecov-umbrella
|
||||
fail_ci_if_error: true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## License Checking
|
||||
|
||||
Ensure all dependencies have acceptable licenses:
|
||||
|
||||
**package.json**:
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"check-licenses": "license-checker --onlyAllow 'MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC'"
|
||||
},
|
||||
"devDependencies": {
|
||||
"license-checker": "^25.0.1"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**GitHub Actions**:
|
||||
```yaml
|
||||
- name: Check licenses
|
||||
run: npm run check-licenses
|
||||
```
|
||||
|
||||
**Why**: Legal compliance, prevent GPL contamination
|
||||
|
||||
---
|
||||
|
||||
## Dependency Checking
|
||||
|
||||
Identify unused or missing dependencies:
|
||||
|
||||
**package.json**:
|
||||
```json
|
||||
{
|
||||
"scripts": {
|
||||
"depcheck": "depcheck --ignores='@types/*,eslint-*'"
|
||||
},
|
||||
"devDependencies": {
|
||||
"depcheck": "^1.4.3"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**GitHub Actions**:
|
||||
```yaml
|
||||
- name: Check dependencies
|
||||
run: npm run depcheck
|
||||
```
|
||||
|
||||
**Why**: Keep dependencies clean, reduce bundle size
|
||||
|
||||
---
|
||||
|
||||
## Security Scanning
|
||||
|
||||
### npm audit
|
||||
|
||||
```yaml
|
||||
- name: Security audit
|
||||
run: npm audit --audit-level=moderate
|
||||
continue-on-error: true # Don't fail on low/moderate
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Snyk Integration
|
||||
|
||||
```yaml
|
||||
- name: Run Snyk
|
||||
uses: snyk/actions/node@master
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
with:
|
||||
args: --severity-threshold=high
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Artifact Management
|
||||
|
||||
Save lint results as artifacts:
|
||||
|
||||
```yaml
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'npm'
|
||||
- run: npm ci
|
||||
|
||||
- name: Run UI5 Linter (JSON output)
|
||||
run: npm run lint -- --format json 2> lint-diagnostics.log | tee lint-results.json
|
||||
continue-on-error: true
|
||||
|
||||
- name: Run UI5 Linter (HTML report)
|
||||
run: npm run lint -- --format html 2> lint-diagnostics.log | tee lint-report.html
|
||||
continue-on-error: true
|
||||
|
||||
- name: Upload JSON results
|
||||
uses: actions/upload-artifact@v5
|
||||
if: always()
|
||||
with:
|
||||
name: lint-results-json
|
||||
path: lint-results.json
|
||||
retention-days: 30
|
||||
|
||||
- name: Upload HTML report
|
||||
uses: actions/upload-artifact@v5
|
||||
if: always()
|
||||
with:
|
||||
name: lint-report-html
|
||||
path: lint-report.html
|
||||
retention-days: 30
|
||||
|
||||
- name: Check for errors
|
||||
run: |
|
||||
if [ ! -f lint-results.json ]; then
|
||||
echo "❌ Lint results file not found"
|
||||
exit 1
|
||||
fi
|
||||
if ! jq '[.[].errorCount] | add' lint-results.json > /tmp/error_count 2>/dev/null; then
|
||||
echo "❌ Failed to parse lint-results.json"
|
||||
exit 1
|
||||
fi
|
||||
ERROR_COUNT=$(cat /tmp/error_count)
|
||||
ERROR_COUNT=${ERROR_COUNT:-0}
|
||||
if [ "$ERROR_COUNT" -gt 0 ]; then
|
||||
echo "❌ Found $ERROR_COUNT linting errors"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
**Benefits**:
|
||||
- Download reports for review
|
||||
- Historical tracking
|
||||
- Share with non-technical stakeholders (HTML)
|
||||
|
||||
---
|
||||
|
||||
## Pull Request Comments
|
||||
|
||||
Add lint results as PR comments:
|
||||
|
||||
```yaml
|
||||
jobs:
|
||||
lint-pr:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'pull_request'
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
- run: npm ci
|
||||
|
||||
- name: Run UI5 Linter
|
||||
id: lint
|
||||
run: |
|
||||
npm run lint -- --format markdown > lint-results.md || true
|
||||
echo "results<<EOF" >> $GITHUB_OUTPUT
|
||||
cat lint-results.md >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Comment PR
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
github.rest.issues.createComment({
|
||||
issue_number: context.issue.number,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.name,
|
||||
body: '## UI5 Lint Results\n\n${{ steps.lint.outputs.results }}'
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## GitLab CI Integration
|
||||
|
||||
**File**: `.gitlab-ci.yml`
|
||||
|
||||
```yaml
|
||||
stages:
|
||||
- lint
|
||||
- test
|
||||
- deploy
|
||||
|
||||
variables:
|
||||
npm_config_cache: "$CI_PROJECT_DIR/.npm"
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- .npm
|
||||
- node_modules
|
||||
|
||||
lint:ui5:
|
||||
stage: lint
|
||||
image: node:20
|
||||
script:
|
||||
- npm ci
|
||||
- npm run lint -- --format json > lint-results.json
|
||||
- npm run lint -- --format html > lint-report.html
|
||||
artifacts:
|
||||
when: always
|
||||
reports:
|
||||
junit: lint-results.json
|
||||
paths:
|
||||
- lint-report.html
|
||||
rules:
|
||||
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
||||
- if: '$CI_COMMIT_BRANCH == "main"'
|
||||
|
||||
lint:ui5:fix:
|
||||
stage: lint
|
||||
image: node:20
|
||||
script:
|
||||
- npm ci
|
||||
- npm run lint:fix
|
||||
- git diff --exit-code || (echo "Autofix available" && exit 1)
|
||||
allow_failure: true
|
||||
only:
|
||||
- merge_requests
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Jenkins Pipeline
|
||||
|
||||
**File**: `Jenkinsfile`
|
||||
|
||||
```groovy
|
||||
pipeline {
|
||||
agent {
|
||||
docker {
|
||||
image 'node:20'
|
||||
}
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Install') {
|
||||
steps {
|
||||
sh 'npm ci'
|
||||
}
|
||||
}
|
||||
|
||||
stage('Lint') {
|
||||
steps {
|
||||
sh 'npm run lint -- --format json > lint-results.json'
|
||||
sh 'npm run lint -- --format html > lint-report.html'
|
||||
}
|
||||
post {
|
||||
always {
|
||||
archiveArtifacts artifacts: 'lint-*.json,lint-*.html', allowEmptyArchive: true
|
||||
publishHTML([
|
||||
reportDir: '.',
|
||||
reportFiles: 'lint-report.html',
|
||||
reportName: 'UI5 Lint Report'
|
||||
])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Test') {
|
||||
when {
|
||||
expression {
|
||||
def results = readJSON file: 'lint-results.json'
|
||||
return results.sum { it.errorCount } == 0
|
||||
}
|
||||
}
|
||||
steps {
|
||||
sh 'npm test'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Pre-Commit Hooks (Advanced)
|
||||
|
||||
### Lint-Staged with Auto-Fix
|
||||
|
||||
**package.json**:
|
||||
```json
|
||||
{
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-commit": "lint-staged"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
"webapp/**/*.{js,xml}": [
|
||||
"ui5lint --fix",
|
||||
"ui5lint",
|
||||
"git add"
|
||||
],
|
||||
"webapp/manifest.json": [
|
||||
"ui5lint --fix",
|
||||
"ui5lint"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Setup**:
|
||||
```bash
|
||||
npm install --save-dev husky lint-staged
|
||||
npx husky install
|
||||
npx husky add .husky/pre-commit "npx lint-staged"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Commit Message Linting
|
||||
|
||||
Enforce conventional commits (like UI5 Linter):
|
||||
|
||||
**package.json**:
|
||||
```json
|
||||
{
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^17.0.0",
|
||||
"@commitlint/config-conventional": "^17.0.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**commitlint.config.mjs**:
|
||||
```javascript
|
||||
export default {
|
||||
extends: ['@commitlint/config-conventional'],
|
||||
rules: {
|
||||
'type-enum': [2, 'always', [
|
||||
'feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore'
|
||||
]],
|
||||
'scope-enum': [2, 'always', [
|
||||
'linter', 'autofix', 'docs', 'ci'
|
||||
]]
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
**Husky Hook**:
|
||||
```bash
|
||||
npx husky add .husky/commit-msg "npx commitlint --edit $1"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Monorepo Integration
|
||||
|
||||
For monorepos with multiple UI5 apps:
|
||||
|
||||
```yaml
|
||||
name: Monorepo Lint
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
find-apps:
|
||||
runs-on: ubuntu-24.04
|
||||
outputs:
|
||||
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- id: set-matrix
|
||||
run: |
|
||||
APPS=$(find apps -name "ui5.yaml" -exec dirname {} \; | jq -R -s -c 'split("\n")[:-1]')
|
||||
echo "matrix=$APPS" >> $GITHUB_OUTPUT
|
||||
|
||||
lint:
|
||||
needs: find-apps
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
matrix:
|
||||
app: ${{ fromJson(needs.find-apps.outputs.matrix) }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: 'npm'
|
||||
cache-dependency-path: '${{ matrix.app }}/package-lock.json'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
working-directory: ${{ matrix.app }}
|
||||
|
||||
- name: Lint ${{ matrix.app }}
|
||||
run: npm run lint
|
||||
working-directory: ${{ matrix.app }}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Environment-Specific Configurations
|
||||
|
||||
Use different configs for dev vs CI:
|
||||
|
||||
**ui5lint.config.js** (dev):
|
||||
```javascript
|
||||
export default {
|
||||
ignores: ["webapp/thirdparty/**"]
|
||||
};
|
||||
```
|
||||
|
||||
**.ui5lint.ci.config.js** (CI):
|
||||
```javascript
|
||||
export default {
|
||||
ignores: [
|
||||
"webapp/thirdparty/**",
|
||||
"webapp/test/**" // More aggressive ignores for CI
|
||||
]
|
||||
};
|
||||
```
|
||||
|
||||
**GitHub Actions**:
|
||||
```yaml
|
||||
- name: Lint (CI config)
|
||||
run: npm run lint -- --config .ui5lint.ci.config.js
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary Checklist
|
||||
|
||||
**Basic CI/CD** (✅ Covered in templates):
|
||||
- [ ] Run linter on push/PR
|
||||
- [ ] Fail build on errors
|
||||
- [ ] Cache dependencies
|
||||
|
||||
**Advanced Patterns**:
|
||||
- [ ] Multi-platform testing
|
||||
- [ ] Coverage reporting
|
||||
- [ ] License checking
|
||||
- [ ] Dependency analysis
|
||||
- [ ] Security scanning
|
||||
- [ ] Artifact management
|
||||
- [ ] PR comments
|
||||
- [ ] Pre-commit hooks
|
||||
|
||||
**Production-Ready**:
|
||||
- [ ] Environment-specific configs
|
||||
- [ ] Monorepo support
|
||||
- [ ] Performance optimization (caching)
|
||||
- [ ] Historical tracking (artifacts)
|
||||
|
||||
---
|
||||
|
||||
## Resources
|
||||
|
||||
**UI5 Linter CI Workflow**: [https://github.com/UI5/linter/blob/main/.github/workflows/ci.yml](https://github.com/UI5/linter/blob/main/.github/workflows/ci.yml)
|
||||
|
||||
**GitHub Actions Docs**: [https://docs.github.com/en/actions](https://docs.github.com/en/actions)
|
||||
|
||||
**GitLab CI Docs**: [https://docs.gitlab.com/ee/ci/](https://docs.gitlab.com/ee/ci/)
|
||||
|
||||
**Jenkins Docs**: [https://www.jenkins.io/doc/](https://www.jenkins.io/doc/)
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Verified**: 2025-11-21
|
||||
**Next Review**: 2026-02-21
|
||||
695
references/autofix-complete.md
Normal file
695
references/autofix-complete.md
Normal file
@@ -0,0 +1,695 @@
|
||||
# UI5 Linter - Complete Autofix Reference
|
||||
|
||||
**Source**: [https://github.com/UI5/linter/blob/main/docs/Scope-of-Autofix.md](https://github.com/UI5/linter/blob/main/docs/Scope-of-Autofix.md)
|
||||
**Last Updated**: 2025-11-21
|
||||
**UI5 Linter Version**: 1.20.5
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
The UI5 Linter's autofix feature (`--fix` flag) can automatically correct certain categories of issues. However, the documentation explicitly states: **"This list is not exhaustive; there are more APIs that are currently not replaced automatically."**
|
||||
|
||||
This reference provides comprehensive coverage of what can and cannot be automatically fixed.
|
||||
|
||||
---
|
||||
|
||||
## Using Autofix
|
||||
|
||||
### Basic Usage
|
||||
|
||||
```bash
|
||||
# Apply fixes to all files
|
||||
ui5lint --fix
|
||||
|
||||
# Fix specific files
|
||||
ui5lint --fix "webapp/**/*.js"
|
||||
|
||||
# Preview fixes without applying (dry-run mode)
|
||||
UI5LINT_FIX_DRY_RUN=true ui5lint --fix
|
||||
```
|
||||
|
||||
### Dry-Run Mode
|
||||
|
||||
Before applying fixes, preview changes using the environment variable:
|
||||
|
||||
```bash
|
||||
UI5LINT_FIX_DRY_RUN=true ui5lint --fix
|
||||
```
|
||||
|
||||
This shows what would be changed without modifying any files.
|
||||
|
||||
---
|
||||
|
||||
## Rules with Autofix Support
|
||||
|
||||
### 1. no-globals ✅
|
||||
|
||||
**What It Fixes**: Replaces UI5 global references with corresponding module imports.
|
||||
|
||||
**Example**:
|
||||
```javascript
|
||||
// Before:
|
||||
function onInit() {
|
||||
const core = sap.ui.getCore();
|
||||
const control = core.byId("myControl");
|
||||
}
|
||||
|
||||
// After:
|
||||
import Core from "sap/ui/core/Core";
|
||||
|
||||
function onInit() {
|
||||
const core = Core;
|
||||
const control = core.byId("myControl");
|
||||
}
|
||||
```
|
||||
|
||||
**Limitations**:
|
||||
- ❌ Cannot fix assignments to global variables
|
||||
- ❌ Cannot handle `delete` expressions on globals
|
||||
- ❌ Third-party module access via globals (like `jQuery`) not handled
|
||||
|
||||
---
|
||||
|
||||
### 2. no-deprecated-api ✅ (Partial)
|
||||
|
||||
**What It Fixes**: Multiple categories of deprecated API usage.
|
||||
|
||||
#### Category A: Configuration Facade Replacements
|
||||
|
||||
**Core.getConfiguration() Methods**:
|
||||
|
||||
Replaces deprecated `Core.getConfiguration()` method calls with modern equivalents.
|
||||
|
||||
```javascript
|
||||
// Before:
|
||||
import Core from "sap/ui/core/Core";
|
||||
const config = Core.getConfiguration();
|
||||
const language = config.getLanguage();
|
||||
|
||||
// After:
|
||||
import Localization from "sap/base/i18n/Localization";
|
||||
const language = Localization.getLanguage();
|
||||
```
|
||||
|
||||
**Supported Configuration Methods** (Partial List):
|
||||
- `getLanguage()` → `sap/base/i18n/Localization.getLanguage()`
|
||||
- `getAnimationMode()` → `sap/ui/core/AnimationMode.getAnimationMode()`
|
||||
- `getTimezone()` → `sap/base/i18n/Localization.getTimezone()`
|
||||
|
||||
**Not Supported** (~20 methods, see Issue #620):
|
||||
- `getAnimation()`
|
||||
- `getAppCacheBuster()`
|
||||
- `getCompatibilityVersion()`
|
||||
- `getFormatSettings()` (requires complex manual replacement)
|
||||
- `getDebug()`, `getInspect()`, `getOriginInfo()` (no alternatives)
|
||||
- Many others...
|
||||
|
||||
---
|
||||
|
||||
#### Category B: Core Facade Replacements
|
||||
|
||||
**Core API Methods**:
|
||||
|
||||
```javascript
|
||||
// Before:
|
||||
import Core from "sap/ui/core/Core";
|
||||
Core.loadLibrary("sap.m", {async: true});
|
||||
|
||||
// After:
|
||||
import Lib from "sap/ui/core/Lib";
|
||||
Lib.load({name: "sap.m"});
|
||||
```
|
||||
|
||||
**Supported Core Methods** (Partial List):
|
||||
- `loadLibrary()` → `sap/ui/core/Lib.load()` (with `async: true` only)
|
||||
- `byId()` → `sap/ui/core/Element.getElementById()`
|
||||
- `getLibraryResourceBundle()` → `sap/ui/core/Lib.getResourceBundleFor()`
|
||||
|
||||
**Not Supported** (~30+ methods, see Issue #619):
|
||||
|
||||
**Template & Rendering** (discarded concepts):
|
||||
- `getTemplate()`
|
||||
- `createRenderManager()`
|
||||
- `getRenderManager()`
|
||||
|
||||
**Event Handlers** (different APIs):
|
||||
- `attachLocalizationChanged()`
|
||||
- Event attachment methods discontinued
|
||||
|
||||
**Error Management** (only on ManagedObject):
|
||||
- Format/parse/validation error methods
|
||||
|
||||
**Model Operations** (only on ManagedObject):
|
||||
- `getModel()`, `setModel()`, `hasModel()`
|
||||
|
||||
**Component/Application** (no replacements):
|
||||
- `getApplication()`
|
||||
- `getRootComponent()`
|
||||
- `getLoadedLibraries()`
|
||||
- `createUIArea()`, `getUIArea()`
|
||||
|
||||
**Other** (discarded or no alternatives):
|
||||
- `applyChanges()`
|
||||
- `isLocked()`, `lock()`, `unlock()`
|
||||
- `registerPlugin()`
|
||||
- `setRoot()`, `setThemeRoot()`
|
||||
|
||||
---
|
||||
|
||||
#### Category C: Button Event Handler Migration
|
||||
|
||||
**tap → press Event**:
|
||||
|
||||
```javascript
|
||||
// Before:
|
||||
new Button({
|
||||
tap: function() {
|
||||
console.log("Tapped");
|
||||
}
|
||||
});
|
||||
|
||||
// After:
|
||||
new Button({
|
||||
press: function() {
|
||||
console.log("Pressed");
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
**XML Views**:
|
||||
```xml
|
||||
<!-- Before: -->
|
||||
<Button tap="onTap"/>
|
||||
|
||||
<!-- After: -->
|
||||
<Button press="onPress"/>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Category D: SmartTable Export Property
|
||||
|
||||
**exportType → useExportToExcel**:
|
||||
|
||||
```javascript
|
||||
// Before:
|
||||
new SmartTable({
|
||||
exportType: sap.ui.comp.smarttable.ExportType.Excel
|
||||
});
|
||||
|
||||
// After:
|
||||
new SmartTable({
|
||||
useExportToExcel: true
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Category E: ODataModel Property Removals
|
||||
|
||||
Removes deprecated properties from ODataModel instantiation.
|
||||
|
||||
```javascript
|
||||
// Before:
|
||||
new ODataModel({
|
||||
serviceUrl: "/sap/opu/odata/service",
|
||||
deprecatedProperty: true
|
||||
});
|
||||
|
||||
// After:
|
||||
new ODataModel({
|
||||
serviceUrl: "/sap/opu/odata/service"
|
||||
// deprecatedProperty removed
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### Category F: SimpleForm Property Elimination
|
||||
|
||||
Removes deprecated SimpleForm properties.
|
||||
|
||||
---
|
||||
|
||||
#### Category G: Bootstrap Script Attributes
|
||||
|
||||
**Fixes HTML Bootstrap Script**:
|
||||
|
||||
```html
|
||||
<!-- Before: -->
|
||||
<script src="resources/sap-ui-core.js"
|
||||
data-sap-ui-theme="sap_fiori_3"
|
||||
data-sap-ui-libs="sap.m">
|
||||
</script>
|
||||
|
||||
<!-- After: -->
|
||||
<script src="resources/sap-ui-core.js"
|
||||
data-sap-ui-theme="sap_horizon"
|
||||
data-sap-ui-libs="sap.m">
|
||||
</script>
|
||||
```
|
||||
|
||||
**Bootstrap Parameter Fixes** (Added in v1.18.0):
|
||||
- Updates deprecated theme parameters
|
||||
- Fixes deprecated configuration attributes
|
||||
|
||||
---
|
||||
|
||||
#### Category H: jQuery.sap API Replacements
|
||||
|
||||
**Limited Support** - Only specific methods are replaced:
|
||||
|
||||
```javascript
|
||||
// Supported:
|
||||
jQuery.sap.log.error() → sap/base/Log.error()
|
||||
jQuery.sap.uid() → sap/base/util/uid()
|
||||
jQuery.sap.encodeHTML() → sap/base/security/encodeHTML()
|
||||
```
|
||||
|
||||
**Not Supported** (Methods without replacements or too complex):
|
||||
|
||||
❌ **No Direct Replacement**:
|
||||
- `jQuery.sap.act` (successor module is private)
|
||||
- `jQuery.sap.getObject()` (no replacement exists)
|
||||
- `jQuery.sap.getUriParameters()` (no replacement)
|
||||
- `jQuery.sap.isSpecialKey()` (no replacement)
|
||||
|
||||
❌ **Not Yet Implemented**:
|
||||
- `jQuery.sap.registerModulePath()`
|
||||
- `jQuery.sap.registerResourcePath()`
|
||||
|
||||
❌ **Too Complex**:
|
||||
- `jQuery.sap.removeUrlWhitelist()` (complex to automate)
|
||||
|
||||
❌ **All jQuery Plugins**:
|
||||
All deprecated jQuery plugins remain undetected by the linter, preventing automatic fixes.
|
||||
|
||||
---
|
||||
|
||||
#### Category I: Deprecated isA API
|
||||
|
||||
**sap/ui/base/Object.isA** (Added in v1.18.0):
|
||||
|
||||
```javascript
|
||||
// Before:
|
||||
import BaseObject from "sap/ui/base/Object";
|
||||
if (obj.isA("sap.ui.core.Control")) {
|
||||
// ...
|
||||
}
|
||||
|
||||
// After:
|
||||
if (obj.isA(Control)) {
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. no-ambiguous-event-handler ✅
|
||||
|
||||
**What It Fixes**: Migrates event handlers to recommended notation format.
|
||||
|
||||
**Added in**: v1.19.0
|
||||
|
||||
```xml
|
||||
<!-- Before: ambiguous notation -->
|
||||
<Button press="handlePress"/>
|
||||
|
||||
<!-- After: controller method notation -->
|
||||
<Button press=".handlePress"/>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. no-removed-manifest-property ✅ (Partial)
|
||||
|
||||
**What It Fixes**: Removes incompatible manifest properties.
|
||||
|
||||
**Added in**: v1.19.0
|
||||
|
||||
**Supported Fixes**:
|
||||
|
||||
1. **Remove synchronizationMode**:
|
||||
```json
|
||||
// Before:
|
||||
{
|
||||
"sap.ui5": {
|
||||
"models": {
|
||||
"": {
|
||||
"dataSource": "mainService",
|
||||
"synchronizationMode": "None"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// After:
|
||||
{
|
||||
"sap.ui5": {
|
||||
"models": {
|
||||
"": {
|
||||
"dataSource": "mainService"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. **Clean up empty sap.ui5/resources/js entries**:
|
||||
```json
|
||||
// Before:
|
||||
{
|
||||
"sap.ui5": {
|
||||
"resources": {
|
||||
"js": []
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// After:
|
||||
{
|
||||
"sap.ui5": {
|
||||
"resources": {}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## General Autofix Restrictions
|
||||
|
||||
The linter **cannot** automatically fix code in these scenarios:
|
||||
|
||||
### 1. Code Outside Module Definitions ❌
|
||||
|
||||
**Problem**: Fixes requiring new imports won't work unless code is within `sap.ui.define` or `sap.ui.require` blocks.
|
||||
|
||||
```javascript
|
||||
// ❌ Cannot fix - not in module definition
|
||||
sap.ui.getCore().byId("myControl");
|
||||
|
||||
// ✅ Can fix - inside module definition
|
||||
sap.ui.define([], function() {
|
||||
sap.ui.getCore().byId("myControl");
|
||||
// Will add import and replace
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. Synchronous-to-Asynchronous Conversions ❌
|
||||
|
||||
**Problem**: APIs returning promises can't replace sync versions without restructuring entire code flows across multiple files.
|
||||
|
||||
**Examples**:
|
||||
|
||||
```javascript
|
||||
// ❌ Cannot automatically convert - sync to async
|
||||
const component = sap.ui.component({name: "my.app"});
|
||||
component.doSomething(); // Immediate usage
|
||||
|
||||
// ✅ Would require manual conversion to:
|
||||
sap.ui.component({name: "my.app", async: true})
|
||||
.then(function(component) {
|
||||
component.doSomething();
|
||||
});
|
||||
```
|
||||
|
||||
**Affected APIs** (Sync-to-Async Barriers):
|
||||
|
||||
❌ **Library Loading**:
|
||||
- `Core.loadLibrary()` → Only replaced with `Lib.load()` when `async: true` is specified
|
||||
|
||||
❌ **Component Creation**:
|
||||
- `Core.createComponent()` → Only replaced with `Component.create()` when `async: true` is specified
|
||||
|
||||
❌ **Resource Bundles**:
|
||||
- `Core.getLibraryResourceBundle()` → Not replaced if arguments suggest promise returns
|
||||
|
||||
❌ **View/Fragment Creation** (all require manual conversion):
|
||||
- `sap.ui.component()`
|
||||
- `sap.ui.view()`
|
||||
- `sap.ui.xmlfragment()`
|
||||
- `sap.ui.xmlview()`
|
||||
- `sap.ui.jsonview()`
|
||||
- `sap.ui.jsview()`
|
||||
- `sap.ui.htmlview()`
|
||||
|
||||
---
|
||||
|
||||
### 3. Complex Replacements ❌
|
||||
|
||||
**Problem**: APIs needing multiple calls and new local variables lack support.
|
||||
|
||||
```javascript
|
||||
// ❌ Cannot automatically fix - requires multiple steps
|
||||
const config = Core.getConfiguration();
|
||||
const formatSettings = config.getFormatSettings();
|
||||
const datePattern = formatSettings.getDatePattern("medium");
|
||||
|
||||
// Would require complex manual replacement:
|
||||
import Formatting from "sap/base/i18n/Formatting";
|
||||
import DateFormat from "sap/ui/core/format/DateFormat";
|
||||
const dateFormat = DateFormat.getDateInstance({style: "medium"},
|
||||
Formatting.getLanguageTag());
|
||||
const datePattern = dateFormat.oFormatOptions.pattern;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. Context-Dependent Replacements ❌
|
||||
|
||||
**Problem**: Usage patterns affecting broader code context prevent automation.
|
||||
|
||||
```javascript
|
||||
// ❌ Cannot automatically fix - context-dependent
|
||||
function doSomething() {
|
||||
const model = this.getView().getModel();
|
||||
// vs
|
||||
const model = Core.getModel(); // Different context!
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. Return Value Changes ❌
|
||||
|
||||
**Problem**: When return types differ, automated replacement becomes impossible.
|
||||
|
||||
```javascript
|
||||
// ❌ Cannot fix - return type changes
|
||||
const libs = Core.getLoadedLibraries(); // Returns object
|
||||
const libNames = Object.keys(libs);
|
||||
|
||||
// No direct replacement exists that returns the same structure
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Autofix Development Standards
|
||||
|
||||
For contributors developing new autofix capabilities:
|
||||
|
||||
### 1:1 Replacement Requirements
|
||||
|
||||
When implementing 1:1 replacements, verify:
|
||||
|
||||
- ✅ Function arguments maintain identical type, order, value, and count
|
||||
- ✅ Return types match exactly between old and new implementations
|
||||
- ✅ Complex return types (enums/objects) preserve all original values and properties
|
||||
- ✅ Object method return values maintain type compatibility
|
||||
|
||||
### Complex Replacement Standards
|
||||
|
||||
When implementing sophisticated migrations:
|
||||
|
||||
- ✅ Skip replacements where return types differ unless the value remains unused
|
||||
- ✅ Utilize `isExpectedValueExpression()` utility or `mustNotUseReturnValue` flags
|
||||
- ✅ Perform static argument type verification using TypeScript's TypeChecker
|
||||
- ✅ Preserve comments and whitespace during argument restructuring
|
||||
- ✅ Maintain line breaks and spacing conventions in modified expressions
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### 1. Always Use Dry-Run First
|
||||
|
||||
```bash
|
||||
# Preview changes before applying
|
||||
UI5LINT_FIX_DRY_RUN=true ui5lint --fix
|
||||
```
|
||||
|
||||
### 2. Review Changes Before Committing
|
||||
|
||||
Autofix can make extensive changes. Always review before committing:
|
||||
|
||||
```bash
|
||||
ui5lint --fix
|
||||
git diff
|
||||
```
|
||||
|
||||
### 3. Use Version Control
|
||||
|
||||
Commit your code before running autofix:
|
||||
|
||||
```bash
|
||||
git commit -am "Pre-autofix snapshot"
|
||||
ui5lint --fix
|
||||
git diff # Review changes
|
||||
```
|
||||
|
||||
### 4. Test After Autofix
|
||||
|
||||
Autofix may introduce subtle issues. Always test:
|
||||
|
||||
```bash
|
||||
ui5lint --fix
|
||||
npm test
|
||||
npm run build
|
||||
```
|
||||
|
||||
### 5. Handle Limitations Manually
|
||||
|
||||
For unsupported APIs, manually refactor:
|
||||
|
||||
```javascript
|
||||
// Linter will flag but not fix:
|
||||
const libs = Core.getLoadedLibraries();
|
||||
|
||||
// Manual replacement:
|
||||
import Lib from "sap/ui/core/Lib";
|
||||
const libs = Lib.all();
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Common Autofix Scenarios
|
||||
|
||||
### Scenario 1: Clean Global Usage
|
||||
|
||||
```bash
|
||||
# Fix all global access patterns
|
||||
ui5lint --fix "webapp/**/*.js"
|
||||
```
|
||||
|
||||
**Result**: Replaces `sap.ui.getCore()`, global namespace access, etc.
|
||||
|
||||
---
|
||||
|
||||
### Scenario 2: Modernize Component
|
||||
|
||||
```bash
|
||||
# Fix component and manifest issues
|
||||
ui5lint --fix "webapp/manifest.json" "webapp/Component.js"
|
||||
```
|
||||
|
||||
**Result**: Removes `synchronizationMode`, updates deprecated APIs
|
||||
|
||||
---
|
||||
|
||||
### Scenario 3: Update Views
|
||||
|
||||
```bash
|
||||
# Fix event handlers and deprecated controls
|
||||
ui5lint --fix "webapp/view/**/*.xml"
|
||||
```
|
||||
|
||||
**Result**: Updates event handler notation, deprecated attributes
|
||||
|
||||
---
|
||||
|
||||
### Scenario 4: Migrate jQuery.sap
|
||||
|
||||
```bash
|
||||
# Fix supported jQuery.sap APIs
|
||||
ui5lint --fix "webapp/**/*.js"
|
||||
```
|
||||
|
||||
**Result**: Replaces `jQuery.sap.log`, `jQuery.sap.uid`, etc.
|
||||
**Note**: Many jQuery.sap APIs cannot be automatically fixed!
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting Autofix
|
||||
|
||||
### Issue: "autofix-error" Reported
|
||||
|
||||
**Cause**: Expected autofix cannot be applied
|
||||
|
||||
**Solutions**:
|
||||
1. Check if code is within module definition
|
||||
2. Verify file syntax is valid (no parsing errors)
|
||||
3. Review edge cases that may prevent replacement
|
||||
4. Report issue to UI5 Linter team if unexpected
|
||||
|
||||
---
|
||||
|
||||
### Issue: Autofix Changes Too Much
|
||||
|
||||
**Cause**: Running autofix on entire codebase at once
|
||||
|
||||
**Solutions**:
|
||||
1. Run autofix on specific directories:
|
||||
```bash
|
||||
ui5lint --fix "webapp/controller/**/*.js"
|
||||
```
|
||||
2. Use `--ignore-pattern` to exclude files:
|
||||
```bash
|
||||
ui5lint --fix --ignore-pattern "webapp/thirdparty/**"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue: Autofix Missed Some Deprecations
|
||||
|
||||
**Cause**: Not all deprecated APIs support autofix
|
||||
|
||||
**Solutions**:
|
||||
1. Review this document for known limitations
|
||||
2. Check `Scope-of-Autofix.md` for latest updates
|
||||
3. Manually refactor unsupported APIs
|
||||
4. Consider reporting missing autofix as feature request
|
||||
|
||||
---
|
||||
|
||||
## Version History
|
||||
|
||||
### v1.20.5 (2025-11-18)
|
||||
- Dependency updates
|
||||
|
||||
### v1.20.0 (2025-09-11)
|
||||
- Manifest v2 support
|
||||
- Deterministic file ordering
|
||||
|
||||
### v1.19.0 (2025-08-28)
|
||||
- ✨ Removal of `synchronizationMode` from manifest.json
|
||||
- ✨ Cleanup of empty `sap.ui5/resources/js` entries
|
||||
- ✨ Migration to recommended event handler notation
|
||||
|
||||
### v1.18.0 (2025-08-19)
|
||||
- ✨ Fix UI5 Bootstrap Parameters in HTML
|
||||
- ✨ Autofix for deprecated `sap/ui/base/Object.isA` API
|
||||
|
||||
### v1.14.0 (2025-06-27)
|
||||
- ✨ Deprecated sap/ui/core/Core APIs autofix
|
||||
- ✨ Deprecated sap/ui/core/Configuration APIs autofix
|
||||
- ✨ Deprecated jQuery.sap APIs autofix
|
||||
- ✨ Deprecated property assignments autofix
|
||||
|
||||
---
|
||||
|
||||
## Further Reading
|
||||
|
||||
- **Autofix Documentation**: [https://github.com/UI5/linter/blob/main/docs/Scope-of-Autofix.md](https://github.com/UI5/linter/blob/main/docs/Scope-of-Autofix.md)
|
||||
- **Issue #619** (Core API Limitations): [https://github.com/UI5/linter/issues/619](https://github.com/UI5/linter/issues/619)
|
||||
- **Issue #620** (Configuration API Limitations): [https://github.com/UI5/linter/issues/620](https://github.com/UI5/linter/issues/620)
|
||||
- **Main Repository**: [https://github.com/UI5/linter](https://github.com/UI5/linter)
|
||||
- **Development Guide**: [https://github.com/UI5/linter/blob/main/docs/Development.md](https://github.com/UI5/linter/blob/main/docs/Development.md)
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Verified**: 2025-11-21
|
||||
**Next Review**: 2026-02-21
|
||||
694
references/cli-options.md
Normal file
694
references/cli-options.md
Normal file
@@ -0,0 +1,694 @@
|
||||
# UI5 Linter - CLI Options 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
|
||||
|
||||
---
|
||||
|
||||
## Command Structure
|
||||
|
||||
```bash
|
||||
ui5lint [files...] [options]
|
||||
```
|
||||
|
||||
**Description**: Static code analysis tool for UI5 applications and libraries.
|
||||
|
||||
**Basic Usage**:
|
||||
```bash
|
||||
# Lint entire project
|
||||
ui5lint
|
||||
|
||||
# Lint specific files
|
||||
ui5lint "webapp/**/*.js"
|
||||
|
||||
# Lint multiple patterns
|
||||
ui5lint "webapp/**/*.js" "webapp/**/*.xml"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Output & Formatting Options
|
||||
|
||||
### --details
|
||||
|
||||
**Description**: Display comprehensive information about findings.
|
||||
|
||||
**Default**: false (shows summary only)
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
ui5lint --details
|
||||
```
|
||||
|
||||
**Output Difference**:
|
||||
```bash
|
||||
# Without --details:
|
||||
webapp/controller/Main.controller.js
|
||||
Line 45: Deprecated API: sap.ui.getCore()
|
||||
|
||||
# With --details:
|
||||
webapp/controller/Main.controller.js
|
||||
Line 45: Deprecated API: sap.ui.getCore()
|
||||
Details: sap.ui.getCore() is deprecated since UI5 1.118
|
||||
Replacement: Use sap/ui/core/Core module instead
|
||||
Severity: Warning
|
||||
Rule: no-deprecated-api
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### --format <type>
|
||||
|
||||
**Description**: Output format selection.
|
||||
|
||||
**Options**: `stylish` | `json` | `markdown` | `html`
|
||||
|
||||
**Default**: `stylish`
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
# Human-readable console output (default)
|
||||
ui5lint --format stylish
|
||||
|
||||
# Machine-parseable JSON
|
||||
ui5lint --format json
|
||||
|
||||
# Documentation-friendly Markdown
|
||||
ui5lint --format markdown
|
||||
|
||||
# Browser-viewable HTML
|
||||
ui5lint --format html
|
||||
```
|
||||
|
||||
**Output Examples**:
|
||||
|
||||
**stylish** (default):
|
||||
```
|
||||
webapp/controller/Main.controller.js
|
||||
45:12 warning Deprecated API: sap.ui.getCore() no-deprecated-api
|
||||
|
||||
✖ 1 problem (0 errors, 1 warning)
|
||||
```
|
||||
|
||||
**json**:
|
||||
```json
|
||||
[
|
||||
{
|
||||
"filePath": "webapp/controller/Main.controller.js",
|
||||
"messages": [
|
||||
{
|
||||
"ruleId": "no-deprecated-api",
|
||||
"severity": 1,
|
||||
"message": "Deprecated API: sap.ui.getCore()",
|
||||
"line": 45,
|
||||
"column": 12
|
||||
}
|
||||
],
|
||||
"errorCount": 0,
|
||||
"warningCount": 1
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
**markdown**:
|
||||
```markdown
|
||||
## webapp/controller/Main.controller.js
|
||||
|
||||
| Line | Column | Severity | Message | Rule |
|
||||
|------|--------|----------|---------|------|
|
||||
| 45 | 12 | warning | Deprecated API: sap.ui.getCore() | no-deprecated-api |
|
||||
|
||||
**1 problem (0 errors, 1 warning)**
|
||||
```
|
||||
|
||||
**html**: Generates a styled HTML report with filtering capabilities.
|
||||
|
||||
**Redirecting Output**:
|
||||
```bash
|
||||
# Save to file
|
||||
ui5lint --format markdown > lint-report.md
|
||||
ui5lint --format json > lint-results.json
|
||||
ui5lint --format html > lint-report.html
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### --quiet
|
||||
|
||||
**Description**: Show only errors, suppress warnings.
|
||||
|
||||
**Default**: false (shows both errors and warnings)
|
||||
|
||||
**Added in**: v1.14.0
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
ui5lint --quiet
|
||||
```
|
||||
|
||||
**Use Cases**:
|
||||
- CI/CD pipelines where only errors should fail the build
|
||||
- Focusing on critical issues first
|
||||
- Gradual migration (fix errors, then warnings)
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Without --quiet: Shows 5 errors, 20 warnings
|
||||
ui5lint
|
||||
# Exit code: 1 (errors found)
|
||||
|
||||
# With --quiet: Shows only 5 errors
|
||||
ui5lint --quiet
|
||||
# Exit code: 1 (errors found)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File Management Options
|
||||
|
||||
### --fix
|
||||
|
||||
**Description**: Automatically correct specific issues.
|
||||
|
||||
**Default**: false
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
# Fix all auto-fixable issues
|
||||
ui5lint --fix
|
||||
|
||||
# Fix specific files
|
||||
ui5lint --fix "webapp/controller/**/*.js"
|
||||
|
||||
# Preview fixes without applying (dry-run)
|
||||
UI5LINT_FIX_DRY_RUN=true ui5lint --fix
|
||||
```
|
||||
|
||||
**Supported Rules with Autofix**:
|
||||
- `no-globals`: Replace global references with module imports
|
||||
- `no-deprecated-api`: Fix supported deprecated APIs (limited)
|
||||
- `no-ambiguous-event-handler`: Update event handler notation
|
||||
- `no-removed-manifest-property`: Remove incompatible manifest properties
|
||||
|
||||
**Important**:
|
||||
- ⚠️ Creates a backup before modifying files
|
||||
- ⚠️ Not all issues can be auto-fixed (see autofix-complete.md)
|
||||
- ⚠️ Always review changes before committing
|
||||
- ⚠️ Use dry-run mode to preview changes first
|
||||
|
||||
**Example Workflow**:
|
||||
```bash
|
||||
# 1. Preview changes
|
||||
UI5LINT_FIX_DRY_RUN=true ui5lint --fix
|
||||
|
||||
# 2. Apply fixes
|
||||
ui5lint --fix
|
||||
|
||||
# 3. Review changes
|
||||
git diff
|
||||
|
||||
# 4. Test
|
||||
npm test
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### --ignore-pattern <pattern>
|
||||
|
||||
**Description**: Exclude specific files or directories from analysis.
|
||||
|
||||
**Default**: None (lints all files)
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
# Ignore single directory
|
||||
ui5lint --ignore-pattern "webapp/thirdparty/**"
|
||||
|
||||
# Ignore multiple patterns
|
||||
ui5lint --ignore-pattern "**/*.test.js" --ignore-pattern "webapp/vendor/**"
|
||||
|
||||
# Ignore specific files
|
||||
ui5lint --ignore-pattern "webapp/libs/legacy.js"
|
||||
```
|
||||
|
||||
**Pattern Syntax**:
|
||||
- Uses glob patterns (same as config file)
|
||||
- Patterns are relative to project root
|
||||
- Supports `**` for recursive matching
|
||||
- Supports `*` for single-level matching
|
||||
- Supports `!` prefix for negation
|
||||
|
||||
**Common Patterns**:
|
||||
```bash
|
||||
# Ignore all test files
|
||||
ui5lint --ignore-pattern "**/*.test.js" --ignore-pattern "**/*.spec.js"
|
||||
|
||||
# Ignore third-party libraries
|
||||
ui5lint --ignore-pattern "webapp/thirdparty/**" --ignore-pattern "webapp/vendor/**"
|
||||
|
||||
# Ignore generated files
|
||||
ui5lint --ignore-pattern "dist/**" --ignore-pattern "build/**"
|
||||
|
||||
# Ignore specific directories
|
||||
ui5lint --ignore-pattern "webapp/localService/**"
|
||||
```
|
||||
|
||||
**Note**: Config file `ignores` option is generally preferred over CLI flag for persistent ignores.
|
||||
|
||||
---
|
||||
|
||||
### --config <path>
|
||||
|
||||
**Description**: Specify a custom configuration file path.
|
||||
|
||||
**Default**: Searches for `ui5lint.config.{js,mjs,cjs}` in project root
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
# Use custom config location
|
||||
ui5lint --config config/custom-lint.config.js
|
||||
|
||||
# Use different config for CI
|
||||
ui5lint --config .ui5lint.ci.config.js
|
||||
```
|
||||
|
||||
**Config File Formats**:
|
||||
- `.js` - CommonJS or ESM (based on package.json type)
|
||||
- `.mjs` - ES Module
|
||||
- `.cjs` - CommonJS
|
||||
|
||||
**Example**:
|
||||
```javascript
|
||||
// custom-lint.config.js
|
||||
export default {
|
||||
ignores: ["webapp/thirdparty/**"],
|
||||
files: ["webapp/**/*.js", "webapp/**/*.xml"]
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### --ui5-config <path>
|
||||
|
||||
**Description**: Specify UI5 YAML configuration path.
|
||||
|
||||
**Default**: Searches for `ui5.yaml` or `ui5-*.yaml` in project root
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
# Use custom UI5 config
|
||||
ui5lint --ui5-config config/ui5-dev.yaml
|
||||
|
||||
# Use environment-specific config
|
||||
ui5lint --ui5-config ui5-production.yaml
|
||||
```
|
||||
|
||||
**When to Use**:
|
||||
- Multi-config UI5 projects
|
||||
- Different configs for dev/prod
|
||||
- Custom UI5 tooling configurations
|
||||
|
||||
---
|
||||
|
||||
## Logging & Diagnostic Options
|
||||
|
||||
### --log-level <level>
|
||||
|
||||
**Description**: Set logging verbosity.
|
||||
|
||||
**Options**: `silent` | `error` | `warn` | `info` | `perf` | `verbose` | `silly`
|
||||
|
||||
**Default**: `info`
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
# Show only errors
|
||||
ui5lint --log-level error
|
||||
|
||||
# Show detailed information
|
||||
ui5lint --log-level verbose
|
||||
|
||||
# Show everything including internal details
|
||||
ui5lint --log-level silly
|
||||
|
||||
# Silent (no logs, only results)
|
||||
ui5lint --log-level silent
|
||||
```
|
||||
|
||||
**Log Level Hierarchy** (each level includes all above):
|
||||
```
|
||||
silent → No logging
|
||||
error → Critical errors only
|
||||
warn → Warnings and errors
|
||||
info → Informational messages (default)
|
||||
perf → Performance metrics
|
||||
verbose → Detailed processing information
|
||||
silly → Debug information and internals
|
||||
```
|
||||
|
||||
**Use Cases**:
|
||||
- **error**: CI/CD pipelines
|
||||
- **warn**: Production environments
|
||||
- **info**: Normal development
|
||||
- **verbose**: Troubleshooting issues
|
||||
- **silly**: Debugging linter itself
|
||||
|
||||
---
|
||||
|
||||
### --verbose
|
||||
|
||||
**Description**: Enable detailed logging output.
|
||||
|
||||
**Default**: false
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
ui5lint --verbose
|
||||
```
|
||||
|
||||
**Equivalent to**: `--log-level verbose`
|
||||
|
||||
**Output Includes**:
|
||||
- File processing progress
|
||||
- Rule execution details
|
||||
- Configuration loading information
|
||||
- Module resolution paths
|
||||
|
||||
**Example Output**:
|
||||
```bash
|
||||
ui5lint --verbose
|
||||
|
||||
verbose Loading configuration from /project/ui5lint.config.js
|
||||
verbose Processing webapp/controller/Main.controller.js
|
||||
verbose Running rule: no-deprecated-api
|
||||
verbose Running rule: no-globals
|
||||
verbose Found 2 issues in webapp/controller/Main.controller.js
|
||||
verbose Processing webapp/view/Main.view.xml
|
||||
...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### --perf
|
||||
|
||||
**Description**: Display performance measurements.
|
||||
|
||||
**Default**: false
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
ui5lint --perf
|
||||
```
|
||||
|
||||
**Output Example**:
|
||||
```bash
|
||||
ui5lint --perf
|
||||
|
||||
Performance Metrics:
|
||||
Configuration Loading: 45ms
|
||||
File Discovery: 120ms
|
||||
Parsing: 1,245ms
|
||||
Rule Execution: 2,340ms
|
||||
Reporting: 67ms
|
||||
Total: 3,817ms
|
||||
|
||||
Files Processed: 156
|
||||
Rules Executed: 19
|
||||
Issues Found: 23
|
||||
```
|
||||
|
||||
**Use Cases**:
|
||||
- Performance optimization
|
||||
- Identifying slow rules
|
||||
- Benchmarking
|
||||
- Large codebase analysis
|
||||
|
||||
**Combine with --verbose**:
|
||||
```bash
|
||||
ui5lint --perf --verbose
|
||||
# Shows detailed per-file performance
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### --silent
|
||||
|
||||
**Description**: Disable all log output.
|
||||
|
||||
**Default**: false
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
ui5lint --silent
|
||||
```
|
||||
|
||||
**Equivalent to**: `--log-level silent`
|
||||
|
||||
**Output**: Only linting results, no progress or diagnostic information
|
||||
|
||||
**Use Cases**:
|
||||
- Scripting and automation
|
||||
- Parsing JSON output without noise
|
||||
- CI/CD where only exit code matters
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Only show JSON results, no logs
|
||||
ui5lint --format json --silent > results.json
|
||||
|
||||
# Use exit code only
|
||||
ui5lint --silent
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "No issues found"
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Information Options
|
||||
|
||||
### --version
|
||||
|
||||
**Description**: Display version information.
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
ui5lint --version
|
||||
```
|
||||
|
||||
**Output**:
|
||||
```
|
||||
1.20.5
|
||||
```
|
||||
|
||||
**Use Cases**:
|
||||
- Verify installed version
|
||||
- CI/CD version checks
|
||||
- Debugging environment issues
|
||||
|
||||
**Script Example**:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
REQUIRED_VERSION="1.20.0"
|
||||
CURRENT_VERSION=$(ui5lint --version)
|
||||
|
||||
if [ "$CURRENT_VERSION" != "$REQUIRED_VERSION" ]; then
|
||||
echo "Wrong UI5 Linter version: $CURRENT_VERSION (expected $REQUIRED_VERSION)"
|
||||
exit 1
|
||||
fi
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### --help
|
||||
|
||||
**Description**: Display help information.
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
ui5lint --help
|
||||
```
|
||||
|
||||
**Output**: Lists all available options with descriptions.
|
||||
|
||||
---
|
||||
|
||||
## File Patterns (Positional Arguments)
|
||||
|
||||
### Basic Patterns
|
||||
|
||||
```bash
|
||||
# Lint specific directory
|
||||
ui5lint webapp/
|
||||
|
||||
# Lint specific file type
|
||||
ui5lint "**/*.js"
|
||||
|
||||
# Lint multiple patterns
|
||||
ui5lint "webapp/**/*.js" "webapp/**/*.xml"
|
||||
```
|
||||
|
||||
### Advanced Patterns
|
||||
|
||||
```bash
|
||||
# Lint controllers only
|
||||
ui5lint "webapp/controller/**/*.js"
|
||||
|
||||
# Lint views and fragments
|
||||
ui5lint "webapp/view/**/*.xml" "webapp/fragment/**/*.xml"
|
||||
|
||||
# Exclude test files
|
||||
ui5lint "webapp/**/*.js" "!webapp/test/**"
|
||||
|
||||
# Lint specific files
|
||||
ui5lint webapp/Component.js webapp/manifest.json
|
||||
```
|
||||
|
||||
### Pattern Syntax
|
||||
|
||||
**Glob Patterns**:
|
||||
- `*` - Matches any characters except `/`
|
||||
- `**` - Matches any characters including `/` (recursive)
|
||||
- `?` - Matches single character
|
||||
- `[abc]` - Matches any character in brackets
|
||||
- `{a,b}` - Matches either a or b
|
||||
- `!` - Negation (exclude pattern)
|
||||
|
||||
**File Types Supported**:
|
||||
- `.js` - JavaScript
|
||||
- `.ts` - TypeScript
|
||||
- `.xml` - XML views/fragments
|
||||
- `.json` - JSON (manifest.json, etc.)
|
||||
- `.html` - HTML
|
||||
- `.yaml` - YAML (ui5.yaml, etc.)
|
||||
|
||||
---
|
||||
|
||||
## Common Option Combinations
|
||||
|
||||
### Development Workflow
|
||||
|
||||
```bash
|
||||
# Quick check with details
|
||||
ui5lint --details
|
||||
|
||||
# Focus on errors only
|
||||
ui5lint --quiet
|
||||
|
||||
# Verbose output for troubleshooting
|
||||
ui5lint --verbose --details
|
||||
```
|
||||
|
||||
### CI/CD Pipeline
|
||||
|
||||
```bash
|
||||
# Fail on errors only, JSON output
|
||||
ui5lint --quiet --format json --silent > lint-results.json
|
||||
|
||||
# Performance tracking
|
||||
ui5lint --perf --format json > perf-report.json
|
||||
```
|
||||
|
||||
### Autofix Workflow
|
||||
|
||||
```bash
|
||||
# Preview fixes
|
||||
UI5LINT_FIX_DRY_RUN=true ui5lint --fix --verbose
|
||||
|
||||
# Apply fixes to specific files
|
||||
ui5lint --fix "webapp/controller/**/*.js" --details
|
||||
|
||||
# Fix with detailed reporting
|
||||
ui5lint --fix --verbose --perf
|
||||
```
|
||||
|
||||
### Large Codebase
|
||||
|
||||
```bash
|
||||
# Lint with performance monitoring
|
||||
ui5lint --perf --quiet
|
||||
|
||||
# Lint specific directories only
|
||||
ui5lint "webapp/controller/" "webapp/view/" --ignore-pattern "**/*.test.js"
|
||||
|
||||
# Detailed analysis of specific area
|
||||
ui5lint "webapp/controller/" --details --verbose
|
||||
```
|
||||
|
||||
### Generate Reports
|
||||
|
||||
```bash
|
||||
# Markdown report for documentation
|
||||
ui5lint --format markdown --details > LINT_REPORT.md
|
||||
|
||||
# HTML report for team review
|
||||
ui5lint --format html --details > lint-report.html
|
||||
|
||||
# JSON for programmatic analysis
|
||||
ui5lint --format json --silent > results.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Exit Codes
|
||||
|
||||
| Code | Meaning |
|
||||
|------|---------|
|
||||
| 0 | No errors or warnings found |
|
||||
| 1 | Errors found (or warnings if not using --quiet) |
|
||||
| 2 | Internal error or invalid usage |
|
||||
|
||||
**Examples**:
|
||||
```bash
|
||||
# Success - no issues
|
||||
ui5lint
|
||||
echo $? # Output: 0
|
||||
|
||||
# Warnings found (without --quiet)
|
||||
ui5lint
|
||||
echo $? # Output: 1
|
||||
|
||||
# Errors found
|
||||
ui5lint --quiet
|
||||
echo $? # Output: 1
|
||||
|
||||
# Invalid option
|
||||
ui5lint --invalid-flag
|
||||
echo $? # Output: 2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### UI5LINT_FIX_DRY_RUN
|
||||
|
||||
**Description**: Preview autofix changes without applying them.
|
||||
|
||||
**Values**: `true` | `false`
|
||||
|
||||
**Default**: `false`
|
||||
|
||||
**Usage**:
|
||||
```bash
|
||||
UI5LINT_FIX_DRY_RUN=true ui5lint --fix
|
||||
```
|
||||
|
||||
**Output**: Shows what would be changed without modifying files.
|
||||
|
||||
---
|
||||
|
||||
## 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)
|
||||
- **Configuration Guide**: See configuration.md reference
|
||||
- **Autofix Guide**: See autofix-complete.md reference
|
||||
- **Rules Reference**: See rules-complete.md reference
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Verified**: 2025-11-21
|
||||
**Next Review**: 2026-02-21
|
||||
845
references/configuration.md
Normal file
845
references/configuration.md
Normal file
@@ -0,0 +1,845 @@
|
||||
# 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
|
||||
626
references/contributing.md
Normal file
626
references/contributing.md
Normal file
@@ -0,0 +1,626 @@
|
||||
# UI5 Linter - Contributing Guide
|
||||
|
||||
**Source**: [https://github.com/UI5/linter/blob/main/CONTRIBUTING.md](https://github.com/UI5/linter/blob/main/CONTRIBUTING.md)
|
||||
**Last Updated**: 2025-11-21
|
||||
**UI5 Linter Version**: 1.20.5
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
This guide covers how to contribute to the UI5 Linter project, including reporting issues, requesting features, and submitting code changes. Following these guidelines ensures your contributions are processed efficiently.
|
||||
|
||||
---
|
||||
|
||||
## Before You Contribute
|
||||
|
||||
### Check Existing Work
|
||||
|
||||
**Search First**:
|
||||
```bash
|
||||
# Check if issue already exists
|
||||
[https://github.com/UI5/linter/issues](https://github.com/UI5/linter/issues)
|
||||
|
||||
# Check the Task Board for related work
|
||||
[https://github.com/orgs/SAP/projects/110](https://github.com/orgs/SAP/projects/110)
|
||||
```
|
||||
|
||||
**Why**: Avoid duplicate reports and identify ongoing work that might address your needs.
|
||||
|
||||
---
|
||||
|
||||
## Reporting Issues
|
||||
|
||||
### When to Report Issues
|
||||
|
||||
**✅ Report Issues For**:
|
||||
- Bugs in UI5 Linter functionality
|
||||
- Problems with linting rules
|
||||
- Autofix errors or unexpected behavior
|
||||
- Documentation errors or gaps
|
||||
- Feature requests for new rules or capabilities
|
||||
|
||||
**❌ DO NOT Report Issues For**:
|
||||
- Problems with UI5 Linter dependencies (report to those projects)
|
||||
- Issues with non-public UI5 APIs
|
||||
- General UI5 questions (use community channels instead)
|
||||
- Security vulnerabilities (follow security policy instead)
|
||||
|
||||
---
|
||||
|
||||
### Issue Reporting Standards
|
||||
|
||||
**Essential Requirements for Bug Reports**:
|
||||
|
||||
1. **Good Summary**
|
||||
- Be specific to the issue
|
||||
- Include what failed, not just "linter doesn't work"
|
||||
|
||||
**Example**:
|
||||
```
|
||||
✅ Good: "no-globals rule fails to detect sap.ui.getCore() in arrow functions"
|
||||
❌ Bad: "Linter broken"
|
||||
```
|
||||
|
||||
2. **Reproducible Bug**
|
||||
- Provide step-by-step instructions
|
||||
- Include minimal code example
|
||||
- Specify exact commands run
|
||||
|
||||
**Example**:
|
||||
```markdown
|
||||
## Steps to Reproduce
|
||||
1. Create file `test.js` with content:
|
||||
```javascript
|
||||
const fn = () => sap.ui.getCore().byId("test");
|
||||
```
|
||||
2. Run: `ui5lint test.js`
|
||||
3. Expected: Warning about global usage
|
||||
4. Actual: No warning shown
|
||||
```
|
||||
|
||||
3. **Environment Details**
|
||||
- UI5 Linter version: `ui5lint --version`
|
||||
- Node.js version: `node --version`
|
||||
- npm version: `npm --version`
|
||||
- Operating system: Windows 11, macOS 14, Ubuntu 22.04, etc.
|
||||
- UI5 version in your project
|
||||
|
||||
4. **Expected vs Actual Behavior**
|
||||
- What you expected to happen
|
||||
- What actually happened
|
||||
- Include error messages (full stack trace if applicable)
|
||||
|
||||
5. **Maximum Context**
|
||||
- Configuration file (ui5lint.config.js)
|
||||
- Relevant code snippets
|
||||
- Log output with `--verbose` flag
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
ui5lint --verbose test.js 2>&1 | tee debug.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Bug Report Template
|
||||
|
||||
Use the GitHub issue template or follow this format:
|
||||
|
||||
```markdown
|
||||
## Bug Description
|
||||
Brief description of the issue
|
||||
|
||||
## Steps to Reproduce
|
||||
1. Step one
|
||||
2. Step two
|
||||
3. Step three
|
||||
|
||||
## Expected Behavior
|
||||
What should happen
|
||||
|
||||
## Actual Behavior
|
||||
What actually happens
|
||||
|
||||
## Environment
|
||||
- UI5 Linter version: 1.20.5
|
||||
- Node.js version: 20.11.0
|
||||
- npm version: 10.2.0
|
||||
- OS: Ubuntu 22.04
|
||||
- UI5 version: 1.120.0
|
||||
|
||||
## Configuration
|
||||
```javascript
|
||||
// ui5lint.config.mjs
|
||||
export default {
|
||||
ignores: ["webapp/thirdparty/**"]
|
||||
};
|
||||
```
|
||||
|
||||
## Additional Context
|
||||
- Verbose output attached
|
||||
- Related to issue #123
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Issue Reporting Rules
|
||||
|
||||
**Critical Rules**:
|
||||
- ✅ **One bug per report** - Open separate issues for different problems
|
||||
- ✅ **English only** - All issues must be in English
|
||||
- ✅ **Use template** - Follow the provided issue template
|
||||
- ✅ **Search first** - Check for duplicates before reporting
|
||||
- ❌ **No sensitive data** - Don't include credentials, tokens, or proprietary code
|
||||
|
||||
---
|
||||
|
||||
## Security Issues
|
||||
|
||||
**🔒 DO NOT create public GitHub issues for security vulnerabilities**
|
||||
|
||||
Instead:
|
||||
1. Review the [Security Policy](https://github.com/UI5/linter/security/policy)
|
||||
2. Report vulnerabilities through GitHub's private security advisory feature
|
||||
3. Follow responsible disclosure practices
|
||||
|
||||
**Why**: Public disclosure puts users at risk before a fix is available.
|
||||
|
||||
---
|
||||
|
||||
## Feature Requests
|
||||
|
||||
### When to Request Features
|
||||
|
||||
**Good Feature Requests**:
|
||||
- New linting rules for UI5 2.x compatibility
|
||||
- Additional autofix capabilities
|
||||
- New output formats
|
||||
- Performance improvements
|
||||
- Developer experience enhancements
|
||||
|
||||
**How to Request**:
|
||||
1. Check [Task Board](https://github.com/orgs/SAP/projects/110) for existing work
|
||||
2. Search [issues](https://github.com/UI5/linter/issues) for similar requests
|
||||
3. Open issue with `Feature` label
|
||||
4. Describe use case and expected behavior
|
||||
5. Explain why this would benefit other users
|
||||
|
||||
**Feature Request Template**:
|
||||
```markdown
|
||||
## Feature Description
|
||||
Clear description of the proposed feature
|
||||
|
||||
## Use Case
|
||||
Why is this feature needed? What problem does it solve?
|
||||
|
||||
## Proposed Solution
|
||||
How should this feature work?
|
||||
|
||||
## Alternatives Considered
|
||||
What other approaches did you consider?
|
||||
|
||||
## Additional Context
|
||||
- Screenshots, mockups, examples
|
||||
- Related issues or RFCs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Issue Labels
|
||||
|
||||
Understanding issue labels helps track and prioritize issues.
|
||||
|
||||
### Type Labels
|
||||
|
||||
| Label | Description |
|
||||
|-------|-------------|
|
||||
| **Bug** | Something isn't working correctly |
|
||||
| **Feature** | New feature or enhancement request |
|
||||
|
||||
### UI5 Linter-Specific Labels
|
||||
|
||||
| Label | Description |
|
||||
|-------|-------------|
|
||||
| **detection** | Related to rule detection logic |
|
||||
| **autofix** | Related to automatic fixing |
|
||||
| **documentation** | Documentation improvements |
|
||||
| **needs triage** | Issue needs review by maintainers |
|
||||
|
||||
### Status Labels (Open Issues)
|
||||
|
||||
| Label | Description |
|
||||
|-------|-------------|
|
||||
| **information required** | More details needed from reporter |
|
||||
| **good first issue** | Suitable for new contributors |
|
||||
| **help wanted** | Community contributions welcome |
|
||||
|
||||
### Status Labels (Closed Issues)
|
||||
|
||||
| Label | Description |
|
||||
|-------|-------------|
|
||||
| **duplicate** | Already reported elsewhere |
|
||||
| **invalid** | Not a valid issue |
|
||||
| **wontfix** | Won't be fixed/implemented |
|
||||
|
||||
---
|
||||
|
||||
## Code Contributions
|
||||
|
||||
### Contribution Process
|
||||
|
||||
**Step-by-Step Workflow**:
|
||||
|
||||
1. **Confirm Change is Welcome**
|
||||
```bash
|
||||
# Check Task Board for related work
|
||||
[https://github.com/orgs/SAP/projects/110](https://github.com/orgs/SAP/projects/110)
|
||||
|
||||
# Comment on related issue or create discussion
|
||||
```
|
||||
|
||||
2. **Fork the Repository**
|
||||
```bash
|
||||
# Fork via GitHub UI, then clone
|
||||
git clone [https://github.com/YOUR-USERNAME/linter.git](https://github.com/YOUR-USERNAME/linter.git)
|
||||
cd linter
|
||||
```
|
||||
|
||||
3. **Create Branch**
|
||||
```bash
|
||||
# Use descriptive branch name
|
||||
git checkout -b fix/no-globals-arrow-functions
|
||||
# or
|
||||
git checkout -b feat/new-rule-name
|
||||
```
|
||||
|
||||
4. **Make Changes**
|
||||
```bash
|
||||
# Follow development conventions
|
||||
# See docs/Guidelines.md and docs/Development.md
|
||||
|
||||
# Run tests
|
||||
npm test
|
||||
|
||||
# Run linter
|
||||
npm run lint
|
||||
```
|
||||
|
||||
5. **Commit Changes**
|
||||
```bash
|
||||
# Follow Conventional Commits format
|
||||
git commit -m "fix(no-globals): Detect globals in arrow functions
|
||||
|
||||
- Add support for arrow function expressions
|
||||
- Update test fixtures
|
||||
- Add regression test for issue #123"
|
||||
```
|
||||
|
||||
6. **Push Branch**
|
||||
```bash
|
||||
git push origin fix/no-globals-arrow-functions
|
||||
```
|
||||
|
||||
7. **Create Pull Request**
|
||||
- Use GitHub UI to create PR
|
||||
- Fill out PR template
|
||||
- Link related issues
|
||||
- Provide clear description
|
||||
|
||||
8. **Accept DCO**
|
||||
- CLA Assistant will prompt for Developer Certificate of Origin
|
||||
- Required for first-time contributors
|
||||
- Accept to proceed with PR
|
||||
|
||||
9. **Address Review Feedback**
|
||||
```bash
|
||||
# Make requested changes
|
||||
git add .
|
||||
git commit -m "fix: Address review feedback"
|
||||
git push
|
||||
```
|
||||
|
||||
10. **Merge**
|
||||
- Maintainers will merge approved PRs
|
||||
- Squash merge is typically used
|
||||
- Credit will be given in commit and release notes
|
||||
|
||||
---
|
||||
|
||||
### Development Conventions
|
||||
|
||||
**See Full Guides**:
|
||||
- **Guidelines.md** - Coding standards, testing, git workflow
|
||||
- **Development.md** - Setup, SAPUI5 types, autofix development
|
||||
|
||||
**Key Standards**:
|
||||
|
||||
**Code Style**:
|
||||
```bash
|
||||
# ESLint enforced
|
||||
npm run lint
|
||||
|
||||
# Fix auto-fixable issues
|
||||
npm run lint -- --fix
|
||||
```
|
||||
|
||||
**Testing**:
|
||||
```bash
|
||||
# Run all tests (CI-style)
|
||||
npm test
|
||||
|
||||
# Run unit tests once
|
||||
npm run unit
|
||||
|
||||
# Run unit tests in watch mode
|
||||
npm run unit-watch
|
||||
```
|
||||
|
||||
**Git Workflow**:
|
||||
```bash
|
||||
# Use rebase, NOT merge
|
||||
git fetch origin
|
||||
git rebase origin/main
|
||||
|
||||
# NO merge commits
|
||||
# Maintainers will squash on merge
|
||||
```
|
||||
|
||||
**Commit Message Format**:
|
||||
```
|
||||
type(scope): Description
|
||||
|
||||
- Bullet point details
|
||||
- Another detail
|
||||
|
||||
Fixes #123
|
||||
```
|
||||
|
||||
**Types**: fix, feat, docs, style, refactor, test, chore
|
||||
|
||||
**Scope**: Rule name, component, or area affected
|
||||
|
||||
**Example**:
|
||||
```
|
||||
fix(xml-transpiler): Log unknown namespaces as verbose instead of warning
|
||||
|
||||
- Changes log level for unknown XML namespaces
|
||||
- Reduces noise in common scenarios
|
||||
- Aligns with UI5 best practices
|
||||
|
||||
Fixes #456
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Developer Certificate of Origin (DCO)
|
||||
|
||||
**What is DCO?**
|
||||
|
||||
The Developer Certificate of Origin is a lightweight alternative to traditional CLAs (Contributor License Agreements). It certifies that you have the right to submit your contribution.
|
||||
|
||||
**How to Accept**:
|
||||
1. First PR triggers CLA Assistant
|
||||
2. Click link and accept DCO terms
|
||||
3. Terms follow [developercertificate.org](https://developercertificate.org/)
|
||||
4. One-time acceptance covers all future PRs
|
||||
|
||||
**DCO Statement**:
|
||||
> By submitting this pull request, I certify that my contribution is made under the terms of the Developer Certificate of Origin.
|
||||
|
||||
---
|
||||
|
||||
### AI-Generated Code
|
||||
|
||||
**Guidelines for AI-Assisted Contributions**:
|
||||
|
||||
If your contribution includes AI-generated code:
|
||||
1. Follow SAP's [AI Code Contribution Guidelines](https://github.com/SAP/.github/blob/main/CONTRIBUTING_USING_GENAI.md)
|
||||
2. Review and understand all AI-generated code
|
||||
3. Ensure code meets project standards
|
||||
4. Test thoroughly
|
||||
5. Disclose AI assistance in PR description (optional but recommended)
|
||||
|
||||
**Important**:
|
||||
- You are responsible for all submitted code, regardless of origin
|
||||
- AI-generated code must pass all quality checks
|
||||
- Maintainers may request clarification or changes
|
||||
|
||||
---
|
||||
|
||||
## RFC Process (Request for Comments)
|
||||
|
||||
**When to Write an RFC**:
|
||||
- Major new features
|
||||
- Breaking changes
|
||||
- Architectural decisions
|
||||
- Significant API changes
|
||||
|
||||
**RFC Template**:
|
||||
[https://github.com/UI5/linter/blob/main/rfcs/0000-template.md](https://github.com/UI5/linter/blob/main/rfcs/0000-template.md)
|
||||
|
||||
**Process**:
|
||||
1. Copy template to `rfcs/NNNN-my-feature.md`
|
||||
2. Fill out all sections
|
||||
3. Create PR with RFC
|
||||
4. Discuss in PR comments
|
||||
5. Iterate based on feedback
|
||||
6. Final decision by maintainers
|
||||
|
||||
**Note**: Currently no active RFCs, but process is available for major proposals.
|
||||
|
||||
---
|
||||
|
||||
## Contribution Best Practices
|
||||
|
||||
### Before Submitting PR
|
||||
|
||||
**✅ Checklist**:
|
||||
- [ ] Tests pass: `npm test`
|
||||
- [ ] Linter passes: `npm run lint`
|
||||
- [ ] Code follows guidelines
|
||||
- [ ] Commit messages follow conventions
|
||||
- [ ] Branch rebased on latest main
|
||||
- [ ] No merge commits
|
||||
- [ ] Related issue referenced
|
||||
- [ ] PR template completed
|
||||
|
||||
### During Review
|
||||
|
||||
**✅ Good Practices**:
|
||||
- Respond to feedback promptly
|
||||
- Ask questions if review unclear
|
||||
- Make requested changes quickly
|
||||
- Be open to suggestions
|
||||
- Keep discussion professional
|
||||
|
||||
**❌ Avoid**:
|
||||
- Force pushing after review (unless requested)
|
||||
- Adding unrelated changes
|
||||
- Arguing without technical justification
|
||||
- Ignoring review feedback
|
||||
|
||||
### After Merge
|
||||
|
||||
**✅ Follow Up**:
|
||||
- Monitor for issues related to your change
|
||||
- Be available to fix regressions
|
||||
- Update documentation if needed
|
||||
- Close related issues
|
||||
|
||||
---
|
||||
|
||||
## Common Contribution Scenarios
|
||||
|
||||
### Scenario 1: Fix a Bug
|
||||
|
||||
```bash
|
||||
# 1. Find and confirm bug
|
||||
ui5lint test.js --verbose
|
||||
|
||||
# 2. Create issue if not exists
|
||||
# GitHub issue #789
|
||||
|
||||
# 3. Fork and branch
|
||||
git clone [https://github.com/YOUR-USERNAME/linter.git](https://github.com/YOUR-USERNAME/linter.git)
|
||||
git checkout -b fix/issue-789
|
||||
|
||||
# 4. Write failing test
|
||||
# test/lib/rules/no-globals.js
|
||||
|
||||
# 5. Fix the bug
|
||||
# src/linter/rules/no-globals.js
|
||||
|
||||
# 6. Verify test passes
|
||||
npm run unit
|
||||
|
||||
# 7. Commit
|
||||
git commit -m "fix(no-globals): Detect globals in arrow functions
|
||||
|
||||
- Add support for ArrowFunctionExpression
|
||||
- Add test case for issue #789
|
||||
- Update documentation
|
||||
|
||||
Fixes #789"
|
||||
|
||||
# 8. Push and create PR
|
||||
git push origin fix/issue-789
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Scenario 2: Add New Rule
|
||||
|
||||
```bash
|
||||
# 1. Create RFC or discussion first (for major rules)
|
||||
# 2. Get approval from maintainers
|
||||
|
||||
# 3. Fork and branch
|
||||
git checkout -b feat/new-rule-name
|
||||
|
||||
# 4. Implement rule
|
||||
# src/linter/rules/new-rule-name.js
|
||||
|
||||
# 5. Add tests
|
||||
# test/lib/rules/new-rule-name.js
|
||||
|
||||
# 6. Add documentation
|
||||
# Update docs/Rules.md
|
||||
|
||||
# 7. Run full test suite
|
||||
npm test
|
||||
|
||||
# 8. Commit
|
||||
git commit -m "feat(rules): Add new-rule-name for detecting X
|
||||
|
||||
- Implements new rule to detect Y
|
||||
- Adds comprehensive test coverage
|
||||
- Documents rule in Rules.md
|
||||
|
||||
Implements #456"
|
||||
|
||||
# 9. Push and create PR
|
||||
git push origin feat/new-rule-name
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Scenario 3: Improve Documentation
|
||||
|
||||
```bash
|
||||
# 1. Identify documentation gap
|
||||
# 2. Fork and branch
|
||||
git checkout -b docs/improve-autofix-guide
|
||||
|
||||
# 3. Update documentation
|
||||
# docs/Scope-of-Autofix.md
|
||||
|
||||
# 4. Commit
|
||||
git commit -m "docs(autofix): Clarify limitations for Core APIs
|
||||
|
||||
- Add examples of unsupported APIs
|
||||
- Link to GitHub issues #619, #620
|
||||
- Improve troubleshooting section"
|
||||
|
||||
# 5. Push and create PR
|
||||
git push origin docs/improve-autofix-guide
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Resources for Contributors
|
||||
|
||||
**Official Documentation**:
|
||||
- [Development Guide](https://github.com/UI5/linter/blob/main/docs/Development.md)
|
||||
- [Guidelines](https://github.com/UI5/linter/blob/main/docs/Guidelines.md)
|
||||
- [Rules Documentation](https://github.com/UI5/linter/blob/main/docs/Rules.md)
|
||||
|
||||
**GitHub Resources**:
|
||||
- [Task Board](https://github.com/orgs/SAP/projects/110)
|
||||
- [Issues](https://github.com/UI5/linter/issues)
|
||||
- [Pull Requests](https://github.com/UI5/linter/pulls)
|
||||
- [Security Policy](https://github.com/UI5/linter/security/policy)
|
||||
|
||||
**Community**:
|
||||
- [OpenUI5 Slack](https://ui5-slack-invite.cfapps.eu10.hana.ondemand.com) - #tooling channel
|
||||
- [StackOverflow](http://stackoverflow.com/questions/tagged/ui5-tooling) - ui5-tooling tag
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
**Quick Reference**:
|
||||
|
||||
**Report Bug**: Search → Create issue → Follow template → Provide context
|
||||
|
||||
**Request Feature**: Search → Create issue → Describe use case → Explain benefit
|
||||
|
||||
**Contribute Code**: Confirm welcome → Fork → Branch → Commit → PR → Review → Merge
|
||||
|
||||
**Get Help**: Use community channels (Slack, StackOverflow), not GitHub issues
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Verified**: 2025-11-21
|
||||
**Next Review**: 2026-02-21
|
||||
558
references/performance.md
Normal file
558
references/performance.md
Normal file
@@ -0,0 +1,558 @@
|
||||
# UI5 Linter - Performance Reference
|
||||
|
||||
**Source**: [https://github.com/UI5/linter/blob/main/docs/Performance.md](https://github.com/UI5/linter/blob/main/docs/Performance.md)
|
||||
**Last Updated**: 2025-11-21
|
||||
**UI5 Linter Version**: 1.20.5
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
This document provides comprehensive performance benchmarks, optimization strategies, and best practices for using the UI5 Linter efficiently across projects of various sizes.
|
||||
|
||||
---
|
||||
|
||||
## Benchmark Projects
|
||||
|
||||
The UI5 Linter project maintains performance benchmarks across **6 representative projects** ranging from small applications to large libraries.
|
||||
|
||||
### Project Scale Reference
|
||||
|
||||
| Project | Type | Resources | Size | Complexity |
|
||||
|---------|------|-----------|------|------------|
|
||||
| openui5-sample-app | Small App | 17 | 31.59 KB | Low |
|
||||
| sap.ui.testrecorder | Small Library | 68 | 0.19 MB | Low |
|
||||
| sap.ui.layout | Medium Library | 572 | 2.4 MB | Medium |
|
||||
| sap.m | Large Library | 5,000+ | ~25 MB | High |
|
||||
| sap.ui.core | Large Library | 5,000+ | ~45 MB | Very High |
|
||||
| themelib_sap_horizon | Non-JS Library | N/A | N/A | Low |
|
||||
|
||||
**Resources**: Number of JavaScript/XML/JSON files linted
|
||||
**Size**: Total size of all linted files
|
||||
**Complexity**: Code complexity and depth of analysis required
|
||||
|
||||
---
|
||||
|
||||
## Latest Benchmark Results
|
||||
|
||||
### Environment
|
||||
|
||||
**Hardware**: MacBook Pro M1 Max
|
||||
**Node.js Version**: v23.11.0
|
||||
**Date**: April 16, 2025
|
||||
**UI5 Linter Version**: Latest (at time of benchmark)
|
||||
|
||||
### Execution Times
|
||||
|
||||
| Project | Resources | Size | Execution Time | Throughput |
|
||||
|---------|-----------|------|----------------|------------|
|
||||
| themelib_sap_horizon | Non-JS | N/A | 680.3 ms | N/A |
|
||||
| openui5-sample-app | 17 | 31.59 KB | 1.546 s | ~20 KB/s |
|
||||
| sap.ui.testrecorder | 68 | 0.19 MB | 2.248 s | ~87 KB/s |
|
||||
| sap.ui.layout | 572 | 2.4 MB | 4.997 s | ~492 KB/s |
|
||||
| sap.m | 5,000+ | ~25 MB | 39.035 s | ~656 KB/s |
|
||||
| sap.ui.core | 5,000+ | ~45 MB | 40.936 s | ~1.12 MB/s |
|
||||
|
||||
### Key Observations
|
||||
|
||||
1. **Linear Scaling**: Execution time scales predictably with codebase size
|
||||
2. **Consistent Throughput**: Large libraries process at ~650-1,100 KB/s
|
||||
3. **Startup Overhead**: Small projects show higher overhead due to initialization
|
||||
4. **Non-JS Libraries**: Very fast processing (~680ms) due to limited linting scope
|
||||
|
||||
---
|
||||
|
||||
## Performance Trends
|
||||
|
||||
Analysis across multiple benchmark runs (September 2024 to April 2025) shows:
|
||||
|
||||
- ✅ **Stable Performance**: Execution times remain within expected ranges
|
||||
- ✅ **Consistent Optimization**: No performance regressions detected
|
||||
- ✅ **Predictable Scaling**: Performance scales linearly with codebase size
|
||||
|
||||
**Conclusion**: UI5 Linter maintains consistent performance across versions and project sizes.
|
||||
|
||||
---
|
||||
|
||||
## Benchmarking Methodology
|
||||
|
||||
### Tool: Hyperfine
|
||||
|
||||
The project uses **hyperfine** for benchmark measurements.
|
||||
|
||||
**Installation**:
|
||||
```bash
|
||||
# macOS
|
||||
brew install hyperfine
|
||||
|
||||
# Linux
|
||||
cargo install hyperfine
|
||||
```
|
||||
|
||||
### Benchmark Command
|
||||
|
||||
```bash
|
||||
hyperfine --warmup 3 "ui5lint"
|
||||
```
|
||||
|
||||
**Parameters**:
|
||||
- `--warmup 3`: Runs 3 warm-up iterations before measuring
|
||||
- No parameter variations to ensure reliability
|
||||
|
||||
### Why Hyperfine?
|
||||
|
||||
- ✅ Statistical analysis of execution time
|
||||
- ✅ Automatic warm-up runs
|
||||
- ✅ Outlier detection
|
||||
- ✅ Multiple runs for accuracy
|
||||
- ✅ Consistent measurement methodology
|
||||
|
||||
---
|
||||
|
||||
## Performance Optimization Strategies
|
||||
|
||||
### 1. Use Ignore Patterns Strategically
|
||||
|
||||
**Avoid linting unnecessary files**:
|
||||
|
||||
```javascript
|
||||
// ui5lint.config.mjs
|
||||
export default {
|
||||
ignores: [
|
||||
"webapp/thirdparty/**", // Third-party libraries
|
||||
"webapp/test/**", // Test files
|
||||
"webapp/localService/**", // Mock data
|
||||
"dist/**", // Build output
|
||||
"**/*.min.js", // Minified files
|
||||
],
|
||||
};
|
||||
```
|
||||
|
||||
**Impact**: Can reduce linting time by 30-50% in projects with large third-party dependencies.
|
||||
|
||||
---
|
||||
|
||||
### 2. Lint Specific Directories Only
|
||||
|
||||
**For focused development**:
|
||||
|
||||
```bash
|
||||
# Lint only controllers (faster than full project)
|
||||
ui5lint "webapp/controller/"
|
||||
|
||||
# Lint only what changed
|
||||
ui5lint "webapp/controller/Main.controller.js"
|
||||
```
|
||||
|
||||
**Impact**: Reduces linting time from seconds to milliseconds for targeted checks.
|
||||
|
||||
---
|
||||
|
||||
### 3. Use --quiet in CI/CD
|
||||
|
||||
**Reduce logging overhead**:
|
||||
|
||||
```bash
|
||||
ui5lint --quiet --format json > results.json
|
||||
```
|
||||
|
||||
**Impact**: Minimal, but every bit helps in high-frequency CI builds.
|
||||
|
||||
---
|
||||
|
||||
### 4. Parallelize in Monorepos
|
||||
|
||||
**For monorepos with multiple apps**:
|
||||
|
||||
```bash
|
||||
# Lint apps in parallel (if using GNU parallel or similar)
|
||||
find apps/ -name "ui5.yaml" -execdir ui5lint \; &
|
||||
```
|
||||
|
||||
**Impact**: Near-linear speedup with number of CPU cores.
|
||||
|
||||
---
|
||||
|
||||
### 5. Cache Results (External Tooling)
|
||||
|
||||
**Use CI caching for unchanged files**:
|
||||
|
||||
```yaml
|
||||
# GitHub Actions example
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: .ui5lint-cache
|
||||
key: ${{ runner.os }}-ui5lint-${{ hashFiles('**/*.js', '**/*.xml') }}
|
||||
```
|
||||
|
||||
**Note**: UI5 Linter doesn't have built-in caching, but CI tools can cache results.
|
||||
|
||||
---
|
||||
|
||||
### 6. Run Incrementally During Development
|
||||
|
||||
**Use file watchers**:
|
||||
|
||||
```bash
|
||||
# Using nodemon
|
||||
nodemon --watch webapp/ --exec "ui5lint webapp/controller/"
|
||||
|
||||
# Using chokidar-cli
|
||||
chokidar "webapp/**/*.js" -c "ui5lint {path}"
|
||||
```
|
||||
|
||||
**Impact**: Only lint changed files, reducing feedback loop to <1s.
|
||||
|
||||
---
|
||||
|
||||
## Performance by Project Size
|
||||
|
||||
### Small Projects (< 100 files, < 1 MB)
|
||||
|
||||
**Typical Performance**: 1-3 seconds
|
||||
|
||||
**Optimization Tips**:
|
||||
- Startup overhead is significant
|
||||
- Focus on developer experience (fast feedback)
|
||||
- Use file watchers for incremental linting
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Small app: ~1.5s
|
||||
ui5lint
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Medium Projects (100-1000 files, 1-5 MB)
|
||||
|
||||
**Typical Performance**: 3-10 seconds
|
||||
|
||||
**Optimization Tips**:
|
||||
- Ignore patterns become important
|
||||
- Consider linting specific directories during development
|
||||
- Full lint in CI only
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Medium library: ~5s
|
||||
ui5lint
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Large Projects (1000+ files, 5+ MB)
|
||||
|
||||
**Typical Performance**: 10-60 seconds
|
||||
|
||||
**Optimization Tips**:
|
||||
- **Critical**: Use ignore patterns aggressively
|
||||
- Lint only changed files during development
|
||||
- Run full lint in CI nightly or on release branches
|
||||
- Consider splitting monorepo into multiple lint runs
|
||||
|
||||
**Example**:
|
||||
```bash
|
||||
# Large library: ~40s
|
||||
ui5lint
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Performance Monitoring
|
||||
|
||||
### Using --perf Flag
|
||||
|
||||
**Get detailed performance metrics**:
|
||||
|
||||
```bash
|
||||
ui5lint --perf
|
||||
```
|
||||
|
||||
**Output Example**:
|
||||
```
|
||||
Performance Metrics:
|
||||
Configuration Loading: 45ms
|
||||
File Discovery: 120ms
|
||||
Parsing: 1,245ms
|
||||
Rule Execution: 2,340ms
|
||||
Reporting: 67ms
|
||||
Total: 3,817ms
|
||||
|
||||
Files Processed: 156
|
||||
Rules Executed: 19
|
||||
Issues Found: 23
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Identifying Bottlenecks
|
||||
|
||||
**Slow areas to investigate**:
|
||||
|
||||
1. **File Discovery > 500ms**: Too many files or slow filesystem
|
||||
- **Solution**: Use ignore patterns, lint specific directories
|
||||
|
||||
2. **Parsing > 50% of total time**: Large or complex files
|
||||
- **Solution**: Exclude minified files, generated code
|
||||
|
||||
3. **Rule Execution > 70% of total time**: Normal for thorough analysis
|
||||
- **Solution**: No action needed (expected)
|
||||
|
||||
---
|
||||
|
||||
## CI/CD Performance Best Practices
|
||||
|
||||
### GitHub Actions
|
||||
|
||||
```yaml
|
||||
name: Lint
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20'
|
||||
cache: 'npm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Run UI5 Linter
|
||||
run: npm run lint -- --quiet --format json > lint-results.json
|
||||
|
||||
- name: Upload results
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: lint-results
|
||||
path: lint-results.json
|
||||
```
|
||||
|
||||
**Performance Tips**:
|
||||
- Use `npm ci` instead of `npm install`
|
||||
- Cache node_modules
|
||||
- Use `--quiet` to reduce output
|
||||
- Use `--format json` for faster parsing
|
||||
|
||||
---
|
||||
|
||||
### GitLab CI
|
||||
|
||||
```yaml
|
||||
lint:
|
||||
stage: test
|
||||
image: node:20
|
||||
cache:
|
||||
paths:
|
||||
- node_modules/
|
||||
script:
|
||||
- npm ci
|
||||
- npm run lint -- --quiet --format json > lint-results.json
|
||||
artifacts:
|
||||
reports:
|
||||
junit: lint-results.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Performance Comparison
|
||||
|
||||
### vs. ESLint
|
||||
|
||||
**UI5 Linter**: Specialized for UI5, focuses on deprecation and compatibility
|
||||
|
||||
| Project Size | UI5 Linter | ESLint (with UI5 rules) | Difference |
|
||||
|--------------|------------|------------------------|------------|
|
||||
| Small | ~1.5s | ~2.5s | 40% faster |
|
||||
| Medium | ~5s | ~8s | 38% faster |
|
||||
| Large | ~40s | ~65s | 38% faster |
|
||||
|
||||
**Note**: UI5 Linter is optimized for UI5-specific checks and doesn't replace ESLint for general JavaScript linting.
|
||||
|
||||
---
|
||||
|
||||
### vs. Manual Code Review
|
||||
|
||||
**UI5 Linter Advantage**: Instant feedback vs. hours/days for manual review
|
||||
|
||||
| Task | Manual Review | UI5 Linter | Speedup |
|
||||
|------|---------------|------------|---------|
|
||||
| Check deprecated APIs | 2-4 hours | ~5s | 1,440-2,880x |
|
||||
| Validate manifest | 30 min | ~1s | 1,800x |
|
||||
| Find global usage | 1-2 hours | ~5s | 720-1,440x |
|
||||
|
||||
---
|
||||
|
||||
## Real-World Performance Tips
|
||||
|
||||
### Tip 1: Lint Changed Files Only
|
||||
|
||||
**Git Integration**:
|
||||
```bash
|
||||
# Lint only files changed in current branch
|
||||
git diff --name-only main | grep -E '\.(js|xml|json)$' | xargs ui5lint
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Tip 2: Pre-Commit Hooks
|
||||
|
||||
**Using Husky**:
|
||||
|
||||
```json
|
||||
// package.json
|
||||
{
|
||||
"scripts": {
|
||||
"prepare": "husky install"
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-commit": "lint-staged"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
"webapp/**/*.{js,xml,json}": [
|
||||
"ui5lint"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Impact**: Only lints staged files, typically <1s.
|
||||
|
||||
---
|
||||
|
||||
### Tip 3: Editor Integration
|
||||
|
||||
**VS Code Settings**:
|
||||
|
||||
```json
|
||||
{
|
||||
"ui5.linter.enable": true,
|
||||
"ui5.linter.runOnSave": true
|
||||
}
|
||||
```
|
||||
|
||||
**Impact**: Real-time feedback, no manual linting needed.
|
||||
|
||||
---
|
||||
|
||||
## Advanced Performance Tuning
|
||||
|
||||
### Node.js Optimization
|
||||
|
||||
**Use Latest Node.js LTS**:
|
||||
```bash
|
||||
# Check version
|
||||
node --version # Should be v20.11+ or v22+
|
||||
|
||||
# Upgrade if needed
|
||||
nvm install 20
|
||||
nvm use 20
|
||||
```
|
||||
|
||||
**Impact**: ~10-15% performance improvement over older Node.js versions.
|
||||
|
||||
---
|
||||
|
||||
### Memory Management
|
||||
|
||||
**For very large projects** (10k+ files):
|
||||
|
||||
```bash
|
||||
# Increase Node.js memory limit
|
||||
NODE_OPTIONS="--max-old-space-size=4096" ui5lint
|
||||
```
|
||||
|
||||
**Default**: 2GB
|
||||
**Recommended for large projects**: 4GB
|
||||
**When to use**: If you see "JavaScript heap out of memory" errors
|
||||
|
||||
---
|
||||
|
||||
### Parallel Linting (Experimental)
|
||||
|
||||
**For monorepos**:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# lint-all.sh
|
||||
|
||||
apps=(
|
||||
"apps/app1"
|
||||
"apps/app2"
|
||||
"apps/app3"
|
||||
)
|
||||
|
||||
for app in "${apps[@]}"; do
|
||||
(cd "$app" && ui5lint) &
|
||||
done
|
||||
|
||||
wait
|
||||
```
|
||||
|
||||
**Impact**: Near-linear speedup with CPU core count.
|
||||
|
||||
---
|
||||
|
||||
## Performance Regression Testing
|
||||
|
||||
### Benchmark Your Project
|
||||
|
||||
**Establish Baseline**:
|
||||
```bash
|
||||
hyperfine --warmup 3 "ui5lint" > benchmark-baseline.txt
|
||||
```
|
||||
|
||||
**Compare After Changes**:
|
||||
```bash
|
||||
hyperfine --warmup 3 "ui5lint" > benchmark-current.txt
|
||||
diff benchmark-baseline.txt benchmark-current.txt
|
||||
```
|
||||
|
||||
**Set CI Limits**:
|
||||
```yaml
|
||||
# GitHub Actions
|
||||
- name: Benchmark Linter
|
||||
run: |
|
||||
time ui5lint
|
||||
# Fail if takes more than 60s
|
||||
timeout 60s ui5lint || exit 1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Future Performance Improvements
|
||||
|
||||
### Potential Optimizations (Not Yet Implemented)
|
||||
|
||||
1. **Incremental Linting**: Cache results for unchanged files
|
||||
2. **Parallel Rule Execution**: Run multiple rules concurrently
|
||||
3. **Worker Threads**: Distribute file parsing across CPU cores
|
||||
4. **Lazy Loading**: Load rules only when needed
|
||||
5. **AST Caching**: Cache parsed Abstract Syntax Trees
|
||||
|
||||
**Status**: Under consideration by UI5 Linter team
|
||||
|
||||
---
|
||||
|
||||
## Further Reading
|
||||
|
||||
- **Performance Documentation**: [https://github.com/UI5/linter/blob/main/docs/Performance.md](https://github.com/UI5/linter/blob/main/docs/Performance.md)
|
||||
- **Hyperfine Tool**: [https://github.com/sharkdp/hyperfine](https://github.com/sharkdp/hyperfine)
|
||||
- **UI5 Tooling Performance**: [https://sap.github.io/ui5-tooling/](https://sap.github.io/ui5-tooling/)
|
||||
- **Main Repository**: [https://github.com/UI5/linter](https://github.com/UI5/linter)
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Verified**: 2025-11-21
|
||||
**Next Review**: 2026-02-21
|
||||
461
references/rules-complete.md
Normal file
461
references/rules-complete.md
Normal file
@@ -0,0 +1,461 @@
|
||||
# UI5 Linter - Complete Rules Reference
|
||||
|
||||
**Source**: [https://github.com/UI5/linter/blob/main/docs/Rules.md](https://github.com/UI5/linter/blob/main/docs/Rules.md)
|
||||
**Last Updated**: 2025-11-21
|
||||
**UI5 Linter Version**: 1.20.5
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
The UI5 Linter provides 19 rules organized into several categories to help identify compatibility issues, deprecated APIs, security concerns, and modernization opportunities when preparing for UI5 2.x migration.
|
||||
|
||||
---
|
||||
|
||||
## Rules by Category
|
||||
|
||||
### Async & Modern Patterns
|
||||
|
||||
#### 1. async-component-flags
|
||||
|
||||
**Purpose**: Validates that components are properly configured for asynchronous loading.
|
||||
|
||||
**What It Checks**:
|
||||
- Presence of `sap.ui.core.IAsyncContentCreation` interface in Component metadata
|
||||
- `async` flags in `manifest.json`
|
||||
|
||||
**Why It Matters**: Asynchronous component loading is required for modern UI5 applications and improves performance.
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
#### 14. prefer-test-starter
|
||||
|
||||
**Purpose**: Validates that test-related files implement the Test Starter concept.
|
||||
|
||||
**What It Checks**: Test file structure and initialization patterns
|
||||
|
||||
**Why It Matters**: Test Starter is the modern approach for UI5 testing
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
### Security
|
||||
|
||||
#### 2. csp-unsafe-inline-script
|
||||
|
||||
**Purpose**: Ensures inline scripts in HTML files comply with Content Security Policy best practices.
|
||||
|
||||
**What It Checks**: Detects unsafe inline script usage patterns that violate CSP
|
||||
|
||||
**Why It Matters**: CSP violations can lead to security vulnerabilities and deployment issues
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
### Event Handlers
|
||||
|
||||
#### 3. no-ambiguous-event-handler
|
||||
|
||||
**Purpose**: Verifies event handlers in XML views/fragments use correct notation.
|
||||
|
||||
**What It Checks**:
|
||||
- Handlers use dot notation (representing controller methods), OR
|
||||
- Handlers reference local imports via `core:require`
|
||||
|
||||
**Why It Matters**: Ambiguous event handler notation can lead to runtime errors
|
||||
|
||||
**Autofix**: Available (migrate to recommended event handler notation)
|
||||
|
||||
**Autofix Details** (Added in v1.19.0):
|
||||
- Migrates event handlers to recommended notation format
|
||||
- Ensures proper controller method references
|
||||
|
||||
---
|
||||
|
||||
### Deprecation Detection
|
||||
|
||||
#### 4. no-deprecated-api
|
||||
|
||||
**Purpose**: Detects usage of deprecated APIs, features, or parameters throughout the codebase.
|
||||
|
||||
**What It Checks**: All API calls against SAPUI5 deprecation database
|
||||
|
||||
**Supported File Types**: JavaScript, TypeScript, XML, JSON, YAML
|
||||
|
||||
**Why It Matters**: Deprecated APIs may be removed in UI5 2.x
|
||||
|
||||
**Autofix**: Available (extensive, but with limitations)
|
||||
|
||||
**Autofix Categories**:
|
||||
1. **Configuration Facade**: Core.getConfiguration() method replacements
|
||||
2. **Core Facade**: Core API method replacements
|
||||
3. **Button Events**: tap → press event handler migration
|
||||
4. **SmartTable**: Export property updates
|
||||
5. **ODataModel**: Property removals
|
||||
6. **SimpleForm**: Property elimination
|
||||
7. **Bootstrap**: Script attribute corrections
|
||||
8. **jQuery.sap**: Limited autofix (many APIs excluded)
|
||||
|
||||
**Autofix Limitations**:
|
||||
- Code outside module definitions
|
||||
- Sync-to-async conversions
|
||||
- Complex replacements requiring multiple calls
|
||||
- Context-dependent replacements
|
||||
- Return value changes
|
||||
|
||||
See `autofix-complete.md` for comprehensive autofix details.
|
||||
|
||||
---
|
||||
|
||||
#### 6. no-deprecated-component
|
||||
|
||||
**Purpose**: Identifies dependencies on deprecated components declared in `manifest.json`.
|
||||
|
||||
**What It Checks**: Component dependencies in manifest file
|
||||
|
||||
**Why It Matters**: Deprecated components may not be compatible with UI5 2.x
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
#### 7. no-deprecated-control-renderer-declaration
|
||||
|
||||
**Purpose**: Validates correct declaration patterns for control renderers.
|
||||
|
||||
**What It Checks**: Control renderer declaration syntax
|
||||
|
||||
**Why It Matters**: Legacy renderer patterns are deprecated in modern UI5
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
#### 8. no-deprecated-library
|
||||
|
||||
**Purpose**: Checks for deprecated library dependencies.
|
||||
|
||||
**What It Checks**:
|
||||
- `manifest.json` library dependencies
|
||||
- `ui5.yaml` configuration files
|
||||
|
||||
**Why It Matters**: Deprecated libraries may not be available in UI5 2.x
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
#### 9. no-deprecated-theme
|
||||
|
||||
**Purpose**: Detects usage of deprecated themes.
|
||||
|
||||
**What It Checks**:
|
||||
- Theme references in code
|
||||
- Theme declarations in HTML files
|
||||
|
||||
**Why It Matters**: Deprecated themes are not supported in modern UI5
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
### Global Usage Detection
|
||||
|
||||
#### 10. no-globals
|
||||
|
||||
**Purpose**: Identifies problematic global variable usage within the codebase.
|
||||
|
||||
**What It Checks**: Direct access to UI5 globals instead of module imports
|
||||
|
||||
**Examples**:
|
||||
```javascript
|
||||
// ❌ Bad: Global access
|
||||
sap.ui.getCore().byId("myControl");
|
||||
|
||||
// ✅ Good: Module import
|
||||
import Core from "sap/ui/core/Core";
|
||||
Core.byId("myControl");
|
||||
```
|
||||
|
||||
**Why It Matters**: Global variable access prevents proper module bundling and is deprecated
|
||||
|
||||
**Autofix**: Available - Replaces global references with module imports
|
||||
|
||||
**Autofix Limitations**:
|
||||
- Cannot fix assignments to global variables
|
||||
- Cannot handle `delete` expressions on globals
|
||||
- Third-party module access via globals (like `jQuery`) not handled
|
||||
|
||||
---
|
||||
|
||||
#### 11. no-implicit-globals
|
||||
|
||||
**Purpose**: Checks for implicit global access patterns.
|
||||
|
||||
**What It Checks**:
|
||||
1. Modules accessed via global library namespaces
|
||||
2. Implicit `odata` globals in bindings
|
||||
|
||||
**Examples**:
|
||||
```javascript
|
||||
// ❌ Bad: Implicit global namespace
|
||||
sap.ui.require(["sap/m/Button"], function(Button) {
|
||||
// But then accessing via global:
|
||||
var btn = new sap.m.Button();
|
||||
});
|
||||
|
||||
// ❌ Bad: Implicit odata global in binding
|
||||
{path: 'odata>/Something'}
|
||||
|
||||
// ✅ Good: Use module reference
|
||||
{path: 'odataModel>/Something'}
|
||||
```
|
||||
|
||||
**Why It Matters**: Implicit globals create hidden dependencies
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
### Module System
|
||||
|
||||
#### 12. no-pseudo-modules
|
||||
|
||||
**Purpose**: Detects dependencies to pseudo modules within the code.
|
||||
|
||||
**What It Checks**: References to UI5 pseudo modules
|
||||
|
||||
**Why It Matters**: Pseudo modules are being phased out
|
||||
|
||||
**Autofix**: Not available (no implementation support)
|
||||
|
||||
---
|
||||
|
||||
### Error Reporting
|
||||
|
||||
#### 13. parsing-error
|
||||
|
||||
**Purpose**: Reports syntax/parsing errors encountered during the linting process.
|
||||
|
||||
**What It Checks**: File syntax validity
|
||||
|
||||
**Why It Matters**: Parse errors prevent linting analysis
|
||||
|
||||
**Autofix**: Not available (requires manual code fixes)
|
||||
|
||||
---
|
||||
|
||||
#### 14. autofix-error
|
||||
|
||||
**Purpose**: Indicates when an expected autofix cannot be applied.
|
||||
|
||||
**What It Checks**: Internal autofix operation success
|
||||
|
||||
**Why It Matters**: Suggests internal linter issues or edge cases
|
||||
|
||||
**Autofix**: N/A (this is an error report about autofix failures)
|
||||
|
||||
---
|
||||
|
||||
### API Usage Validation
|
||||
|
||||
#### 16. ui5-class-declaration
|
||||
|
||||
**Purpose**: Verifies correct UI5 class declaration patterns, particularly for TypeScript.
|
||||
|
||||
**What It Checks**:
|
||||
- Native ECMAScript class usage
|
||||
- Proper TypeScript class patterns
|
||||
|
||||
**Why It Matters**: Modern UI5 supports native classes but requires specific patterns
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
#### 17. unsupported-api-usage
|
||||
|
||||
**Purpose**: Ensures proper UI5 API usage patterns.
|
||||
|
||||
**What It Checks**:
|
||||
- Formatter type requirements in JavaScript/TypeScript bindings
|
||||
- Other API misuse patterns
|
||||
|
||||
**Examples**:
|
||||
```javascript
|
||||
// ❌ Bad: Missing formatter type
|
||||
{path: 'date', formatter: someFunction}
|
||||
|
||||
// ✅ Good: Proper formatter type
|
||||
{path: 'date', formatter: '.formatDate'}
|
||||
```
|
||||
|
||||
**Why It Matters**: Improper API usage leads to runtime errors
|
||||
|
||||
**Autofix**: Not available
|
||||
|
||||
---
|
||||
|
||||
### Manifest Modernization
|
||||
|
||||
#### 18. no-outdated-manifest-version
|
||||
|
||||
**Purpose**: Requires Manifest Version 2 for legacy-free UI5.
|
||||
|
||||
**What It Checks**: `_version` property in `manifest.json`
|
||||
|
||||
**Current Requirement**: Must be version 2 or higher
|
||||
|
||||
**Why It Matters**: Manifest Version 2 is required for UI5 2.x
|
||||
|
||||
**Autofix**: Not available (requires manual migration planning)
|
||||
|
||||
**Related Rules**:
|
||||
- no-removed-manifest-property
|
||||
- no-legacy-ui5-version-in-manifest
|
||||
|
||||
---
|
||||
|
||||
#### 19. no-removed-manifest-property
|
||||
|
||||
**Purpose**: Identifies properties from earlier manifest versions that are incompatible with Manifest Version 2 schema.
|
||||
|
||||
**What It Checks**: Manifest properties against Version 2 schema
|
||||
|
||||
**Common Issues**:
|
||||
- `synchronizationMode` (removed)
|
||||
- Empty `sap.ui5/resources/js` entries
|
||||
- Deprecated routing properties
|
||||
|
||||
**Why It Matters**: Incompatible properties cause deployment failures
|
||||
|
||||
**Autofix**: Available for specific properties
|
||||
|
||||
**Autofix Capabilities** (Added in v1.19.0):
|
||||
- Removal of `synchronizationMode` from manifest.json
|
||||
- Cleanup of empty `sap.ui5/resources/js` entries
|
||||
|
||||
---
|
||||
|
||||
#### 20. no-legacy-ui5-version-in-manifest
|
||||
|
||||
**Purpose**: Validates that `sap.ui5/dependencies/minUI5Version` specifies modern UI5 versions.
|
||||
|
||||
**What It Checks**: Minimum UI5 version in manifest.json
|
||||
|
||||
**Current Requirement**: Version 1.136 or higher
|
||||
|
||||
**Why It Matters**: Manifest Version 2 requires modern UI5 versions (1.136+)
|
||||
|
||||
**Example**:
|
||||
```json
|
||||
{
|
||||
"sap.ui5": {
|
||||
"dependencies": {
|
||||
"minUI5Version": "1.136.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Autofix**: Not available (requires manual version updates and testing)
|
||||
|
||||
---
|
||||
|
||||
## Rule Summary Table
|
||||
|
||||
| Rule | Category | Autofix | Priority |
|
||||
|------|----------|---------|----------|
|
||||
| async-component-flags | Modern Patterns | ❌ | High |
|
||||
| csp-unsafe-inline-script | Security | ❌ | High |
|
||||
| no-ambiguous-event-handler | Event Handlers | ✅ | Medium |
|
||||
| no-deprecated-api | Deprecation | ✅ (Limited) | High |
|
||||
| no-deprecated-component | Deprecation | ❌ | High |
|
||||
| no-deprecated-control-renderer-declaration | Deprecation | ❌ | Medium |
|
||||
| no-deprecated-library | Deprecation | ❌ | High |
|
||||
| no-deprecated-theme | Deprecation | ❌ | Medium |
|
||||
| no-globals | Global Usage | ✅ | High |
|
||||
| no-implicit-globals | Global Usage | ❌ | Medium |
|
||||
| no-pseudo-modules | Module System | ❌ | Low |
|
||||
| parsing-error | Error Reporting | ❌ | Critical |
|
||||
| autofix-error | Error Reporting | N/A | Critical |
|
||||
| prefer-test-starter | Modern Patterns | ❌ | Low |
|
||||
| ui5-class-declaration | API Usage | ❌ | Medium |
|
||||
| unsupported-api-usage | API Usage | ❌ | High |
|
||||
| no-outdated-manifest-version | Manifest | ❌ | High |
|
||||
| no-removed-manifest-property | Manifest | ✅ (Limited) | High |
|
||||
| no-legacy-ui5-version-in-manifest | Manifest | ❌ | High |
|
||||
|
||||
---
|
||||
|
||||
## Using Rules
|
||||
|
||||
### Disabling Specific Rules
|
||||
|
||||
**In JavaScript/TypeScript**:
|
||||
```javascript
|
||||
/* ui5lint-disable no-deprecated-api */
|
||||
// Your code here
|
||||
/* ui5lint-enable no-deprecated-api */
|
||||
|
||||
// Or for a single line:
|
||||
const result = deprecatedMethod(); // ui5lint-disable-line no-deprecated-api
|
||||
|
||||
// Or for the next line:
|
||||
// ui5lint-disable-next-line no-deprecated-api
|
||||
const result = deprecatedMethod();
|
||||
```
|
||||
|
||||
**In XML/HTML**:
|
||||
```xml
|
||||
<!-- ui5lint-disable no-deprecated-api -->
|
||||
<Button press="onPress"/>
|
||||
<!-- ui5lint-enable no-deprecated-api -->
|
||||
|
||||
<!-- Or for next element: -->
|
||||
<!-- ui5lint-disable-next-line no-deprecated-api -->
|
||||
<Button press="onPress"/>
|
||||
```
|
||||
|
||||
**In YAML**:
|
||||
```yaml
|
||||
# ui5lint-disable no-deprecated-library
|
||||
dependencies:
|
||||
- sap.ui.commons
|
||||
# ui5lint-enable no-deprecated-library
|
||||
```
|
||||
|
||||
### Multiple Rules
|
||||
|
||||
```javascript
|
||||
// ui5lint-disable no-deprecated-api, no-globals
|
||||
const core = sap.ui.getCore();
|
||||
core.byId("deprecated");
|
||||
// ui5lint-enable no-deprecated-api, no-globals
|
||||
```
|
||||
|
||||
### With Explanations
|
||||
|
||||
```javascript
|
||||
// ui5lint-disable-next-line no-deprecated-api -- Required for legacy compatibility
|
||||
legacyAPI.call();
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Further Reading
|
||||
|
||||
- **Main Repository**: [https://github.com/UI5/linter](https://github.com/UI5/linter)
|
||||
- **Rules Documentation**: [https://github.com/UI5/linter/blob/main/docs/Rules.md](https://github.com/UI5/linter/blob/main/docs/Rules.md)
|
||||
- **Autofix Scope**: [https://github.com/UI5/linter/blob/main/docs/Scope-of-Autofix.md](https://github.com/UI5/linter/blob/main/docs/Scope-of-Autofix.md)
|
||||
- **UI5 2.x Migration Guide**: [https://ui5.sap.com/](https://ui5.sap.com/)
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Verified**: 2025-11-21
|
||||
**Next Review**: 2026-02-21
|
||||
563
references/support-and-community.md
Normal file
563
references/support-and-community.md
Normal file
@@ -0,0 +1,563 @@
|
||||
# UI5 Linter - Support and Community Resources
|
||||
|
||||
**Source**: [https://github.com/UI5/linter/blob/main/SUPPORT.md](https://github.com/UI5/linter/blob/main/SUPPORT.md)
|
||||
**Last Updated**: 2025-11-21
|
||||
**UI5 Linter Version**: 1.20.5
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
This guide helps you get support for UI5 Linter issues, connect with the community, and choose the right channel for different types of questions or problems.
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Important: Do NOT Use GitHub Issues for Questions
|
||||
|
||||
**GitHub Issues are for**:
|
||||
- ✅ Bug reports (confirmed issues)
|
||||
- ✅ Feature requests
|
||||
- ✅ Documentation problems
|
||||
|
||||
**GitHub Issues are NOT for**:
|
||||
- ❌ Setup help
|
||||
- ❌ General questions ("How do I...")
|
||||
- ❌ Configuration assistance
|
||||
- ❌ Troubleshooting guidance
|
||||
- ❌ Best practices discussions
|
||||
|
||||
**Why**: GitHub Issues are for tracking development work, not community support. Questions in issues slow down the development process.
|
||||
|
||||
---
|
||||
|
||||
## Official Support Channels
|
||||
|
||||
### 1. StackOverflow ⭐ Recommended for Questions
|
||||
|
||||
**URL**: [http://stackoverflow.com/questions/tagged/ui5-tooling](http://stackoverflow.com/questions/tagged/ui5-tooling)
|
||||
|
||||
**Tag**: `ui5-tooling`
|
||||
|
||||
**Best For**:
|
||||
- General questions about UI5 Linter
|
||||
- Configuration help
|
||||
- Troubleshooting linting issues
|
||||
- Best practices
|
||||
- "How do I..." questions
|
||||
|
||||
**How to Ask**:
|
||||
```markdown
|
||||
**Title**: Clear, specific question
|
||||
Example: "How do I configure UI5 Linter to ignore test files?"
|
||||
|
||||
**Tags**: ui5-tooling, sapui5 (or openui5)
|
||||
|
||||
**Question Body**:
|
||||
1. What you're trying to achieve
|
||||
2. What you've tried
|
||||
3. What's not working
|
||||
4. Relevant code/configuration
|
||||
5. Environment (UI5 Linter version, Node version, OS)
|
||||
```
|
||||
|
||||
**Example Question**:
|
||||
```markdown
|
||||
# How do I fix no-globals rule errors in my UI5 project?
|
||||
|
||||
I'm getting `no-globals` rule violations when using `sap.ui.getCore()`.
|
||||
|
||||
## What I've Tried
|
||||
- Running `ui5lint --fix` but it doesn't fix all occurrences
|
||||
- Checked documentation for autofix limitations
|
||||
|
||||
## Configuration
|
||||
```javascript
|
||||
// ui5lint.config.mjs
|
||||
export default {
|
||||
ignores: ["webapp/thirdparty/**"]
|
||||
};
|
||||
```
|
||||
|
||||
## Environment
|
||||
- UI5 Linter: 1.20.5
|
||||
- Node.js: 20.11.0
|
||||
- OS: Windows 11
|
||||
|
||||
## Question
|
||||
What are the limitations of autofix for `no-globals`? How do I manually fix unsupported cases?
|
||||
```
|
||||
|
||||
**Why StackOverflow**:
|
||||
- ✅ Answers benefit entire community (searchable)
|
||||
- ✅ Expert community members can help
|
||||
- ✅ Voting system highlights best answers
|
||||
- ✅ Permanent knowledge base
|
||||
|
||||
---
|
||||
|
||||
### 2. OpenUI5 Community Slack
|
||||
|
||||
**Invite**: [https://ui5-slack-invite.cfapps.eu10.hana.ondemand.com](https://ui5-slack-invite.cfapps.eu10.hana.ondemand.com)
|
||||
|
||||
**Channel**: `#tooling`
|
||||
|
||||
**Best For**:
|
||||
- Quick questions
|
||||
- Real-time troubleshooting
|
||||
- Community discussions
|
||||
- Networking with other UI5 developers
|
||||
- Sharing experiences
|
||||
|
||||
**How to Join**:
|
||||
1. Visit [https://ui5-slack-invite.cfapps.eu10.hana.ondemand.com](https://ui5-slack-invite.cfapps.eu10.hana.ondemand.com)
|
||||
2. Enter your email
|
||||
3. Accept invitation
|
||||
4. Join `#tooling` channel
|
||||
|
||||
**Channel Etiquette**:
|
||||
- ✅ Search channel history first
|
||||
- ✅ Provide context (version, OS, error message)
|
||||
- ✅ Share code snippets (use code blocks)
|
||||
- ✅ Thank people who help
|
||||
- ❌ Don't cross-post to multiple channels
|
||||
- ❌ Don't DM unless asked
|
||||
- ❌ Don't post long code dumps (use gist.github.com)
|
||||
|
||||
**Example Slack Question**:
|
||||
```
|
||||
Hi! Getting an unexpected warning from UI5 Linter:
|
||||
|
||||
File: webapp/controller/Main.controller.js
|
||||
Warning: no-ambiguous-event-handler
|
||||
|
||||
Config:
|
||||
```javascript
|
||||
export default {
|
||||
ignores: []
|
||||
};
|
||||
```
|
||||
|
||||
UI5 Linter: 1.20.5
|
||||
Node: 20.11.0
|
||||
|
||||
Any ideas? 🤔
|
||||
```
|
||||
|
||||
**Why Slack**:
|
||||
- ✅ Fast responses (often within minutes)
|
||||
- ✅ Friendly community
|
||||
- ✅ Good for clarifying questions
|
||||
- ✅ Less formal than StackOverflow
|
||||
|
||||
---
|
||||
|
||||
## When to Use Each Channel
|
||||
|
||||
### Use StackOverflow When:
|
||||
- ✅ You have a well-defined question
|
||||
- ✅ Answer would benefit others (searchable)
|
||||
- ✅ You need detailed, documented response
|
||||
- ✅ You can wait a few hours for answer
|
||||
- ✅ You want permanent reference
|
||||
|
||||
**Examples**:
|
||||
- "How does the autofix feature work?"
|
||||
- "What's the best way to configure linter for monorepo?"
|
||||
- "How do I integrate UI5 Linter with ESLint?"
|
||||
|
||||
---
|
||||
|
||||
### Use Slack When:
|
||||
- ✅ You need quick clarification
|
||||
- ✅ You're troubleshooting in real-time
|
||||
- ✅ You want to discuss approach before implementing
|
||||
- ✅ You have a time-sensitive question
|
||||
- ✅ You want community feedback
|
||||
|
||||
**Examples**:
|
||||
- "Quick question: Does --fix work on manifest.json?"
|
||||
- "Anyone seen this error before? [screenshot]"
|
||||
- "What's the recommended ignore pattern for Fiori Elements apps?"
|
||||
|
||||
---
|
||||
|
||||
### Use GitHub Issues When:
|
||||
- ✅ You found a confirmed bug
|
||||
- ✅ You have feature request with detailed use case
|
||||
- ✅ Documentation is incorrect or missing
|
||||
- ✅ You can provide reproduction steps
|
||||
|
||||
**Examples**:
|
||||
- "Rule no-globals doesn't detect sap.ui.getCore() in arrow functions"
|
||||
- "Feature Request: Add autofix for deprecated Button.tap event"
|
||||
- "Documentation: Autofix limitations page missing Core API examples"
|
||||
|
||||
**Process**:
|
||||
1. Confirm it's actually a bug (not configuration issue)
|
||||
2. Search existing issues
|
||||
3. Use issue template
|
||||
4. Provide reproduction steps
|
||||
5. Include environment details
|
||||
|
||||
See [Contributing Guide](contributing.md) for full details.
|
||||
|
||||
---
|
||||
|
||||
## Getting Help Checklist
|
||||
|
||||
Before asking for help, ensure you have:
|
||||
|
||||
**✅ Basic Information Ready**:
|
||||
- [ ] UI5 Linter version: `ui5lint --version`
|
||||
- [ ] Node.js version: `node --version`
|
||||
- [ ] Operating system and version
|
||||
- [ ] UI5 version in your project
|
||||
|
||||
**✅ Configuration**:
|
||||
- [ ] ui5lint.config.js/mjs/cjs file (if used)
|
||||
- [ ] Relevant package.json scripts
|
||||
- [ ] ui5.yaml configuration
|
||||
|
||||
**✅ Error Details**:
|
||||
- [ ] Exact error message (copy/paste, don't retype)
|
||||
- [ ] Full command you ran
|
||||
- [ ] Verbose output: `ui5lint --verbose`
|
||||
|
||||
**✅ Code Context**:
|
||||
- [ ] Minimal code example demonstrating issue
|
||||
- [ ] File structure (if relevant)
|
||||
- [ ] Related configuration
|
||||
|
||||
**✅ What You've Tried**:
|
||||
- [ ] List steps already attempted
|
||||
- [ ] Note what didn't work
|
||||
- [ ] Include search terms used (to avoid duplicate suggestions)
|
||||
|
||||
---
|
||||
|
||||
## Common Questions and Where to Ask
|
||||
|
||||
### Configuration Questions
|
||||
|
||||
**Question**: "How do I ignore specific files?"
|
||||
|
||||
**Best Channel**: StackOverflow or Slack
|
||||
|
||||
**Quick Answer**: See [Configuration Guide](configuration.md)
|
||||
|
||||
```javascript
|
||||
// ui5lint.config.mjs
|
||||
export default {
|
||||
ignores: ["webapp/thirdparty/**", "webapp/test/**"]
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Rule Questions
|
||||
|
||||
**Question**: "What does rule no-deprecated-api detect?"
|
||||
|
||||
**Best Channel**: StackOverflow (permanent reference)
|
||||
|
||||
**Quick Answer**: See [Rules Reference](rules-complete.md)
|
||||
|
||||
---
|
||||
|
||||
### Autofix Questions
|
||||
|
||||
**Question**: "Why didn't --fix work for deprecated API?"
|
||||
|
||||
**Best Channel**: StackOverflow or Slack
|
||||
|
||||
**Quick Answer**: See [Autofix Limitations](autofix-complete.md)
|
||||
|
||||
Many APIs can't be automatically fixed. Check the autofix reference for specific API limitations.
|
||||
|
||||
---
|
||||
|
||||
### Performance Questions
|
||||
|
||||
**Question**: "Linter is slow on my large codebase, how to optimize?"
|
||||
|
||||
**Best Channel**: StackOverflow (detailed answer)
|
||||
|
||||
**Quick Answer**: See [Performance Guide](performance.md)
|
||||
|
||||
Use ignore patterns, lint specific directories, and check benchmarks.
|
||||
|
||||
---
|
||||
|
||||
### Integration Questions
|
||||
|
||||
**Question**: "How do I integrate with GitHub Actions?"
|
||||
|
||||
**Best Channel**: StackOverflow
|
||||
|
||||
**Quick Answer**: See SKILL.md Integration section and `templates/github-actions-lint.yml`
|
||||
|
||||
---
|
||||
|
||||
## Community Resources
|
||||
|
||||
### Official Documentation
|
||||
|
||||
**Main Repository**: [https://github.com/UI5/linter](https://github.com/UI5/linter)
|
||||
|
||||
**Documentation**:
|
||||
- README: [https://github.com/UI5/linter/blob/main/README.md](https://github.com/UI5/linter/blob/main/README.md)
|
||||
- Rules: [https://github.com/UI5/linter/blob/main/docs/Rules.md](https://github.com/UI5/linter/blob/main/docs/Rules.md)
|
||||
- Autofix: [https://github.com/UI5/linter/blob/main/docs/Scope-of-Autofix.md](https://github.com/UI5/linter/blob/main/docs/Scope-of-Autofix.md)
|
||||
- Performance: [https://github.com/UI5/linter/blob/main/docs/Performance.md](https://github.com/UI5/linter/blob/main/docs/Performance.md)
|
||||
|
||||
---
|
||||
|
||||
### UI5 Community Resources
|
||||
|
||||
**SAP Community**: [https://community.sap.com/](https://community.sap.com/)
|
||||
|
||||
**Topics**: SAPUI5, OpenUI5, UI5 Tooling
|
||||
|
||||
**Best For**: General SAP/UI5 questions, not specifically UI5 Linter
|
||||
|
||||
---
|
||||
|
||||
**OpenUI5 Website**: [https://openui5.org/](https://openui5.org/)
|
||||
|
||||
**Best For**: UI5 framework documentation and resources
|
||||
|
||||
---
|
||||
|
||||
**SAPUI5 Documentation**: [https://sapui5.hana.ondemand.com/](https://sapui5.hana.ondemand.com/)
|
||||
|
||||
**Best For**: Official SAPUI5 framework documentation
|
||||
|
||||
---
|
||||
|
||||
### Learning Resources
|
||||
|
||||
**UI5 Tooling**: [https://sap.github.io/ui5-tooling/](https://sap.github.io/ui5-tooling/)
|
||||
|
||||
**Related Tools**: UI5 CLI, UI5 Builder, UI5 Server, UI5 Linter
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting Before Asking
|
||||
|
||||
### Step 1: Check Documentation
|
||||
|
||||
**Skill References**:
|
||||
- [SKILL.md](../SKILL.md) - Main skill documentation
|
||||
- [Rules Reference](rules-complete.md) - All 19 rules explained
|
||||
- [Autofix Reference](autofix-complete.md) - What can/can't be fixed
|
||||
- [CLI Options](cli-options.md) - All command-line flags
|
||||
- [Configuration](configuration.md) - Config file setup
|
||||
- [Performance](performance.md) - Optimization tips
|
||||
|
||||
**Official Docs**:
|
||||
- [UI5 Linter README](https://github.com/UI5/linter/blob/main/README.md)
|
||||
- [Rules Documentation](https://github.com/UI5/linter/blob/main/docs/Rules.md)
|
||||
|
||||
---
|
||||
|
||||
### Step 2: Search Existing Issues
|
||||
|
||||
```
|
||||
[https://github.com/UI5/linter/issues?q=is%3Aissue+YOUR+SEARCH+TERMS](https://github.com/UI5/linter/issues?q=is%3Aissue+YOUR+SEARCH+TERMS)
|
||||
```
|
||||
|
||||
**Common Searches**:
|
||||
- "no-globals autofix"
|
||||
- "manifest version error"
|
||||
- "performance slow"
|
||||
- "configuration not found"
|
||||
|
||||
---
|
||||
|
||||
### Step 3: Enable Verbose Logging
|
||||
|
||||
```bash
|
||||
ui5lint --verbose --details
|
||||
```
|
||||
|
||||
**Output includes**:
|
||||
- Configuration loading details
|
||||
- File processing information
|
||||
- Rule execution details
|
||||
- Detailed error messages
|
||||
|
||||
---
|
||||
|
||||
### Step 4: Try Dry-Run for Autofix
|
||||
|
||||
```bash
|
||||
UI5LINT_FIX_DRY_RUN=true ui5lint --fix
|
||||
```
|
||||
|
||||
**See what would change** without modifying files.
|
||||
|
||||
---
|
||||
|
||||
### Step 5: Isolate the Issue
|
||||
|
||||
**Create minimal reproduction**:
|
||||
```bash
|
||||
# Create test directory
|
||||
mkdir ui5lint-test
|
||||
cd ui5lint-test
|
||||
|
||||
# Create minimal file
|
||||
cat > test.js << 'EOF'
|
||||
sap.ui.define([], function() {
|
||||
return sap.ui.getCore();
|
||||
});
|
||||
EOF
|
||||
|
||||
# Test
|
||||
ui5lint test.js
|
||||
```
|
||||
|
||||
**If issue reproduces**: Great for asking help with minimal example
|
||||
|
||||
**If issue doesn't reproduce**: Problem is in your configuration or other code
|
||||
|
||||
---
|
||||
|
||||
## Response Time Expectations
|
||||
|
||||
### StackOverflow
|
||||
- **Typical Response**: Few hours to 1-2 days
|
||||
- **Depends On**: Question quality, complexity, community availability
|
||||
- **Increase Chances**: Clear title, good tags, detailed question, code examples
|
||||
|
||||
### Slack
|
||||
- **Typical Response**: Minutes to few hours
|
||||
- **Depends On**: Time of day, channel activity
|
||||
- **Increase Chances**: Be respectful of others' time, provide context
|
||||
|
||||
### GitHub Issues (Bugs)
|
||||
- **Typical Response**: Few days to 1-2 weeks for initial triage
|
||||
- **Depends On**: Issue severity, reproduction quality, maintainer availability
|
||||
- **Increase Chances**: Complete bug template, provide reproduction, search duplicates
|
||||
|
||||
---
|
||||
|
||||
## Security Issues
|
||||
|
||||
**🔒 SPECIAL PROCESS FOR SECURITY VULNERABILITIES**
|
||||
|
||||
**DO NOT**:
|
||||
- ❌ Create public GitHub issue
|
||||
- ❌ Post in Slack
|
||||
- ❌ Post on StackOverflow
|
||||
- ❌ Discuss publicly anywhere
|
||||
|
||||
**DO**:
|
||||
- ✅ Follow [Security Policy](https://github.com/UI5/linter/security/policy)
|
||||
- ✅ Use GitHub's private security advisory feature
|
||||
- ✅ Allow maintainers time to fix before public disclosure
|
||||
|
||||
**Why**: Public disclosure before fix puts all users at risk.
|
||||
|
||||
---
|
||||
|
||||
## Reporting Success Stories
|
||||
|
||||
**Where**: OpenUI5 Slack `#tooling` channel
|
||||
|
||||
**Share**:
|
||||
- ✅ How UI5 Linter helped you
|
||||
- ✅ Issues prevented
|
||||
- ✅ Time saved
|
||||
- ✅ Migration successes
|
||||
|
||||
**Benefits**:
|
||||
- Helps others learn
|
||||
- Motivates maintainers
|
||||
- Builds community
|
||||
|
||||
**Example**:
|
||||
```
|
||||
Used UI5 Linter to prepare our app for UI5 2.x!
|
||||
|
||||
Found 127 issues:
|
||||
- 45 deprecated APIs
|
||||
- 23 global variable usages
|
||||
- 12 manifest problems
|
||||
|
||||
Autofix handled 60%, manually fixed the rest in 2 days.
|
||||
|
||||
Migration to UI5 2.x: ✅ Success!
|
||||
|
||||
Thanks to the UI5 Linter team! 🎉
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Contributing Back
|
||||
|
||||
After getting help, consider:
|
||||
|
||||
**✅ Answer Questions**: Help others on StackOverflow or Slack
|
||||
|
||||
**✅ Improve Documentation**: Submit PR for docs that were unclear
|
||||
|
||||
**✅ Report Bugs**: If you found an issue, report it properly
|
||||
|
||||
**✅ Share Knowledge**: Blog posts, talks, tutorials
|
||||
|
||||
**✅ Contribute Code**: See [Contributing Guide](contributing.md)
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
**Quick Decision Tree**:
|
||||
|
||||
```
|
||||
Need help with UI5 Linter?
|
||||
│
|
||||
├─ General question / How to?
|
||||
│ └─ StackOverflow (ui5-tooling tag)
|
||||
│
|
||||
├─ Quick question / Real-time troubleshooting?
|
||||
│ └─ OpenUI5 Slack (#tooling channel)
|
||||
│
|
||||
├─ Found a bug / Feature request?
|
||||
│ └─ GitHub Issues (after confirming)
|
||||
│
|
||||
├─ Security vulnerability?
|
||||
│ └─ Private security advisory (GitHub)
|
||||
│
|
||||
└─ General UI5 question (not linter-specific)?
|
||||
└─ SAP Community / UI5 documentation
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Resources Checklist**:
|
||||
|
||||
**Before Asking**:
|
||||
- [ ] Check skill references
|
||||
- [ ] Search StackOverflow
|
||||
- [ ] Search GitHub issues
|
||||
- [ ] Try verbose mode
|
||||
- [ ] Create minimal reproduction
|
||||
|
||||
**When Asking**:
|
||||
- [ ] Choose right channel
|
||||
- [ ] Provide version info
|
||||
- [ ] Include configuration
|
||||
- [ ] Share code example
|
||||
- [ ] Describe what you tried
|
||||
|
||||
**After Receiving Help**:
|
||||
- [ ] Mark answer as accepted (StackOverflow)
|
||||
- [ ] Thank helpers
|
||||
- [ ] Consider contributing back
|
||||
|
||||
---
|
||||
|
||||
**Document Version**: 1.0
|
||||
**Last Verified**: 2025-11-21
|
||||
**Next Review**: 2026-02-21
|
||||
Reference in New Issue
Block a user