npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@abap2ui5/linter

v0.8.5

Published

Validate abap2UI5 app classes without an SAP system: the ABAP and the view it builds, checked together.

Readme

abap2UI5 linter

Validate abap2UI5 app classes without an SAP system — a CLI, library and GitHub Action extracted from the CI gates of samples-controls, where they guard its generated ports of the official UI5 demo kit samples (how many is in that repository's STATUS.md — it grows weekly, and a number written down here is a number that goes stale).

It checks a whole app class, not just the XML it emits: the ABAP source and the view it builds are validated together. The defects that matter most are the ones living between the two — a bound attribute whose ABAP field does not exist, an event argument the control never delivers — and no UI5 tooling can see them, because the view only exists at runtime.

npx @abap2ui5/linter src

That is the whole of it: no install, no SAP system, no configuration. ~340 kB and no dependencies, so the line above is a fast one.

src/zcl_my_app.clas.abap
  36:14  error  sap.m.Page has no aggregation contentt - typo?                       unknown-aggregation
  40:22  error  sap.m.Button type="Emphasised" is not a valid value (allowed: ...)   invalid-property-value

Then, when you want it to stay green:

npm install -D @abap2ui5/linter                     # pin it for CI and for your machine
npx --no-install abap2ui5lint --init                # write a commented abap2ui5lint.jsonc
npx --no-install abap2ui5lint src --all-classes     # every class: the ones that build no view get the source-side rules
npx --no-install abap2ui5lint src --watch           # run, then re-run on every save - the loop for Eclipse ADT + abapGit
npx --no-install abap2ui5lint --explain unknown-control   # what a reported id means, with the before/after pair - in the terminal

--no-install is deliberate: abap2ui5lint is the command the package installs, not a package name, and a bare npx abap2ui5lint run where the package is NOT installed would download whatever is published under that name on npm. Without an install, use the scoped npx @abap2ui5/linter ….

Documentation

→ The linter, in full — the two gates and what each one catches, --screenshot, --fix, waivers, the baseline for adopting it on a codebase that already exists, the config file, the GitHub Action, the badges and the library API.

→ Rule reference — every rule id with the paragraph explaining what it means and why it exists. The id printed at the end of a finding is the anchor.

Two more entry points, for the two other ways in:

| | | |---|---| | Adding the render gate | npm i -D @abap2ui5/linter-render + npx playwright install chromium — the headless XMLView.create that catches a view which fails to load | | Starting a project | app-template ships the CLI, the config and the workflow already wired up |

Where it runs

The CLI, a GitHub Action (abap2UI5/linter@v0), and a library — plus two consumers of that library: mcp-server exposes these gates as MCP tools for AI coding agents, and the VS Code extension surfaces the findings as editor diagnostics while you type. All of them read the same abap2ui5lint.jsonc, so the editor, the agent and CI agree.

Used by

9 public repositories declare @abap2ui5/linter in a manifest — GitHub's own list, refreshed here monthly:

Only a manifest entry is counted here — that is what GitHub's dependency graph can see. A repository that runs the linter through npx --yes or the Action is a user, but never appears in this list.

Working on this repository

npm ci
npx playwright install chromium   # the render runtime is an npm workspace here
node cli.mjs src                  # the CLI, from the checkout
npm test

AGENTS.md carries the conventions and what every gate checks; CONTRIBUTING.md and RELEASING.md the rest of the workflow.

Four artefacts are generated and gated by npm test, so a stale one fails the build:

npm run generate-metadata    # data/properties.json, from the @openui5 sources
npm run generate-schema      # data/abap2ui5lint.schema.json — editor completion
npm run generate-rules-page  # site/index.html — the published rule reference
npm run generate-compat      # data/compat.json — which abap2UI5 releases this linter line understands (the ./compat export)

Two further generators need network, so the suite cannot regenerate them and the committed file is the contract instead; a scheduled workflow refreshes each one and opens a PR with the diff:

npm run generate-icons       # data/icons.json — the SAP icon-font snapshot
npm run generate-dependents  # the "Used by" list above, from GitHub's dependents page

site/ holds that generated rule reference (published to https://abap2ui5.github.io/linter/), not documentation about this repository.

experimental/github-app/ is a spike — a working prototype of the linter as a hosted GitHub App, kept as documentation that happens to execute. It is not deployed, not registered, not shipped on npm and not supported. The delivered channels are the CLI, the library and the Action.

Credits

The reconstruction, mock-model derivation, render harness and property gate were built and battle-tested in samples-controls against the official UI5 demo kit corpus — where scripts/view-gates.mjs now consumes this package as the extraction of those original gates. This package is the corpus-independent extraction.