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

angular-decorated

v0.0.7

Published

A collection of angular 2 style decorators for angularjs 1.5.x projects written in typescript

Downloads

169

Readme

angular-decorated

A collection of angular 2 style decorators for angularjs 1.5.x projects written in typescript

Prerequisites

angular-decorated tries to mimic angular 2 style decorators as closely as possible.

Some of the decorator interfaces (@Component and @Directive) were heavily inspired by this excellent Angular 1.x styleguide (ES2015).

Behind the scenes it uses Metadata Reflection API to add metadata to the classes.

Installation

npm i --save-dev angular-decorated

Dependencies: angular and reflect-metadata

I assume you're using this package for angular project written in typescript and using some kind of bundler like Webpack or SystemJS, so no need to worry about the dependencies then, they'll be resolved automatically by your module loader, otherwise you need to provide reflect-metadata shim by yourself.

Available decorators

| Decorator | Angular analog | Details | |:------------- |:------------------------------------------|:----------| | @NgModule | angular.module | | | @Injectable | angular.service / angular.provider | registers as provider if decorated class implements $get method | | @Component | angular.component | | | @Input | angular.component options binding ('<') | can be used only inside @Component decorator default input binding value can be overridden by passing parameter to the decorator | | @Output | angular.component options binding ('&') | can be used only inside @Component decorator | | @Directive | angular.directive | | | @Pipe | angular.filter | |

Usage with examples

Let's say we have a todo-form component from classical todo example with the following template

/* ----- todo/todo-form/todo-form.html ----- */
<form name="todoForm" ng-submit="$ctrl.onSubmit();">
  <input type="text" ng-model="$ctrl.todo.title">
  <button type="submit">Submit</button>
</form>

If we were writing in plain es6/typescript without decorators we'd define this component like this:

/* ----- todo/todo-form/todo-form.component.js ----- */
const templateUrl = require('./todo-form.html');

export const TodoFormComponent = {
  bindings: {
    todo: '<',
    onAddTodo: '&'
  },
  templateUrl,
  controller: class TodoFormComponent {
    todo;
    onAddTodo;
    
    $onChanges(changes) {
      if (changes.todo) {
        this.todo = Object.assign({}, this.todo);
      }
    }
    onSubmit() {
      if (!this.todo.title) return;
      this.onAddTodo({
        $event: {
          todo: this.todo
        }
      });
    }
  }
};

And then we'll register our component with angular like so:

import angular from 'angular';
import { TodoFormComponent } from './todo-form.component';

export const TodoFormModule = angular
  .module('todo.form', [])
  .component('todoForm', TodoFormComponent)
  .name;

Using angular-decorated decorators in typescript the component code will look like this

/* ----- todo/todo-form/todo-form.component.ts ----- */
import { Component, Input, Output } from 'angular-decorated';

const templateUrl = require('./todo-form.html');

@Component({
  selector: 'todoForm',
  templateUrl
})
export class TodoFormComponent {
    @Input() todo;
    @Output() onAddTodo;
    
    $onChanges(changes) {
      if (changes.todo) {
        this.todo = {...this.todo};
      }
    }
    onSubmit() {
      if (!this.todo.title) return;
      this.onAddTodo({
        $event: {
          todo: this.todo
        }
      });
    }
}

Notice how @Input and @Output decorators replace bindings of the component, by default @Input correlates to '<' value of the binding and @Output - to the '&' value, you can override bindings values only in @Input decorator by passing '=' or '@' if you need to.

And we'll register it with angular like so:

/* ----- todo/todo-form/todo-form.module.ts ----- */
import { NgModule } from 'angular-decorated';
import { TodoFormComponent } from './todo-form.component';

@NgModule({
  declarations: [TodoFormComponent]
})
export class TodoFormModule {}

You should declare all of the components (@Component), directives (@Directive) and filters (@Pipe) you want to register with some module in declarations of @NgModule decorator, all of the services (@Injectable) and providers (also @Injectable with $get method) you should declare as providers of @NgModule decorator, and all of the modules your module depends on in imports. Name of the class decorated with @NgModule is the name of the module you should provide in imports of other module declaration that depends on this module. In addition you can define config and run blocks for your module by adding config and run methods to your module class declaration.

Here's an example of provider using @Injectable decorator

/* ----- greeting/greeting.service.ts ----- */
import { Injectable } from 'angular-decorated';

export interface IGreetingService {
  getGreeting(): string;
}

@Injectable()
export class GreetingService implements ng.IServiceProvider {
  private greeting = 'Hello World!';

  // Configuration function
  public setGreeting(greeting: string) {
    this.greeting = greeting;
  }

  // Provider's factory function
  public $get(): IGreetingService {
    return {
      getGreeting: () => { return this.greeting; }
    };
  }
}

This is how angular filter looks like using angular 2 style @Pipe decorator:

/* ----- greeting/uppercase.filter.ts ----- */
import { Pipe, PipeTransform } from 'angular-decorated';

@Pipe({name: 'uppercase'})
export class UppercasePipe implements PipeTransform {
  public transform(item: string) {
    return item.toUpperCase();
  }
}

And here's an example of provider registration with @NgModule decorator, its configuration in config method of module class and it's usage in run method:

import { NgModule } from 'angular-decorated';
import { TodoFormModule } from 'todo/todo-form/todo-form.module';
import { GreetingService, IGreetingService } from 'greeting/greeting.service';
import { UppercasePipe } from 'greeting/uppercase.filter';

@NgModule({
  imports: [
    TodoFormModule
  ],
  declarations: [UppercasePipe],
  providers: [GreetingService]
})
export class AppModule {
  public config(GreetingServiceProvider: GreetingService) {
    GreetingServiceProvider.setGreeting('Hello decorated provider');
  }

  public run(GreetingService: IGreetingService) {
    console.log(GreetingService.getGreeting());
  }
}

Please notice, that you can't define constructor and $inject anything into it, instead specify all of the injections you want to provide to your module config and run blocks as arguments of config and run methods of the module class and they'll be injected by their names.