ASD

Angular Migration

Migra de AngularJS a Angular usando modo híbrido, reescritura incremental de componentes y actualización de la inyección de dependencias.

Estrellas
38.8k

en todo el repo

Actividad
47

0–100, la ruta de este skill

Actualizado
hace 2 meses

último commit aquí

Commits
1

últimos 90 días

Contexto
1.8k tok

57 tok en reposo

Paquete
2 archivos

9 KB

Instalar

Funciona con cualquier agente que lea SKILL.md

npx -y skills add wshobson/agents --skill angular-migration --agent claude-code

Se instala solo en este repositorio.

Qué hace

  • Aporta estrategias y patrones de código para migrar aplicaciones AngularJS a Angular
  • Ofrece ejemplos de modo híbrido con ngUpgrade y bootstrap combinado
  • Muestra cómo convertir controladores, directivas y servicios de AngularJS a componentes y servicios Angular
  • Explica actualización/downgrade de inyección de dependencias entre AngularJS y Angular
  • Documenta la migración de rutas de $routeProvider a Angular Router

Úsalo cuando

  • Migrar aplicaciones AngularJS (1.x) a Angular (2+)
  • Ejecutar aplicaciones híbridas AngularJS/Angular
  • Convertir directivas en componentes
  • Modernizar la inyección de dependencias o migrar el sistema de rutas

