CLICLItypeA command you run, rather than a dependency you import.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

ui5plugin-linter

A command-line linter for UI5 projects, run as ui5linter, that checks JavaScript and TypeScript classes, XML views and fragments, and i18n properties files.

Rules about a UI5 project's own source: an XML attribute that is duplicated, a control class that does not exist or is deprecated, an unused class or member, a translation that is unused or duplicated, an ID or event handler that breaks the project's naming pattern (idNamingPattern, eventNamingPattern). It is installed globally or as a development dependency and run as ui5linter or npx ui5linter; --format formats views and fragments and --rmcache clears the parser's library cache. Severity per linter, exceptions for members, classes, tags and i18n IDs, and component include and exclude lists are read from package.json or an rc file such as .ui5pluginrc, and an @ui5ignore comment silences the findings on the method, tag or translation it precedes. The class metadata comes from ui5plugin-parser, whose settings go in the same file, and the same linter is what ui5plugin shows as diagnostics in VS Code.

Facts

Latestv1.17.1ReleasedLast pushLicenceApache-2.0

Where it sits

Lives in
Provides
LintingUI5LintingcapabilityCatching in the editor what would otherwise be caught at deploy time, or not at all — problems in source code and models and in the project's configuration, found by rules rather than by review.
Requires
ui5plugin-parserui5plugin-parserartifactThe class metadata every check compares against: the parser preloads the library metadata, caches it and supplies the configuration the linter shares.

Who is behind it

Ilja PostnovsIlja PostnovsPersonMaintains this
In the atlas: maintains 3, contributes to 3
@iljapostnovs
maintainerMartín RodriguezPersonContributes to this
In the atlas: contributes to 1
@sovanta-MartinRodriguez
1 contributor

Before choosing this

Conditions

PracticalFunctional boundary

Two of its JavaScript and TypeScript checks, EventTypeLinter and WrongNamespaceLinter, apply to TypeScript projects only.

What it declares

Every artifact

Type
CLI
Origin
Independently maintained

As a CLI

Distributed through
npm

Connections3

Install

npm add ui5plugin-linter

Derived from the package name. No recipe recorded; the README has the configuration.

Where ui5plugin-linter runsBy its type: a CLI is run from a terminalcallsdocumentedrequiresYour terminal, actorYour terminalui5plugin-linter, moduleui5plugin-linterui5plugin-parser, moduleui5plugin-parser
SAPnot SAP's, or the project's ownstated in the documentdocumented only

README

quoted from iljapostnovs/ui5plugin-linter under Apache-2.0, read
iljapostnovs/ui5plugin-linter/README.mdOn GitHub

UI5 Class Linter

Command Line Linter for UI5 based projects.

Any support is highly appreciated!

Summary


How to use

Execute in command line:

npm install ui5plugin-linter -g

After installing the package globally the linter will be available:

ui5linter

Linter also can be used from local node_modules:

npm install ui5plugin-linter --save-dev
npx ui5linter

TS vs JS

Initialization

If tsconfig.json is found in the CWD and any .ts files are found in the workspace, parser considers that it's TS project.
tsconfig.json should be located in CWD.

Folder exclusions

For convenience purposes UI5TSParser ignoressrc-gen folders, because they contain transpiled JS/XML files, which can make the parser to think that source files are there.

Important! If build folder name is different, it should be added to excludeFolderPatterns in your package.json.


Linters

JS/TS Linters

AbstractClassLinter

Linter, which checks if all members of parent class (which is abstract) are implemented.

Alt text

Alt text

InterfaceLinter

Checks if interface members of an interface are implemented.

Alt text

Alt text

PublicMemberLinter

Checks if currently public member should be private. If no references for the member are found outside the current class, error will be shown.

Alt text

UnusedMemberLinter

Checks if member is used anywhere.

Alt text

WrongClassNameLinter

Checks if class name is correct.

Alt text

Alt text

WrongFieldMethodLinter

Checks for several things:

  • If member is deprecated

Alt text

  • If member exists

Alt text

  • If access level modifiers are used correctly. E.g. if private/protected member from another class is called, it's an error.

Alt text

WrongFilePathLinter

Checks if all paths which starts with app id exists

Alt text

WrongImportLinter

Checks if imported module exists and is not deprecated

Alt text

WrongOverrideLinter

Checks if overriden member is not private and if parent member is not deprecated

Alt text

Alt text

WrongParametersLinter

