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 🙏

© 2024 – Pkg Stats / Ryan Hefner

@buildup_ag/eslint-plugin

v0.1.0

Published

Custom Angular eslint rules for Buildup AG.

Downloads

10

Readme

Description

These rules are custom eslint rules for the Buildup AG.

Installation

A) Add "@buildup_ag/eslint-plugin": "^0.0.9" to the dependencies inside the package.json of the angular app. Use a suitable version number. B) In the .eslintrc.json of the angular app, add

{
    "files": ["*.ts"],
    "plugins": ["@buildup_ag"],
    "rules": {
        "@buildup_ag/no-operator-in-switch-cases": "error",
        "@buildup_ag/readonly-injectables": "error",
        "@buildup_ag/take-until-before-subscription": "error"
    }
},

to the overrides property.

Rules

no-operator-in-switch-cases

Enforces the application to not have operators like "OR" or "AND" in cases of a switch statement. Operators in switch statements are prohibited, for multi-criteria-cases fall-throughs should be used instead.

Examples of incorrect code for this rule:

switch (expr) {
  case 'Oranges' || 'Apples':
                 ~~ Operational operator in switch case
    break;
  default:
    return foo;
}

switch (expr) {
  case 'Oranges' && 'Apples':
                 ~~ Operational operator in switch case
    break;
  default:
    return foo;
}

Examples of correct code for this rule:

switch (expr) {
  case 'Oranges':
    break;
  case 'Apples':
    break;
  default:
    return foo;
}

switch (expr) {
  case 'Oranges':
  case 'Apples':
    break;
  default:
    return foo;
}

readonly-injectables

An injected dependency is usually created as a singleton and overwriting it breaks the whole concept of dependency injection pattern. This rule enforces the application to prepend an injected dependence with a readonly statement.

This rule is inspired by https://github.com/shpaq23/custom-eslint-rules.

Examples of incorrect code for this rule:

constructor(private restService: RestService)
                  ~~ not preceded by readonly

Examples of correct code for this rule:

constructor(private readonly restService: RestService)

take-until-before-subscription

Enforces the application to properly unsubscribe from subscriptions. This rule makes sure that:

  • All subscriptions are preceded by a pipe statement
  • The last argument of the pipe preceding a subscription is a takeUntil statement
  • The takeUntil statement has a single argument
  • The single argument of the takeUntil statement is a property of the class
  • The single argument of the takeUntil statement is initialized as a subject
  • The component containing the subscription implements an ngOnDestroy method
  • The subject used as argument for the takeUntil statement is called with next and complete in the ngOnDestroy method of the component

Examples of incorrect code for this rule:

this.rest.method(this.id).subscribe();
                        ~~ no preceded by pipe

this.rest.method(this.id).pipe(undefined).subscribe();
                               ~~~~~~~~~~ no takeUntil argument

this.rest.method(this.id).pipe(takeUntil(this.ngUnsubscribe), undefined).subscribe();
                                                              ~~~~~~~~~~ takeUntil is not last argument of pipe

this.rest.method(this.id).pipe(takeUntil(this.ngUnsubscribe, undefined)).subscribe();
                                                             ~~~~~~~~~ takeUntil does not take a single argument

@Component({
    selector: 'app-component',
    styleUrls: ['./app-component.component.scss'],
    templateUrl: './app-component.component.html',
})
export class AppComponentComponent implements OnDestroy, OnInit {
    ngUnsubscribe = new NotASubject();
                    ~~~~~~~~~~~~~~~~~~ takeUntil argument not initialized as subject

    foo() {
      this.rest.method(this.id).pipe(takeUntil(this.ngUnsubscribe)).subscribe();
    }

    ngOnDestroy() {
      this.ngUnsubscribe.next();
      this.ngUnsubscribe.complete();
    }
}

@Component({
    selector: 'app-component',
    styleUrls: ['./app-component.component.scss'],
    templateUrl: './app-component.component.html',
})
export class AppComponentComponent implements OnDestroy, OnInit {
    ngUnsubscribe = new Subject();

    foo() {
      this.rest.method(this.id).pipe(takeUntil(this.ngUnsubscribe)).subscribe();
    }

    ~~~~~~~~~~~~~~~~~~ no ngOnDestroy method
}

@Component({
    selector: 'app-component',
    styleUrls: ['./app-component.component.scss'],
    templateUrl: './app-component.component.html',
})
export class AppComponentComponent implements OnDestroy, OnInit {
    ngUnsubscribe = new Subject();

    foo() {
      this.rest.method(this.id).pipe(takeUntil(this.ngUnsubscribe)).subscribe();
    }

    ngOnDestroy() {
      this.ngUnsubscribe.NeitherNextNorComplete();
                        ~~~~~~~~~~~~~~~~~~~~~~~~~ takeUntil argument not called with .next() and .complete()
    }
}

Examples of correct code for this rule:

@Component({
    selector: 'app-component',
    styleUrls: ['./app-component.component.scss'],
    templateUrl: './app-component.component.html',
})
export class AppComponentComponent implements OnDestroy, OnInit {
    ngUnsubscribe = new Subject();

    foo() {
      this.rest.method(this.id).pipe(takeUntil(this.ngUnsubscribe)).subscribe();
    }

    ngOnDestroy() {
      this.ngUnsubscribe.next();
      this.ngUnsubscribe.complete();
    }
}

Publish

  • Install all dependencies with npm install
  • Increase version number in package.json
  • Build plugin with npm run-script build
  • Upload to NPM with npm publish --access public