No lo uses cuando

    Qué lo activa

    Di cualquiera de estas frases y el agente debería cargar este skill.

    • Ayúdame a migrar mi app AngularJS a Angular en modo híbrido
    • Convierte este directive de AngularJS en un componente Angular
    • Cómo hago downgrade de un servicio Angular para usarlo en AngularJS
    • Necesito migrar mis rutas de $routeProvider a Angular Router

    SKILL.md

    En inglés

    Angular Migration

    Master AngularJS to Angular migration, including hybrid apps, component conversion, dependency injection changes, and routing migration.

    When to Use This Skill

    • Migrating AngularJS (1.x) applications to Angular (2+)
    • Running hybrid AngularJS/Angular applications
    • Converting directives to components
    • Modernizing dependency injection
    • Migrating routing systems
    • Updating to latest Angular versions
    • Implementing Angular best practices

    Migration Strategies

    1. Big Bang (Complete Rewrite)

    • Rewrite entire app in Angular
    • Parallel development
    • Switch over at once
    • Best for: Small apps, green field projects

    2. Incremental (Hybrid Approach)

    • Run AngularJS and Angular side-by-side
    • Migrate feature by feature
    • ngUpgrade for interop
    • Best for: Large apps, continuous delivery

    3. Vertical Slice

    • Migrate one feature completely
    • New features in Angular, maintain old in AngularJS
    • Gradually replace
    • Best for: Medium apps, distinct features

    Hybrid App Setup

    // main.ts - Bootstrap hybrid app
    import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";
    import { UpgradeModule } from "@angular/upgrade/static";
    import { AppModule } from "./app/app.module";
    
    platformBrowserDynamic()
      .bootstrapModule(AppModule)
      .then((platformRef) => {
        const upgrade = platformRef.injector.get(UpgradeModule);
        // Bootstrap AngularJS
        upgrade.bootstrap(document.body, ["myAngularJSApp"], { strictDi: true });
      });
    
    // app.module.ts
    import { NgModule } from "@angular/core";
    import { BrowserModule } from "@angular/platform-browser";
    import { UpgradeModule } from "@angular/upgrade/static";
    
    @NgModule({
      imports: [BrowserModule, UpgradeModule],
    })
    export class AppModule {
      constructor(private upgrade: UpgradeModule) {}
    
      ngDoBootstrap() {
        // Bootstrapped manually in main.ts
      }
    }
    

    Component Migration

    AngularJS Controller → Angular Component

    // Before: AngularJS controller
    angular
      .module("myApp")
      .controller("UserController", function ($scope, UserService) {
        $scope.user = {};
    
        $scope.loadUser = function (id) {
          UserService.getUser(id).then(function (user) {
            $scope.user = user;
          });
        };
    
        $scope.saveUser = function () {
          UserService.saveUser($scope.user);
        };
      });
    
    // After: Angular component
    import { Component, OnInit } from "@angular/core";
    import { UserService } from "./user.service";
    
    @Component({
      selector: "app-user",
      template: `
        <div>
          <h2>{{ user.name }}</h2>
          <button (click)="saveUser()">Save</button>
        </div>
      `,
    })
    export class UserComponent implements OnInit {
      user: any = {};
    
      constructor(private userService: UserService) {}
    
      ngOnInit() {
        this.loadUser(1);
      }
    
      loadUser(id: number) {
        this.userService.getUser(id).subscribe((user) => {
          this.user = user;
        });
      }
    
      saveUser() {
        this.userService.saveUser(this.user);
      }
    }
    

    AngularJS Directive → Angular Component

    // Before: AngularJS directive
    angular.module("myApp").directive("userCard", function () {
      return {
        restrict: "E",
        scope: {
          user: "=",
          onDelete: "&",
        },
        template: `
          <div class="card">
            <h3>{{ user.name }}</h3>
            <button ng-click="onDelete()">Delete</button>
          </div>
        `,
      };
    });
    
    // After: Angular component
    import { Component, Input, Output, EventEmitter } from "@angular/core";
    
    @Component({
      selector: "app-user-card",
      template: `
        <div class="card">
          <h3>{{ user.name }}</h3>
          <button (click)="delete.emit()">Delete</button>
        </div>
      `,
    })
    export class UserCardComponent {
      @Input() user: any;
      @Output() delete = new EventEmitter<void>();
    }
    
    // Usage: <app-user-card [user]="user" (delete)="handleDelete()"></app-user-card>
    

    Service Migration

    // Before: AngularJS service
    angular.module("myApp").factory("UserService", function ($http) {
      return {
        getUser: function (id) {
          return $http.get("/api/users/" + id);
        },
        saveUser: function (user) {
          return $http.post("/api/users", user);
        },
      };
    });
    
    // After: Angular service
    import { Injectable } from "@angular/core";
    import { HttpClient } from "@angular/common/http";
    import { Observable } from "rxjs";
    
    @Injectable({
      providedIn: "root",
    })
    export class UserService {
      constructor(private http: HttpClient) {}
    
      getUser(id: number): Observable<any> {
        return this.http.get(`/api/users/${id}`);
      }
    
      saveUser(user: any): Observable<any> {
        return this.http.post("/api/users", user);
      }
    }
    

    Dependency Injection Changes

    Downgrading Angular → AngularJS

    // Angular service
    import { Injectable } from "@angular/core";
    
    @Injectable({ providedIn: "root" })
    export class NewService {
      getData() {
        return "data from Angular";
      }
    }
    
    // Make available to AngularJS
    import { downgradeInjectable } from "@angular/upgrade/static";
    
    angular.module("myApp").factory("newService", downgradeInjectable(NewService));
    
    // Use in AngularJS
    angular.module("myApp").controller("OldController", function (newService) {
      console.log(newService.getData());
    });
    

    Upgrading AngularJS → Angular

    // AngularJS service
    angular.module('myApp').factory('oldService', function() {
      return {
        getData: function() {
          return 'data from AngularJS';
        }
      };
    });
    
    // Make available to Angular
    import { InjectionToken } from '@angular/core';
    
    export const OLD_SERVICE = new InjectionToken<any>('oldService');
    
    @NgModule({
      providers: [
        {
          provide: OLD_SERVICE,
          useFactory: (i: any) => i.get('oldService'),
          deps: ['$injector']
        }
      ]
    })
    
    // Use in Angular
    @Component({...})
    export class NewComponent {
      constructor(@Inject(OLD_SERVICE) private oldService: any) {
        console.log(this.oldService.getData());
      }
    }
    

    Routing Migration

    // Before: AngularJS routing
    angular.module("myApp").config(function ($routeProvider) {
      $routeProvider
        .when("/users", {
          template: "<user-list></user-list>",
        })
        .when("/users/:id", {
          template: "<user-detail></user-detail>",
        });
    });
    
    // After: Angular routing
    import { NgModule } from "@angular/core";
    import { RouterModule, Routes } from "@angular/router";
    
    const routes: Routes = [
      { path: "users", component: UserListComponent },
      { path: "users/:id", component: UserDetailComponent },
    ];
    
    @NgModule({
      imports: [RouterModule.forRoot(routes)],
      exports: [RouterModule],
    })
    export class AppRoutingModule {}
    

    Additional patterns and templates

    More detailed templates and worked examples live in references/details.md. Read that file for the full pattern library.

    Reproducido de wshobson/agents bajo licencia MIT. Leer esta página en markdown.

    Archivos

    2 archivos en el paquete. Solo se lee SKILL.md al activarse — las referencias se cargan si el skill decide que las necesita.

    Antes de instalar

    Para patrones y ejemplos completos adicionales, consulta references/details.md.

    Detalles

    Creador
    wshobson
    Licencia
    MIT
    Recursos incluidos
    referencias
    Repositorio
    wshobson/agents
    Código fuente
    Ver SKILL.md

    Etiquetas

    Más de wshobson/agents

    Este repo incluye 180 skills. Si instalas uno, normalmente ya tienes los demás.

    Úsalo al seleccionar y colocar iconos, imágenes, SVGs, diagramas o infografías de apoyo aprobados en un PPTX editable.

    Costo de contexto al activarse
    344 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo cuando pidan optimizar un prompt, mejorar su rendimiento, diseñar una plantilla, aplicar chain-of-thought, few-shot prompting o técnicas avanzadas de prompt engineering para producción.

    Costo de contexto al activarse
    1.3k tok
    Tamaño del paquete
    10 archivos
    Última actualización
    el mes pasado
    herramientas desarrollo

    Úsalo al redactar o reparar una especificación JSON con coordenadas explícitas para un PPTX editable.

    Costo de contexto al activarse
    489 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para validar o reparar un PPTX editable en cuanto a geometría, accesibilidad, editabilidad nativa, linaje de fuente e integridad del paquete OOXML.

    Costo de contexto al activarse
    409 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo para analizar un PPTX de referencia en modo solo lectura: estructura, tema, tipografía, ritmo de layout, diagnósticos, catálogos de plantillas derivados o inspección segura del paquete OOXML.

    Costo de contexto al activarse
    689 tok
    Tamaño del paquete
    8 archivos
    Última actualización
    hace 26 días
    documentos

    Úsalo al preparar la narrativa, las fuentes y el contexto de diseño para un nuevo deck PPTX editable.

    Costo de contexto al activarse
    415 tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 26 días
    documentos

    Skills relacionados

    Domina el sistema de tipos avanzado de TypeScript: generics, tipos condicionales, mapped types, template literals y utility types para aplicaciones type-safe.

    Costo de contexto al activarse
    2k tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 2 meses
    herramientas desarrollo

    Patrones de resiliencia en Python: reintentos automáticos, backoff exponencial, timeouts y decoradores tolerantes a fallos para servicios.

    Costo de contexto al activarse
    1.5k tok
    Tamaño del paquete
    2 archivos
    Última actualización
    hace 2 meses
    herramientas desarrollo

    Organización de proyectos Python, arquitectura de módulos y diseño de APIs públicas con __all__, para nuevos proyectos o reorganización de directorios.

    Costo de contexto al activarse
    1.7k tok
    Tamaño del paquete
    1 archivo
    Última actualización
    hace 6 meses
    herramientas desarrollo