Checks for several things:

  • If all parameters are passed to the method
  • If types of the parameters are correct

Alt text

Hint! To set the type for the variable, JSDocs can be used.

/**@type {sap.m.Table}*/
let oTable;

Hint! To make parameter optional, JSDocs can be used.

/**
 * @param {string} mandatoryParam mandatory parameter
 * @param {string} [optionalParam] optional parameter
 */
myMethod(mandatoryParam, optionalParam) {}
UnusedClassLinter

Checks if class is used

Alt text

WrongNamespaceLinter (TS only)

Checks if namespace is provided and if it is correct.

Alt text

Alt text

Alt text

Alt text

EventTypeLinter (TS only, 1.115.1+)

Checks if correct type for event variable is used in event handlers

Alt text

Alt text


XML Linters

TagAttributeLinter

Checks if attribute

Alt text

TagAttributeDefaultValueLinter

Checks if entered value is not the same as default value

Alt text

TagLinter

Checks if:

  • Prefix is defined

Alt text

  • Aggregation exists

Alt text

  • Library of aggregation is the same as library of the class

Alt text

  • Class is not deprecated

Alt text

  • Class exists

Alt text

UnusedNamespaceLinter

Checks if namespace is used

Alt text

WrongFilePathLinter

Checks if class exists

Alt text

Alt text

Properties linters

UnusedTranslationsLinter

Checks if translation is used

Alt text

DuplicateTranslationLinter

Checks if translation is not duplicated

Alt text


Config

Linter config

UI5 Linter searches for package.json (or any other rc file, e.g. .ui5pluginrc) in your CWD (Current Working Directory) and locates the config there.

Supported rc file types:

  • .ui5pluginrc
  • .ui5pluginrc.json
  • .ui5pluginrc.yaml
  • .ui5pluginrc.yml
  • .ui5pluginrc.js

See configuration example below.

Cache
ui5plugin-parser preloads the library metadata and stores it in cache. If libsToLoad were changed, it is necessary to clear cache. It is possible by adding --rmcache flag to ui5linter:

ui5linter --rmcache

Configuration example

{
	"ui5": {
		"ui5parser": {
			"ui5version": "1.84.30",
			"dataSource": "https://sapui5.hana.ondemand.com/",
			"rejectUnauthorized": true,
			"libsToLoad": ["sap.uxap", "sap.viz"],
			//Handy to add additional workspace paths if e.g. library is outside of CWD
			"additionalWorkspaces": ["../MyLibrary"]
		},
		"ui5linter": {
			"severity": {
				"WrongParametersLinter": "Error",
				"WrongOverrideLinter": "Warning",
				"WrongImportLinter": "Information",
				"WrongFilePathLinter": "Hint"
			},
			"usage": {
				"WrongParametersLinter": true,
				"WrongOverrideLinter": false
			},
			"jsLinterExceptions": [
				{
					"className": "com.test.MyCustomClass",
					/*method or field name*/
					"memberName": "myCustomMethod",
					/*all classes which extends com.test.MyCustomClass will
        inherit this exception as well*/
					"applyToChildren": true
				}
			],
			/*classes to exclude from linting*/
			"jsClassExceptions": ["com.test.MyCustomClass1", "com.test.MyCustomClass2"],
			/*views and fragments to exclude from linting*/
			"xmlClassExceptions": ["com.test.view.Master", "com.test.fragment.MyToolbar"],
			/*array of i18n translation ids to be ignored by UnusedTranslationsLinter*/
			"propertiesLinterExceptions": ["MyView.MyButtonText", "MY_TRANSLATION_ID"],
			"componentsToInclude": ["com.test"],
			/*it makes sense to use only componentsToInclude or componentsToExclude, but not both at once.
      "componentsToExclude" comes in handy when you want to exclude e.g. libraries.
      "componentsToInclude" comes handy when you have many different components which project depends
      on, but it is necessary to lint only one*/
			"componentsToExclude": ["com.custom.library"]
		}
	}
}

Default linter config

Default config is as follows:

