Analyzes SAC custom widget code for performance issues, security concerns, and best practice violations
Analyzes SAP Analytics Cloud custom widget code for performance, security, and best practice violations.
/plugin marketplace add secondsky/sap-skills/plugin install sap-sac-custom-widget@sap-skillsfile_pathAnalyze SAP Analytics Cloud custom widget code for performance optimization opportunities, security concerns, and best practice compliance.
/widget-lint [file_path]
/widget-lint widget.js
/widget-lint src/
/widget-lint --fix-suggestions
Critical Performance Issues:
Performance Warnings:
Performance Suggestions:
Critical Security Issues:
Security Warnings:
Security Suggestions:
Critical Best Practice Issues:
Best Practice Warnings:
Best Practice Suggestions:
Integration Issues:
Integration Warnings:
## SAC Widget Lint Report
**Files Analyzed**: [list]
**Overall Score**: [X/100]
### Performance Issues (X found)
#### Critical
1. [Issue description]
**Location**: [file:line]
**Impact**: [Performance impact description]
**Fix**: [Code suggestion]
#### Warnings
1. [Issue description]
**Recommendation**: [How to improve]
### Security Issues (X found)
#### Critical
1. [Issue description]
**Risk**: [Security risk description]
**Fix**: [Required fix]
#### Warnings
1. [Issue description]
**Recommendation**: [Security improvement]
### Best Practices (X found)
#### Violations
1. [Issue description]
**Standard**: [Best practice reference]
**Fix**: [Implementation suggestion]
### SAC Integration (X found)
1. [Issue description]
**Impact**: [How it affects SAC integration]
**Fix**: [Required change]
### Summary
| Category | Critical | Warnings | Suggestions |
|----------|----------|----------|-------------|
| Performance | X | X | X |
| Security | X | X | X |
| Best Practices | X | X | X |
| SAC Integration | X | X | X |
### Recommendations Priority
1. [Highest priority fix]
2. [Second priority fix]
3. [Third priority fix]
// BAD: Direct resize handling
onCustomWidgetResize() {
this._render(); // Called too frequently
}
// GOOD: Debounced resize
onCustomWidgetResize() {
clearTimeout(this._resizeTimeout);
this._resizeTimeout = setTimeout(() => this._render(), 100);
}
// BAD: Query DOM on every render
_render() {
this._shadowRoot.getElementById("chart").innerHTML = "";
}
// GOOD: Cache reference
constructor() {
this._chartEl = this._shadowRoot.getElementById("chart");
}
_render() {
this._chartEl.innerHTML = "";
}
// BAD: No cleanup
onCustomWidgetDestroy() { }
// GOOD: Proper disposal
onCustomWidgetDestroy() {
if (this._chart) {
this._chart.dispose();
this._chart = null;
}
}
// BAD: XSS vulnerability
element.innerHTML = userProvidedValue;
// GOOD: Safe text content
element.textContent = userProvidedValue;
// BAD: HTTP URL
"url": "http://example.com/widget.js"
// GOOD: HTTPS URL
"url": "https://example.com/widget.js"
/* BAD: Hardcoded values */
color: #333333;
font-family: Arial;
/* GOOD: SAP theme variables */
color: var(--sapTextColor, #333);
font-family: var(--sapFontFamily, Arial);
// BAD: Direct access
const data = this.myDataBinding.data;
// GOOD: Null check
const binding = this.dataBindings?.getDataBinding("myDataBinding");
if (!binding || !binding.data) return;
const data = binding.data;
When this command is invoked:
--fix-suggestions, include complete code fixes