{
	"ui5": {
		"ui5linter": {
			"severity": {
				"WrongParametersLinter": "Error",
				"WrongOverrideLinter": "Error",
				"WrongImportLinter": "Warning",
				"WrongFilePathLinter": "Warning",
				"WrongFieldMethodLinter": "Warning",
				"WrongClassNameLinter": "Warning",
				"UnusedTranslationsLinter": "Information",
				"UnusedNamespaceLinter": "Error",
				"UnusedMemberLinter": "Information",
				"TagLinter": "Error",
				"TagAttributeLinter": "Error",
				"TagAttributeDefaultValueLinter": "Information",
				"PublicMemberLinter": "Information",
				"InterfaceLinter": "Error",
				"AbstractClassLinter": "Error",
				"UnusedClassLinter": "Error",
				"WrongNamespaceLinter": "Warning",
				"DuplicateTranslationLinter": "Error",
				"EventTypeLinter": "Error"
			},
			"usage": {
				"WrongParametersLinter": true,
				"WrongOverrideLinter": true,
				"WrongImportLinter": true,
				"WrongFilePathLinter": true,
				"WrongFieldMethodLinter": true,
				"WrongClassNameLinter": true,
				"UnusedTranslationsLinter": true,
				"UnusedNamespaceLinter": true,
				"UnusedMemberLinter": true,
				"TagLinter": true,
				"TagAttributeLinter": true,
				"TagAttributeDefaultValueLinter": true,
				"PublicMemberLinter": true,
				"InterfaceLinter": true,
				"AbstractClassLinter": true,
				"UnusedClassLinter": true,
				"WrongNamespaceLinter": true,
				"DuplicateTranslationLinter": true,
				"EventTypeLinter": true //true if UI5 version is >=1.115.1
			},
			"jsLinterExceptions": [
				{
					"className": "sap.ui.core.Element",
					"memberName": "getDomRef",
					"applyToChildren": true
				},
				{
					"className": "sap.ui.model.json.JSONModel",
					"memberName": "iSizeLimit",
					"applyToChildren": true
				},
				{
					"className": "sap.ui.model.Binding",
					"memberName": "*"
				},
				{
					"className": "sap.ui.model.Model",
					"memberName": "*"
				},
				{
					"className": "sap.ui.core.Element",
					"memberName": "*"
				},
				{
					"className": "sap.ui.base.ManagedObject",
					"memberName": "*"
				},
				{
					"className": "sap.ui.core.Control",
					"memberName": "*"
				},
				{
					"className": "sap.ui.xmlfragment",
					"memberName": "*"
				},
				{
					"className": "*",
					"memberName": "byId"
				},
				{
					"className": "*",
					"memberName": "prototype"
				},
				{
					"className": "*",
					"memberName": "call"
				},
				{
					"className": "*",
					"memberName": "apply"
				},
				{
					"className": "*",
					"memberName": "bind"
				},
				{
					"className": "*",
					"memberName": "constructor"
				},
				{
					"className": "*",
					"memberName": "init"
				},
				{
					"className": "*",
					"memberName": "exit"
				},
				{
					"className": "map",
					"memberName": "*"
				}
			],
			"jsClassExceptions": [],
			"xmlClassExceptions": [],
			"propertiesLinterExceptions": [],
			"componentsToInclude": [],
			"componentsToExclude": [],
			"idNamingPattern": "^id{MeaningAssumption}.*{ControlName}$",
			"eventNamingPattern": "^on{MeaningAssumption}{ControlName}.*?{EventName}$",
			"attributesToCheck": ["content", "items", "value", "text", "number"]
		}
	}
}

It is possible to override properties in your package.json. See Configuration example

In case of jsLinterExceptions the exceptions which will be found in package.json of CWD will be added to the default exceptions, in the rest of the cases properties will be overwritten


Parser config

It is possible to add config for ui5plugin-parser as well.

Check ui5plugin-parser -> Config default values as a reference for parser properties
See Configuration example


Linter exceptions

There are multiple ways to configure linter exceptions.

JS/TS
Member errors

To ignore class member errors, there are two ways to do it. Lets assume that there is a line, which gives incorrect amount of arguments error

this._myMethod("123", 643, true); //Method "_myMethod" has 2 (2 mandatory) param(s), but you provided 3

In order to ignore this error, there are two ways to do it:

  1. Add @ui5ignore to method declaration JSDoc
/**
 * @ui5ignore
 */
_myMethod(sFirstParam, iSecondParam) {}
  1. Add method to jsLinterExceptions in package.json:
{
	"ui5": {
		"ui5linter": {
			"jsLinterExceptions": [
				{
					"className": "com.test.MyClass",
					"memberName": "_myMethod",
					"applyToChildren": true
				}
			]
		}
	}
}
View and fragment errors

To ignore attribute and tag errors, <-- @ui5ignore --> can be used. It will ignore all errors of next tag and its attributes.

<!-- @ui5ignore -->
<RandomText
	randomProperty="123"
/>

To ignore specific attribute, <-- @ui5ignore ${attributeName1}, ${attributeName2} --> can be used. It will ignore all attribute errors

<!-- @ui5ignore randomProperty, secondRandomProperty -->
<Text
	randomProperty="123"
	secondRandomProperty="123"
	text="Valid property"
/>

To ignore all id and event handler pattern errors of the next tag, <-- @ui5ignore-patterns --> can be used.

<!-- @ui5ignore-patterns -->
<Text
	id="myRandomId"
/>

To ignore specific id or event handler pattern errors of the next tag, <-- @ui5ignore-patterns ${attributeName1}, ${attributeName2} --> can be used.

<!-- @ui5ignore-patterns id -->
<Button
	id="myRandomId"
	press="myRandomHandler"
/>
i18n errors

To ignore translation errors, # @ui5ignore comment right above the translation can be used

# @ui5ignore
MY_TITLE = Title
Other ways
Exclude whole class

To exclude whole class from linting, add class name to package.json. In case of JS Classes, use jsClassExceptions. In case of view and fragments, use xmlClassExceptions

{
	"ui5": {
		"ui5linter": {
			"jsClassExceptions": ["com.test.MyClass"]
		}
	}
}
Exclude i18n translations

To exclude translation from linting in 18n.properties file, add class name to package.json

{
	"ui5": {
		"ui5linter": {
			"propertiesLinterExceptions": ["MY_TRANSLATION_ID"]
		}
	}
}
Exclude other apps or libs

Lets assume that there is a library included in the project, and there is no need to lint it. To exclude whole app or lib from linting, add app/lib id to package.json. There are two preference entries that can be used: componentsToInclude and componentsToExclude.

{
	"ui5": {
		"ui5linter": {
			"componentsToInclude": ["com.test.my.app"],
			"componentsToExclude": ["com.test.my.lib"]
		}
	}
}

ID and Event Handler patterns in views and fragments

In order to keep the same style for naming the id and any event handler in views and fragments, three configuration entries are available: idNamingPattern, eventNamingPattern, attributesToCheck. Every id and event handler generates individual RegExp, and the value is checked against it.

Hint! To disable naming style checking, just set idNamingPattern or/and eventNamingPattern as empty string in package.json

Variables

In order to generate individual RegExp, there are variables available which will be applied at runtime. All variables are available in camelCase and PascalCase.

Example of eventNamingPattern: ^on{MeaningAssumption}{ControlName}.*?{EventName}$. Variables: MeaningAssumption, ControlName, EventName.

<Input
	value="{ODataModel>Currency}"
	change=""
>
<!-- Pattern for 'change': ^onCurrencyInput.*?Change$ -->
ControlName variable

Variable is replaced with the name of the tag. Available for both id and event handler patterns.

<Text/>
<!-- ControlName => Text -->
<!-- controlName => text -->
<f:GridList/>
<!-- ControlName => GridList -->
<!-- controlName => gridList -->
EventName variable

Variable is replaced with the name of the event. Available for event handler patterns only.

<Button press="onButtonPress"/>
<!-- EventName => Press -->
<!-- eventName => press -->
<f:GridList borderReached="onGridListBorderReached"/>
<!-- EventName => BorderReached -->
<!-- eventName => borderReached -->
MeaningAssumption variable

Variable is replaced with guessed value taken from attribute. Available for both id and event handler patterns. This is the most tricky variable.

It is calculated as follows:

  1. Get value of attributesToCheck configuration
  2. Find first attribute from the control which exists in attributesToCheck array.
  3. Parse attribute value
    1. If attribute value is a binding, use binding text as a source for MeaningAssumption
      1. Find binding path. If binding path is an object, parse it and take the text from path field, otherwise crop { and }
      2. Split string by >, left part is model name, right part is binding path
        1. If model name is i18n, find the translation in i18n.properties, transform value to PascalCase and return the value
        2. Else, remove /results from binding path, split the result by _, transform to PascalCase and return the value
    2. If attribute value is not a binding, transform the value to PascalCase and return it
Attribute valueMeaningAssumption value
{/OrderItems}OrderItems
{OrderId}OrderId
{/OrderItems/results}OrderItems
{ODataModel>/ORDER_ITEMS}OrderItems
{MyModel>/Orders}Orders
{i18n>APP_TITLE}OrderApp (if text in i18n.properties is "Order App")

Hint! > MeaningAssumption is pure heuristics and of course will not work for all the cases. If it works most of the time well, but there are some exceptions, it is possible to ignore specific tag attribute errors. Check View and fragment errors section.

Example.

<List
	id="idOrderItemsList"
	items="{ODataModel>/OrderItems}"
	press="onOrderItemsListPress"
/>
<!--
	ControlName => List
	controlName => list
	EventName => Press
	eventName => press
	MeaningAssumption => OrderItems
	meaningAssumption => orderItems
 -->
attributesToCheck configuration

This configuration is a list of attributes, where MeaningAssumption will be guessed from. For instance, if attributesToCheck is set to "attributesToCheck": ["items"], the value will be guessed only from items attribute, e.g. in sap.m.List:

<List
	id="idOrdersList"
	items="{/Orders}"
/>

XML Formatter

It is possible to format fragments and views using CMD.

ui5linter --format
Path pattern

It is possible to set the path pattern of the files which should be formatted. Default value: ­**/*.{fragment,view}.xml

ui5linter --format --path=**/*.{fragment,view}.xml
Closing tag on newline

It is possible to pass a parameter if closing tags (">", "/>") should be located on newline

ui5linter --format --tagEndNewline
Add space before a self-closing tag

It is possible to pass a parameter if a space should be added before a self-closing tag ("/>")

ui5linter --format --tagSpaceBeforeSelfClose
Indentation

It is possible to pass a parameter which will determine indentation

ui5linter --format --indentation=space --spaces=4
ui5linter --format --indentation=tab

package.json interface

The technical interface of possible entries:

interface IUI5PackageConfigEntry {
	ui5?: IUI5LinterEntry;
}
interface IUI5LinterEntry {
	ui5linter?: IUI5LinterEntryFields;
}
interface IUI5LinterEntryFields {
	severity?: {
		[key in JSLinters | XMLLinters | PropertiesLinters]: Severity;
	};
	usage?: {
		[key in JSLinters | XMLLinters | PropertiesLinters]: boolean;
	};
	jsLinterExceptions?: JSLinterException[];
	jsClassExceptions?: string[];
	xmlClassExceptions?: string[];
	propertiesLinterExceptions?: string[];
	componentsToInclude?: string[];
	componentsToExclude?: string[];
	idNamingPattern?: string;
	eventNamingPattern?: string;
	attributesToCheck?: string[];
}

Enumerations:

enum PropertiesLinters {
	UnusedTranslationsLinter = "UnusedTranslationsLinter",
	DuplicateTranslationLinter = "DuplicateTranslationLinter"
}
enum XMLLinters {
	TagAttributeLinter = "TagAttributeLinter",
	TagAttributeDefaultValueLinter = "TagAttributeDefaultValueLinter",
	TagLinter = "TagLinter",
	UnusedNamespaceLinter = "UnusedNamespaceLinter",
	WrongFilePathLinter = "WrongFilePathLinter"
}
enum JSLinters {
	AbstractClassLinter = "AbstractClassLinter",
	InterfaceLinter = "InterfaceLinter",
	PublicMemberLinter = "PublicMemberLinter",
	UnusedMemberLinter = "UnusedMemberLinter",
	WrongClassNameLinter = "WrongClassNameLinter",
	WrongFieldMethodLinter = "WrongFieldMethodLinter",
	WrongFilePathLinter = "WrongFilePathLinter",
	WrongImportLinter = "WrongImportLinter",
	WrongOverrideLinter = "WrongOverrideLinter",
	WrongParametersLinter = "WrongParametersLinter",
	UnusedClassLinter = "UnusedClassLinter",
	WrongNamespaceLinter = "WrongNamespaceLinter",
	EventTypeLinter = "EventTypeLinter"
}
enum Severity {
	Warning = "Warning",
	Error = "Error",
	Information = "Information",
	Hint = "Hint"
}
Apache-2.0, read

History

Latest

v1.17.1

Other 1

Notes
  1. v1.17.0

    Other 1

    Notes
  2. v1.16.1

    Other 1

    Notes
  3. v1.16.0

    Other 2

    Notes
    • UI5 Parser updated to v1.8.0
    • minor fixes for XML attribute linter
  4. v1.15.2

    Other 1

    Notes
  5. v1.15.1

    Other 1

    Notes
    • XMLFormatter now escapes single quote character in attribute value, if it is an object
  6. v1.15.0

    Other 2

    Notes
    • WrongOverrideLinter now checks if member is deprecated
    • Fix: UnusedClassLinter doesn't show error if any member is used outside the class
  7. v1.14.5

    Other 1

    Notes
  8. v1.14.4

    Other 3

    Notes
    • Fix @ui5ignore for tag attribute names
    • Fix properties linters to work with all properties files
    • UI5 Parser updated to v1.7.6
  9. v1.14.3

    Other 1

    Notes
  10. v1.14.2

    Other 1

    Notes
  11. v1.14.1

    Other 2

    Notes
  12. v1.14.0

    Other 1

    Notes
    • Feature: Now it is possible to specify space quantity Readme
  13. v1.13.0

    Other 2

    Notes
    • UI5 Parser updated to v1.7.0
    • Feature: Variable declarations are now being searched above class declaration as well
  14. v1.12.0

    Other 2

    Notes
    • Feature: Implement indentation feature #138
    • Fix #136
  15. v1.11.1

    Other 1

    Notes
  16. v1.11.0

    Other 1

    Notes
    • Feature: Make XML Formatter preserve newlines
  17. v1.10.0

    Other 1

    Notes
    • Feature: --tagSpaceBeforeSelfClose option added to XML Formatter
  18. v1.9.1

    Other 2

    Notes
    • Fix: 'AMeaningAssumptionGenerator' bugfix
    • UI5 Parser updated to v1.6.3
  19. v1.9.0

    Other 2

    Notes
    • UI5 Parser updated to v1.6.2
    • Feature: XML Formatter moved to this repo. Readme
  20. v1.8.3

    Other 1

    Notes
  21. v1.8.2

    Other 1

    Notes
  22. v1.8.1

    Other 1

    Notes
    • Nothing new, technical refactoring
  23. v1.8.0

    Other 2

    Notes
    • Feature: TagAttributeDefaultValueLinter configuration entry added, closes #122. Readme
    • Feature: EventTypeLinter added. Readme
  24. v1.7.6

    Other 2

    Notes
    • UI5 Parser updated to v1.5.6
    • Fix: Add configPath to IParserConfigHandler
  25. v1.7.5

    Other 2

    Notes
    • UI5 Parser updated to v1.5.5
    • Fix: Fix config finding going into recursive
  26. v1.7.4

    Other 1

    Notes
  27. v1.7.3

    Other 2

    Notes
    • UI5 Parser updated to v1.5.3
    • Fix: Migrate to fixed version of rc-config-loader
  28. v1.7.2

    Other 2

    Notes
    • UI5 Parser updated to v1.5.2
    • Fix: Migrate to cosmiconfig
  29. v1.7.1

    Other 2

    Notes
    • UI5 Parser updated to v1.5.1
    • Fix: Bugfix for package.json config
  30. v1.7.0

    Other 2

    Notes
    • UI5 Parser updated to v1.5.0
    • Feature: Support for rc files introduced
  31. v1.6.4

    Other 1

    Notes
    • Fix: Bugfix for empty id pattern
  32. v1.6.3

    Other 2

    Notes
    • Fix: Change priority of linting id and event handler style, now they are first priority
    • Feature: Add @ui5ignore-patterns support for XML
  33. v1.6.2

    Other 1

    Notes
    • Fix: Rename BindingPath variable to MeaningAssumption
  34. v1.6.1

    Other 1

    Notes
    • Fix: Bugfix for AggregationName distinguishing
  35. v1.6.0

    Other 3

    Notes
    • UI5 Parser updated to v1.4.5
    • Feature: XML attribute linter enhanced with id and event handler naming style check
    • ui5ignore in XML files now supports attribute ignoring
  36. v1.5.2

    Other 1

    Notes
  37. v1.5.1

    Other 1

    Notes
    • Fix propertiesLinterExceptions handling
  38. v1.5.0

    Other 3

    Notes
    • UI5 Parser updated to v1.4.2
    • propertiesLinterExceptions added to ui5linter configuration
    • @ui5ignore is now supported in i18n.properties
  39. v1.4.2

    Other 1

    Notes
    • Bugfix for linter not taking into account jsClassesToExclude for TS projects
  40. v1.4.1

    Other 1

    Notes
  41. v1.4.0

    Other 1

    Notes
  42. v1.3.0

    Other 1

    Notes
  43. v1.2.3

    Other 1

    Notes
  44. v1.2.2

    Other 1

    Notes
  45. v1.2.1

    Other 1

    Notes
  46. v1.2.0

    Other 1

    Notes
  47. v1.1.1

    Other 1

    Notes
  48. v1.1.0

    Other 3

    Notes
    • UI5 Parser updated to v1.1.0
    • Duplicate Translation Linter added to properties linters
    • Global config handler added
  49. v1.0.0

    Other 2

    Notes
    • UI5 Parser updated to v1.0.0
    • additionalWorkspaces config entry moved to parser
  50. v0.8.12

    Other 1

    Notes
    • Update parser
  51. v0.8.11

    Other 1

    Notes
    • Update parser
  52. v0.8.10

    Other 1

    Notes
    • Update parser
  53. v0.8.9

    Other 1

    Notes
    • Update parser
  54. v0.8.8

    Other 1

    Notes
    • Update parser
  55. v0.8.7

    Other 1

    Notes
    • Update parser
  56. v0.8.6

    Other 1

    Notes
    • Update packages
  57. v0.8.5

    Other 1

    Notes
    • Update parser
  58. v0.8.4

    Other 1

    Notes
    • Update parser
  59. v0.8.3

    Other 1

    Notes
    • Refactoring and minor bugfixes
  60. v0.8.2

    Other 1

    Notes
    • Fix unused translations linter
  61. v0.8.1

    Other 1

    Notes
    • Update parser
  62. v0.8.0

    Other 1

    Notes
    • Update parser, adapt linters to work with CustomTSObject
  63. v0.7.7

    Other 1

    Notes
    • Update parser
  64. v0.7.6

    Other 1

    Notes
    • Update parser, add public member linter for TS
  65. v0.7.5

    Other 1

    Notes
    • Fix reference finder
  66. v0.7.4

    Other 1

    Notes
    • Fix WrongFilePathLinter
  67. v0.7.3

    Other 1

    Notes
    • Update UI5 parser
  68. v0.7.2

    Other 1

    Notes
    • Add TS support for wrong class name linter, add Wrong namespace linter
  69. v0.7.1

    Other 1

    Notes
    • Update ui5 parser
  70. v0.7.0

    Other 1

    Notes
    • Update ui5 parser, add typescript support
  71. v0.6.8

    Other 1

    Notes
    • Update ui5 parser
  72. v0.6.7

    Other 1

    Notes
    • Bugfixes
  73. v0.6.6

    Other 1

    Notes
    • Add cmd: linting
  74. v0.6.5

    Other 1

    Notes
    • Dependency update
  75. v0.6.4

    Other 1

    Notes
    • Minor bugfixes
  76. v0.6.3

    Other 1

    Notes
    • Bugfix for multiple types
  77. v0.6.2

    Other 1

    Notes
    • Make Component.js exception case insensitive
  78. v0.6.1

    Other 1

    Notes
    • Add Component.js as exception to unused class linter
  79. v0.6.0

    Other 1

    Notes
    • Add unused class linter
  80. v0.5.24

    Other 1

    Notes
    • Rollback chalk
  81. v0.5.23

    Other 1

    Notes
    • Update dependencies
  82. v0.5.22

    Other 1

    Notes
    • Update ui5parser
  83. v0.5.21

    Other 1

    Notes
    • Update ui5parser
  84. v0.5.20

    Other 1

    Notes
    • Update ui5 parser and add support for XML linting of inline require in xml
  85. v0.5.19

    Other 1

    Notes
    • Update ui5 parser
  86. v0.5.18

    Other 1

    Notes
    • Update ui5 parser
  87. v0.5.17

    Other 1

    Notes
    • Bugfixes for wrong file path linter
  88. v0.5.16

    Other 1

    Notes
    • Make deprecation linter honor exceptions
  89. v0.5.15

    Other 1

    Notes
    • Introduce additionalWorkspacePaths property for configuration
  90. v0.5.14

    Other 1

    Notes
    • Update parser
  91. v0.5.13

    Other 2

    Notes
    • Add UI5 version to console output
    • Add deprecation errors for class members
  92. v0.5.12

    Other 1

    Notes
    • Bugfix for reference linter
  93. v0.5.11

    Other 1

    Notes
    • Update parser
  94. v0.5.10

    Other 1

    Notes
    • Update parser
  95. v0.5.9

    Other 1

    Notes
    • Position bugfix for Interface linter and abstract class linter
  96. v0.5.8

    Other 1

    Notes
    • Add --rmcache command
  97. v0.5.7

    Other 1

    Notes
    • Add @ui5ignore support for tag linter
  98. v0.5.6

    Other 1

    Notes
    • Fix tag namespace linter for commented text in XML
  99. v0.5.5

    Other 1

    Notes
    • Cache bugfixes
  100. v0.5.4

    Other 1

    Notes
    • Remove dynamic require for package.json reading
  101. v0.5.3

    Other 1

    Notes
    • Update parser
  102. v0.5.2

    Other 1

    Notes
    • XML Linter position bugfixes
  103. v0.5.1

    Other 1

    Notes
    • Bugfixes
  104. v0.5.0

    Other 1

    Notes
    • Initial release
108downloads per week, npm
Weekly downloads for ui5plugin-linter26 complete calendar weeks from 2026-04-20 to 2026-10-18; the latest total is 108.20 Apr – 26 Apr: 48027 Apr – 3 May: 8074 May – 10 May: 93611 May – 17 May: 86318 May – 24 May: 1,42625 May – 31 May: 8901 Jun – 7 Jun: 8698 Jun – 14 Jun: 69615 Jun – 21 Jun: 1,09022 Jun – 28 Jun: 1,34929 Jun – 5 Jul: 2,4416 Jul – 12 Jul: 64013 Jul – 19 Jul: 1,00920 Jul – 26 Jul: 62727 Jul – 2 Aug: 4653 Aug – 9 Aug: 71710 Aug – 16 Aug: 58217 Aug – 23 Aug: 53524 Aug – 30 Aug: 75831 Aug – 6 Sept: 2447 Sept – 13 Sept: 37114 Sept – 20 Sept: 64121 Sept – 27 Sept: 72728 Sept – 4 Oct: 1,1765 Oct – 11 Oct: 31612 Oct – 18 Oct: 108
Linting
  1. @cbs-consulting/cds-eslintESLint plugin with one consultancy's rules for CDS filesfrom CAP
  2. @cbs-consulting/toolsShared ESLint configuration for SAPUI5 and CAP projectsfrom CAP
  3. ui5pluginSAPUI5 extension for Visual Studio Codefrom UI5
  4. eslint-plugin-better-cap-configESLint rules flagging deprecated CAP configurationfrom CAP
  5. hana-linterRegex naming rules for SAP HANA artifacts in a CAP projectfrom CAP
  6. @sap/eslint-plugin-cdsSAP's ESLint plugin for CDSfrom CAP
  7. @sap-ux/eslint-plugin-fiori-toolsESLint rules for projects the Fiori tools generators producefrom CAP
  8. vscode-ui5-language-assistantVS Code extension for SAPUI5 and OpenUI5 XML views and manifestfrom UI5
  9. @satiroglu/kaevRule-based checker for SAPUI5 and OpenUI5 projectsfrom UI5
  10. @ui5/linterStatic analysis tool for UI5 projectsfrom UI5

Details

Sources4
Added by handdiscovered herechecked
npm registry, ui5plugin-linterversion, releases, installschecked
github.com/git+https://github.com/iljapostnovs/ui5plugin-linter.gittree, pushes, contributors, CIchecked
README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
latestv1.17.1
first release
releases and cadence133, ~34d median
discovered viaAdded by hand
first seen in the atlas
ecosystem and domainui5, developer-experience
Contributors1

From the repository’s contributor list, .

History in the atlas2
  1. Listed on bestofui5.org and not yet in the atlas. Read from the repository README (https://github.com/iljapostnovs/ui5plugin-linter): "Command Line Linter for UI5 based projects."; the install, `--rmcache` and `--format` commands; the JS/TS, XML and properties checks; and "It is possible to add config for ui5plugin-parser as well." The npm record for 1.17.1 gives the bin `ui5linter`, Apache-2.0 and the ui5plugin-parser 1.10.1 dependency. It is a different tool from SAP's UI5 linter (github.com/UI5/linter), which the graph does not hold as an artifact.
  2. First seen.
For your agent
Ref
artifact:iljapostnovs-ui5plugin-linter
JSON
/artifacts/iljapostnovs-ui5plugin-linter.json
MCP
Connecting an agent