Skip to content

EmeaAppGbb/appmodlab-angularjs-to-react-angular-modern

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

6 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŒ† ANGULARJS โ†’ REACT / ANGULAR 17 ๐ŸŒ†

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                                                                โ•‘
โ•‘   โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•—    โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ•—
โ•‘   โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘    โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•”โ•
โ•‘   โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ•‘ โ–ˆโ•— โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• 
โ•‘   โ–ˆโ–ˆโ•”โ•โ•โ•  โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•  โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•— 
โ•‘   โ–ˆโ–ˆโ•‘     โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ•šโ•โ• โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ•”โ–ˆโ–ˆโ–ˆโ•”โ•โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ•—
โ•‘   โ•šโ•โ•     โ•šโ•โ•  โ•šโ•โ•โ•šโ•โ•  โ•šโ•โ•โ•šโ•โ•     โ•šโ•โ•โ•šโ•โ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•šโ•โ•โ•  โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•  โ•šโ•โ•โ•šโ•โ•  โ•šโ•โ•
โ•‘                                                                โ•‘
โ•‘              โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•—     โ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ–ˆโ•—   โ–ˆโ–ˆโ•—
โ•‘              โ–ˆโ–ˆโ•”โ•โ•โ•โ•โ•โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘     โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ•šโ•โ•โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ•‘
โ•‘              โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—  โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘     โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•‘
โ•‘              โ–ˆโ–ˆโ•”โ•โ•โ•  โ•šโ–ˆโ–ˆโ•— โ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘     โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘
โ•‘              โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•— โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ• โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•   โ–ˆโ–ˆโ•‘   โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•”โ•โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•‘
โ•‘              โ•šโ•โ•โ•โ•โ•โ•โ•  โ•šโ•โ•โ•โ•   โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ•โ• โ•šโ•โ•โ•โ•โ•โ•    โ•šโ•โ•   โ•šโ•โ• โ•šโ•โ•โ•โ•โ•โ• โ•šโ•โ•  โ•šโ•โ•โ•โ•
โ•‘                                                                โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

         ๐Ÿ•น๏ธ  THE ULTIMATE FRAMEWORK TIME TRAVEL EXPERIENCE  ๐Ÿ•น๏ธ
              From 2010 Legacy โ†’ 2024 Modern Architecture

๐ŸŽฎ OVERVIEW

Welcome to the Framework Evolution Lab ๐Ÿงฌ

Step into the neon-lit corridors of frontend history! This lab takes you on an epic journey through time โ€” from the golden age of AngularJS 1.6 (circa 2010) to the cutting-edge frontier of React 18 or Angular 17 with TypeScript.

โš ๏ธ MISSION CRITICAL: AngularJS reached END OF LIFE in January 2022. No more security patches. No more updates. The clock is ticking for enterprises with legacy AngularJS apps! โฐ

Your Mission: Modernize GlobalTravel Corp's legacy travel booking portal โ€” a full-featured AngularJS application complete with Bower packages, Grunt builds, jQuery plugins, and all the nostalgic anti-patterns of yesteryear. Transform it into a blazing-fast, type-safe, modern single-page application! ๐Ÿš€


๐ŸŒŸ WHAT YOU'LL LEARN

FRAMEWORK EVOLVED ๐Ÿงฌ

  • Assess migration complexity and scope for AngularJS applications
  • Map AngularJS controllers + templates โ†’ React functional components OR Angular standalone components
  • Migrate $scope and $rootScope โ†’ React hooks/Zustand OR Angular signals/NgRx
  • Convert UI-Router states โ†’ TanStack Router OR Angular Router

BOWER โ†’ NPM UPGRADE โฌ†๏ธ

  • Replace deprecated Bower with modern npm/pnpm
  • Eliminate jQuery dependencies (write native components instead!)
  • Swap Moment.js โ†’ date-fns (reduce bundle size by 80%!)
  • Remove unnecessary Lodash usage (modern ES6+ has you covered!)

GRUNT โ†’ VITE SPEEDRUN ๐ŸŽ๏ธ

  • Rip out the Grunt pipeline (goodbye, complex config!)
  • Install Vite (React) or Angular CLI (Angular) โ€” lightning-fast builds โšก
  • Hot Module Replacement (HMR) that actually works
  • Build times: from minutes โ†’ seconds

TYPESCRIPT UNLOCKED ๐Ÿ”“

  • Convert loosely-typed JavaScript โ†’ strict TypeScript
  • Catch runtime errors at compile time
  • IntelliSense superpowers in your IDE
  • Refactor with confidence using type safety

DEPLOYMENT MASTERY ๐ŸŒ

  • Build production-optimized bundles
  • Deploy to Azure Static Web Apps
  • Set up CI/CD with GitHub Actions

๐Ÿ”ฎ CHOOSE YOUR PATH ๐Ÿ”€

This lab offers TWO PARALLEL UNIVERSES for your migration destination:

๐Ÿ”ท PATH A: REACT 18 (Recommended for greenfield flexibility)

React 18 + TypeScript
    โ”œโ”€โ”€ โšก Vite (build tool)
    โ”œโ”€โ”€ ๐Ÿงญ TanStack Router (routing)
    โ”œโ”€โ”€ ๐Ÿ”„ TanStack Query (API state)
    โ”œโ”€โ”€ ๐Ÿป Zustand (global state)
    โ”œโ”€โ”€ ๐Ÿงช Vitest + Testing Library (tests)
    โ””โ”€โ”€ ๐ŸŽจ Modern CSS Modules

Choose React if:

  • โœ… You want maximum flexibility and ecosystem richness
  • โœ… Your team prefers functional programming patterns
  • โœ… You need a lightweight, composable architecture
  • โœ… You're building component libraries or design systems

๐Ÿ”ถ PATH B: ANGULAR 17 (Recommended for enterprise continuity)

Angular 17 + TypeScript
    โ”œโ”€โ”€ ๐Ÿ› ๏ธ Angular CLI (build tool)
    โ”œโ”€โ”€ ๐Ÿงญ Angular Router (routing)
    โ”œโ”€โ”€ ๐Ÿ”„ HttpClient + Interceptors (API)
    โ”œโ”€โ”€ ๐Ÿช NgRx (global state)
    โ”œโ”€โ”€ ๐Ÿงช Jasmine + TestBed (tests)
    โ””โ”€โ”€ ๐ŸŽจ Angular Material (UI components)

Choose Angular if:

  • โœ… Your team already knows AngularJS and wants a familiar migration
  • โœ… You need a batteries-included framework with opinionated structure
  • โœ… Enterprise-grade type safety and dependency injection are priorities
  • โœ… You prefer a full-featured framework over composing libraries

๐Ÿ’ก Pro Tip: Both paths achieve the same outcome! The lab includes complete implementations for both React and Angular. You can even migrate to both and compare! ๐Ÿ†š


โšก PREREQUISITES

Before you jack into the mainframe, make sure you have:

  • ๐Ÿง  Knowledge:

    • JavaScript fundamentals
    • AngularJS 1.x familiarity (controllers, directives, services)
    • TypeScript basics (or willingness to learn!)
    • Understanding of REST APIs
  • ๐Ÿ’ป System Requirements:

    • Node.js 20+ installed (Download)
    • npm (comes with Node) or pnpm
    • Git (for version control)
    • Your favorite code editor (VS Code recommended)
  • โ˜๏ธ Azure (Optional for deployment):

  • ๐Ÿ“ฆ Legacy Tools (for running the AngularJS app):

    • Bower: npm install -g bower
    • Grunt CLI: npm install -g grunt-cli

๐Ÿš€ QUICK START

๐Ÿ•ฐ๏ธ STEP 1: EXPERIENCE THE PAST (Run the Legacy AngularJS App)

# Clone the repository
git clone https://github.com/EmeaAppGbb/appmodlab-angularjs-to-react-angular-modern.git
cd appmodlab-angularjs-to-react-angular-modern

# Check out the legacy branch
git checkout legacy

# Install legacy dependencies (Bower + npm)
bower install
npm install

# Start the mock API server
node api-mock/server.js &

# Build the AngularJS app with Grunt
grunt build

# Serve the legacy app
grunt serve

๐ŸŒ Open http://localhost:8080 and witness the glory of 2010's finest frontend tech!

๐ŸŽฏ STEP 2: CHOOSE YOUR FRAMEWORK PATH

For React:

git checkout solution
npm install
npm run dev

For Angular:

git checkout solution-angular
npm install
npm start

๐Ÿงช STEP 3: EXPLORE STEP-BY-STEP BRANCHES

Each migration step has its own branch:

git checkout step-1-project-setup        # Vite/Angular CLI scaffold
git checkout step-2-component-migration  # Controllers โ†’ Components
git checkout step-3-state-management     # $scope โ†’ hooks/signals
git checkout step-4-routing-and-api      # UI-Router โ†’ modern router
git checkout step-5-testing-and-deploy   # Tests + Azure deployment

๐Ÿ“ PROJECT STRUCTURE

๐Ÿ—‚๏ธ Legacy AngularJS App (legacy branch)

globaltravel-portal/
โ”œโ”€โ”€ ๐Ÿ“ฆ bower.json                    # Bower dependencies (deprecated)
โ”œโ”€โ”€ โš™๏ธ Gruntfile.js                  # Grunt build config (complex!)
โ”œโ”€โ”€ ๐ŸŽจ app/
โ”‚   โ”œโ”€โ”€ app.js                       # AngularJS module definition
โ”‚   โ”œโ”€โ”€ app.routes.js                # UI-Router state configs
โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ›ซ flight-search/        # Flight search feature
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿจ hotel-booking/        # Hotel reservation
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‹ itinerary/            # Trip itinerary manager
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“ travel-request/       # Approval workflow
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ’ฐ expense-reconciliation/ # Expense reports
โ”‚   โ”œโ”€โ”€ directives/                  # Custom AngularJS directives
โ”‚   โ”‚   โ”œโ”€โ”€ date-picker.directive.js # jQuery datepicker wrapper
โ”‚   โ”‚   โ”œโ”€โ”€ currency-input.directive.js
โ”‚   โ”‚   โ””โ”€โ”€ approval-status.directive.js
โ”‚   โ”œโ”€โ”€ filters/                     # AngularJS filters
โ”‚   โ”‚   โ”œโ”€โ”€ currency.filter.js
โ”‚   โ”‚   โ””โ”€โ”€ date-format.filter.js
โ”‚   โ”œโ”€โ”€ services/                    # AngularJS services
โ”‚   โ”‚   โ”œโ”€โ”€ auth.service.js          # Authentication with $http
โ”‚   โ”‚   โ”œโ”€โ”€ api.service.js           # Restangular config
โ”‚   โ”‚   โ””โ”€โ”€ user.service.js          # User profile
โ”‚   โ””โ”€โ”€ assets/
โ”‚       โ”œโ”€โ”€ css/                     # Bootstrap 3 + custom styles
โ”‚       โ””โ”€โ”€ images/
โ”œโ”€โ”€ ๐Ÿงช test/spec/                    # Karma + Jasmine tests
โ””โ”€โ”€ ๐Ÿ”Œ api-mock/
    โ””โ”€โ”€ server.js                    # Express mock API server

๐Ÿ†• Modern React App (solution branch)

globaltravel-portal-react/
โ”œโ”€โ”€ ๐Ÿ“ฆ package.json                  # npm dependencies
โ”œโ”€โ”€ โšก vite.config.ts                # Vite build config (simple!)
โ”œโ”€โ”€ ๐ŸŽจ src/
โ”‚   โ”œโ”€โ”€ main.tsx                     # App entry point
โ”‚   โ”œโ”€โ”€ App.tsx                      # Root component
โ”‚   โ”œโ”€โ”€ router.tsx                   # TanStack Router config
โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ›ซ FlightSearch/         # React functional component
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿจ HotelBooking/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‹ Itinerary/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“ TravelRequest/
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ’ฐ ExpenseReconciliation/
โ”‚   โ”œโ”€โ”€ hooks/                       # Custom React hooks
โ”‚   โ”‚   โ”œโ”€โ”€ useAuth.ts
โ”‚   โ”‚   โ”œโ”€โ”€ useFlights.ts
โ”‚   โ”‚   โ””โ”€โ”€ useHotels.ts
โ”‚   โ”œโ”€โ”€ store/                       # Zustand stores
โ”‚   โ”‚   โ”œโ”€โ”€ authStore.ts
โ”‚   โ”‚   โ””โ”€โ”€ userStore.ts
โ”‚   โ”œโ”€โ”€ api/                         # TanStack Query + Axios
โ”‚   โ”‚   โ””โ”€โ”€ client.ts
โ”‚   โ””โ”€โ”€ utils/                       # Utility functions
โ”‚       โ””โ”€โ”€ dateHelpers.ts           # date-fns wrappers
โ””โ”€โ”€ ๐Ÿงช tests/                        # Vitest + Testing Library

๐Ÿ…ฐ๏ธ Modern Angular App (solution-angular branch)

globaltravel-portal-angular/
โ”œโ”€โ”€ ๐Ÿ“ฆ package.json                  # npm dependencies
โ”œโ”€โ”€ ๐Ÿ› ๏ธ angular.json                  # Angular CLI config
โ”œโ”€โ”€ ๐ŸŽจ src/
โ”‚   โ”œโ”€โ”€ main.ts                      # App bootstrap
โ”‚   โ”œโ”€โ”€ app/
โ”‚   โ”‚   โ”œโ”€โ”€ app.config.ts            # App configuration
โ”‚   โ”‚   โ”œโ”€โ”€ app.routes.ts            # Angular Router config
โ”‚   โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ›ซ flight-search/    # Standalone component
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿจ hotel-booking/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“‹ itinerary/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“ travel-request/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ’ฐ expense-reconciliation/
โ”‚   โ”‚   โ”œโ”€โ”€ services/                # Angular services
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ auth.service.ts
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ flight.service.ts
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ hotel.service.ts
โ”‚   โ”‚   โ”œโ”€โ”€ store/                   # NgRx store
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ actions/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ reducers/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ selectors/
โ”‚   โ”‚   โ””โ”€โ”€ interceptors/            # HTTP interceptors
โ”‚   โ”‚       โ””โ”€โ”€ auth.interceptor.ts
โ””โ”€โ”€ ๐Ÿงช tests/                        # Jasmine + TestBed

๐Ÿ’พ LEGACY STACK (2010 Era)

The Old Guard ๐Ÿ—ก๏ธ

Technology Version Status Reason for Replacement
๐Ÿ…ฐ๏ธ AngularJS 1.6.x โŒ EOL (2022) No security patches, poor performance, no TypeScript
๐Ÿ“ฆ Bower 1.8.x โŒ Deprecated Unmaintained since 2017, replaced by npm
โš™๏ธ Grunt 1.x โš ๏ธ Legacy Slow builds, complex config, replaced by Vite/CLI
๐Ÿ’ฒ jQuery 2.x โš ๏ธ Not needed DOM manipulation done by React/Angular
๐Ÿ”ง Restangular 1.6.x โš ๏ธ Abandoned Extra abstraction layer over $http
๐Ÿ“… Moment.js 2.x โš ๏ธ Deprecated Huge bundle size (67KB), use date-fns (12KB)
๐Ÿ”จ Lodash 4.x โš ๏ธ Partially needed Many functions available in modern ES6+
โ˜• Karma + Jasmine - โš ๏ธ Outdated Replaced by Vitest (React) or modern Jasmine (Angular)

Classic Anti-Patterns Present ๐Ÿ›

  • โŒ $scope-based data binding (not controllerAs syntax)
  • โŒ $rootScope events for cross-component communication ($broadcast/$on)
  • โŒ jQuery plugins wrapped in AngularJS directives (DOM manipulation conflicts)
  • โŒ $watch and $watchCollection for manual change detection
  • โŒ Two-way data binding causing performance issues on large lists
  • โŒ No TypeScript โ€” dynamic typing leading to runtime errors
  • โŒ Mixed jQuery and AngularJS DOM manipulation
  • โŒ Global namespace pollution

๐ŸŽฏ TARGET ARCHITECTURE (2024 Modern)

The New Order ๐Ÿš€

React Path:

Technology Version Why It's Better
โš›๏ธ React 18.x Virtual DOM, hooks, huge ecosystem, 200K+ weekly downloads
๐Ÿ“˜ TypeScript 5.x Type safety, IntelliSense, refactoring confidence
โšก Vite 5.x Lightning-fast builds (10x faster than Webpack), HMR in <50ms
๐Ÿงญ TanStack Router 1.x Type-safe routing, nested routes, data loading
๐Ÿ”„ TanStack Query 5.x Server state management, caching, background refetch
๐Ÿป Zustand 4.x Lightweight global state (1KB), no boilerplate
๐Ÿ“… date-fns 3.x Modular, tree-shakeable, 80% smaller than Moment.js
๐Ÿงช Vitest 1.x Fast tests with Vite, Jest-compatible API

Angular Path:

Technology Version Why It's Better
๐Ÿ…ฐ๏ธ Angular 17.x Signals, standalone components, improved DX, enterprise-grade
๐Ÿ“˜ TypeScript 5.x First-class citizen in Angular, full type safety
๐Ÿ› ๏ธ Angular CLI 17.x Optimized builds, built-in best practices
๐Ÿงญ Angular Router 17.x Feature-rich routing, guards, lazy loading
๐Ÿ”„ HttpClient 17.x RxJS-powered, interceptors, automatic JSON parsing
๐Ÿช NgRx 17.x Redux pattern, DevTools, time-travel debugging
๐ŸŽจ Angular Material 17.x Production-ready components, accessibility built-in
๐Ÿงช Jasmine + TestBed - Powerful testing utilities, dependency injection

Architecture Transformation โœจ

BEFORE (AngularJS):                        AFTER (React/Angular):

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Controller + $scope   โ”‚  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚  Functional Component   โ”‚
โ”‚   (Two-way binding)     โ”‚               โ”‚  (React Hooks/Signals)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   $rootScope Events     โ”‚  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚  Zustand/NgRx Store     โ”‚
โ”‚   ($broadcast/$on)      โ”‚               โ”‚  (Immutable state)      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   UI-Router States      โ”‚  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚  TanStack/Angular Routerโ”‚
โ”‚   (config-based)        โ”‚               โ”‚  (Type-safe routes)     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   jQuery Directives     โ”‚  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚  Native Components      โ”‚
โ”‚   (DOM manipulation)    โ”‚               โ”‚  (Virtual DOM/Signals)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Restangular + $http   โ”‚  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚  TanStack Query/HttpClt โ”‚
โ”‚   (Promise-based)       โ”‚               โ”‚  (Observable/async)     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”               โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   Bower + Grunt         โ”‚  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บ โ”‚  npm + Vite/CLI         โ”‚
โ”‚   (Slow builds)         โ”‚               โ”‚  (HMR in milliseconds)  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐ŸŽ“ LAB WALKTHROUGH (Using GitHub Copilot CLI)

๐Ÿค– Powered by AI Pair Programming

This lab is designed to be completed with GitHub Copilot CLI as your co-pilot! The CLI can help you:

  • ๐Ÿ” Analyze legacy code patterns
  • ๐Ÿ”„ Generate migration code snippets
  • ๐Ÿงช Write unit tests automatically
  • ๐Ÿ“ Document your changes
  • ๐Ÿ› Debug build errors

Quick Copilot CLI Tips:

# Ask Copilot to explain legacy code
@workspace /explain How does the AngularJS flight-search controller work?

# Generate migration code
@workspace /new Create a React functional component equivalent to this AngularJS controller

# Fix build errors
@terminal Why is Vite failing to build?

# Generate tests
@workspace /new Write Vitest tests for the FlightSearch component

๐Ÿ“š Step-by-Step Migration Journey

๐ŸŽฌ STAGE 1: RUN THE LEGACY APP (30 min)

Objective: Get the AngularJS app running and understand its features.

  1. Check out the legacy branch
  2. Install Bower dependencies: bower install
  3. Install npm dependencies: npm install
  4. Start the mock API: node api-mock/server.js
  5. Build with Grunt: grunt build
  6. Run the app: grunt serve
  7. Explore all features:
    • ๐Ÿ›ซ Search for flights (JFK โ†’ LAX)
    • ๐Ÿจ Book a hotel
    • ๐Ÿ“‹ View your itinerary
    • ๐Ÿ“ Submit a travel request for approval
    • ๐Ÿ’ฐ Reconcile expenses

๐Ÿ’ก Copilot Tip: Use @workspace /explain to understand how each AngularJS controller, service, and directive works.


๐Ÿ” STAGE 2: ANALYZE MIGRATION SCOPE (45 min)

Objective: Inventory all AngularJS components and plan the migration.

What to Analyze:

  • Controllers: How many? Which ones are most complex?
  • Directives: Which are reusable? Which wrap jQuery plugins?
  • Services: Which make API calls? Which manage state?
  • Filters: Which are used frequently?
  • Routes: How many UI-Router states?
  • Dependencies: Bower packages to replace with npm equivalents

๐Ÿ’ก Copilot Tip: Ask Copilot to create a migration checklist for you:

@workspace Create a checklist of all AngularJS controllers and their React/Angular equivalents

๐Ÿ—๏ธ STAGE 3: SCAFFOLD MODERN PROJECT (30 min)

React Path:

# Create Vite + React + TypeScript project
npm create vite@latest globaltravel-portal-react -- --template react-ts
cd globaltravel-portal-react

# Install dependencies
npm install
npm install @tanstack/router @tanstack/react-query zustand axios date-fns

# Install dev dependencies
npm install -D vitest @testing-library/react @testing-library/jest-dom

Angular Path:

# Create Angular 17 project
npx @angular/cli@17 new globaltravel-portal-angular --standalone --routing --style=scss
cd globaltravel-portal-angular

# Install dependencies
npm install @ngrx/store @ngrx/effects @angular/material date-fns

# Install dev dependencies
npm install -D @ngrx/store-devtools

๐Ÿ’ก Copilot Tip: Ask Copilot to generate the project structure:

@workspace /new Create a folder structure for the React/Angular migration

๐Ÿงฉ STAGE 4: MIGRATE COMPONENTS (2-3 hours)

Objective: Convert AngularJS controllers + templates to React/Angular components.

Migration Pattern (React):

Before (AngularJS Controller):

// flight-search.controller.js
angular.module('app').controller('FlightSearchController', 
  function($scope, FlightService) {
    $scope.searchParams = { origin: '', destination: '' };
    $scope.flights = [];
    
    $scope.searchFlights = function() {
      FlightService.search($scope.searchParams).then(function(data) {
        $scope.flights = data;
      });
    };
  }
);

After (React Component):

// FlightSearch.tsx
import { useState } from 'react';
import { useQuery } from '@tanstack/react-query';
import { searchFlights } from '@/api/flightService';

export const FlightSearch = () => {
  const [searchParams, setSearchParams] = useState({ origin: '', destination: '' });
  
  const { data: flights, refetch } = useQuery({
    queryKey: ['flights', searchParams],
    queryFn: () => searchFlights(searchParams),
    enabled: false,
  });

  return (
    <div>
      {/* Component JSX */}
    </div>
  );
};

Migration Pattern (Angular):

After (Angular Standalone Component):

// flight-search.component.ts
import { Component, signal } from '@angular/core';
import { FlightService } from '@/services/flight.service';

@Component({
  selector: 'app-flight-search',
  standalone: true,
  templateUrl: './flight-search.component.html',
})
export class FlightSearchComponent {
  searchParams = signal({ origin: '', destination: '' });
  flights = signal([]);

  constructor(private flightService: FlightService) {}

  searchFlights() {
    this.flightService.search(this.searchParams()).subscribe(
      data => this.flights.set(data)
    );
  }
}

๐Ÿ’ก Copilot Tip:

@workspace Convert this AngularJS controller to a React functional component with hooks

Repeat for each component:

  1. โœ… FlightSearch
  2. โœ… HotelBooking
  3. โœ… Itinerary
  4. โœ… TravelRequest
  5. โœ… ExpenseReconciliation

๐Ÿช STAGE 5: MIGRATE STATE MANAGEMENT (1-2 hours)

Objective: Replace $scope and $rootScope with modern state management.

Before (AngularJS):

// Using $rootScope for global auth state
$rootScope.$on('user:loggedIn', function(event, user) {
  $scope.currentUser = user;
});

$rootScope.$broadcast('user:loggedIn', userData);

After (React + Zustand):

// store/authStore.ts
import { create } from 'zustand';

export const useAuthStore = create((set) => ({
  currentUser: null,
  login: (user) => set({ currentUser: user }),
  logout: () => set({ currentUser: null }),
}));

// Use in components
const { currentUser, login } = useAuthStore();

After (Angular + NgRx):

// store/actions/auth.actions.ts
import { createAction, props } from '@ngrx/store';

export const loginSuccess = createAction(
  '[Auth] Login Success',
  props<{ user: User }>()
);

// Use in components
this.store.dispatch(loginSuccess({ user }));
this.currentUser$ = this.store.select(selectCurrentUser);

๐Ÿงญ STAGE 6: MIGRATE ROUTING (1 hour)

Before (UI-Router):

// app.routes.js
$stateProvider
  .state('flights', {
    url: '/flights',
    templateUrl: 'components/flight-search/flight-search.template.html',
    controller: 'FlightSearchController'
  });

After (TanStack Router - React):

// router.tsx
import { createRoute } from '@tanstack/router';
import { FlightSearch } from '@/components/FlightSearch';

const flightsRoute = createRoute({
  getParentRoute: () => rootRoute,
  path: '/flights',
  component: FlightSearch,
});

After (Angular Router):

// app.routes.ts
import { Routes } from '@angular/router';
import { FlightSearchComponent } from './components/flight-search';

export const routes: Routes = [
  { path: 'flights', component: FlightSearchComponent },
];

๐Ÿ”Œ STAGE 7: REPLACE DEPENDENCIES (1 hour)

Objective: Remove legacy libraries and use modern alternatives.

Replacements:

  • โŒ jQuery โ†’ โœ… Native React/Angular (no DOM manipulation needed!)
  • โŒ Moment.js โ†’ โœ… date-fns
  • โŒ Lodash โ†’ โœ… Native ES6+ (map, filter, reduce, etc.)
  • โŒ Restangular โ†’ โœ… TanStack Query + Axios (React) or HttpClient (Angular)

Example (date-fns):

// Before (Moment.js) - 67KB bundle
import moment from 'moment';
const formattedDate = moment(date).format('YYYY-MM-DD');

// After (date-fns) - 12KB bundle
import { format } from 'date-fns';
const formattedDate = format(date, 'yyyy-MM-dd');

๐Ÿงช STAGE 8: SET UP TESTING (1-2 hours)

React (Vitest + Testing Library):

// FlightSearch.test.tsx
import { render, screen, fireEvent } from '@testing-library/react';
import { FlightSearch } from './FlightSearch';

test('searches for flights when form is submitted', async () => {
  render(<FlightSearch />);
  
  fireEvent.change(screen.getByLabelText('Origin'), { target: { value: 'JFK' } });
  fireEvent.change(screen.getByLabelText('Destination'), { target: { value: 'LAX' } });
  fireEvent.click(screen.getByText('Search'));
  
  expect(await screen.findByText('Flight Results')).toBeInTheDocument();
});

Angular (Jasmine + TestBed):

// flight-search.component.spec.ts
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FlightSearchComponent } from './flight-search.component';

describe('FlightSearchComponent', () => {
  let component: FlightSearchComponent;
  let fixture: ComponentFixture<FlightSearchComponent>;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      imports: [FlightSearchComponent]
    }).compileComponents();
    
    fixture = TestBed.createComponent(FlightSearchComponent);
    component = fixture.componentInstance;
  });

  it('should search for flights', () => {
    component.searchParams.set({ origin: 'JFK', destination: 'LAX' });
    component.searchFlights();
    expect(component.flights().length).toBeGreaterThan(0);
  });
});

๐Ÿš€ STAGE 9: DEPLOY TO AZURE (30 min)

Azure Static Web Apps Deployment:

# Install Azure CLI
az login

# Create resource group
az group create --name rg-globaltravel --location eastus

# Create Static Web App
az staticwebapp create \
  --name globaltravel-portal \
  --resource-group rg-globaltravel \
  --source https://github.com/YOUR_USERNAME/globaltravel-portal-react \
  --location eastus \
  --branch main \
  --app-location "/" \
  --output-location "dist"

# GitHub Actions workflow is auto-generated!

๐Ÿ’ก Copilot Tip:

@workspace Create a GitHub Actions workflow for building and deploying to Azure Static Web Apps

โฑ๏ธ ESTIMATED DURATION

Stage Time Difficulty
1๏ธโƒฃ Run Legacy App 30 min โญ Easy
2๏ธโƒฃ Analyze Scope 45 min โญโญ Medium
3๏ธโƒฃ Scaffold Project 30 min โญ Easy
4๏ธโƒฃ Migrate Components 2-3 hours โญโญโญ Hard
5๏ธโƒฃ State Management 1-2 hours โญโญโญ Hard
6๏ธโƒฃ Routing 1 hour โญโญ Medium
7๏ธโƒฃ Replace Dependencies 1 hour โญโญ Medium
8๏ธโƒฃ Testing 1-2 hours โญโญโญ Hard
9๏ธโƒฃ Deploy to Azure 30 min โญโญ Medium
TOTAL 5-7 hours โญโญโญ Advanced

๐Ÿ’ก Pro Tip: You can complete this lab over multiple sessions. Use the step branches to save your progress!


๐Ÿ“š RESOURCES

๐Ÿ”— Official Documentation

React:

Angular:

Migration Guides:

๐ŸŽฅ Video Tutorials

๐Ÿ“– Recommended Reading


๐ŸŽฏ ACCEPTANCE CRITERIA

โœ… Lab Completion Checklist

Legacy App:

  • AngularJS app runs successfully with Bower + Grunt
  • All 5 features work (flights, hotels, itinerary, travel requests, expenses)
  • Mock API serves data correctly

Modern App (React OR Angular):

  • TypeScript compiles with zero errors
  • All components migrated from AngularJS
  • State management implemented (Zustand/NgRx)
  • Routing works for all pages
  • No jQuery, Moment.js, Bower, or Grunt in dependencies
  • Build completes in <10 seconds (Vite/CLI)
  • All tests pass
  • App deploys to Azure Static Web Apps
  • Lighthouse score >90 for Performance

Code Quality:

  • TypeScript strict mode enabled
  • ESLint passes with zero warnings
  • No console.log statements in production
  • Proper error handling for API calls
  • Accessible (WCAG AA compliant)

๐Ÿ†˜ TROUBLESHOOTING

Common Issues & Solutions

Problem: Bower install fails

# Solution: Use legacy peer deps
npm install -g bower --legacy-peer-deps

Problem: Grunt build is slow

# Solution: This is normal for Grunt! That's why we're migrating. โฐ
# Consider using --force flag if needed
grunt build --force

Problem: React app won't compile

# Solution: Clear cache and reinstall
rm -rf node_modules package-lock.json
npm install
npm run dev

Problem: Angular CLI version mismatch

# Solution: Install Angular 17 globally
npm install -g @angular/cli@17
ng version

Problem: Azure deployment fails

# Solution: Check GitHub Actions logs
# Ensure output-location matches your build folder (dist/build)

๐Ÿ† ACHIEVEMENT UNLOCKED!

Upon completing this lab, you will have earned:

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                                                            โ•‘
โ•‘            ๐Ÿ† FRAMEWORK EVOLUTION MASTER ๐Ÿ†                โ•‘
โ•‘                                                            โ•‘
โ•‘  โœจ You successfully time-traveled from 2010 to 2024!     โ•‘
โ•‘                                                            โ•‘
โ•‘  Skills Acquired:                                          โ•‘
โ•‘    ๐Ÿงฌ AngularJS โ†’ React/Angular Migration                 โ•‘
โ•‘    โฌ†๏ธ Bower โ†’ npm Modernization                           โ•‘
โ•‘    ๐ŸŽ๏ธ Grunt โ†’ Vite/CLI Speedrun                          โ•‘
โ•‘    ๐Ÿ”“ JavaScript โ†’ TypeScript Mastery                     โ•‘
โ•‘    ๐Ÿš€ Azure Static Web Apps Deployment                    โ•‘
โ•‘                                                            โ•‘
โ•‘  Badge: LEGACY DESTROYER ๐Ÿ’ฅ                               โ•‘
โ•‘  Level: SENIOR MIGRATION ENGINEER ๐ŸŽ–๏ธ                     โ•‘
โ•‘                                                            โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

๐Ÿ“ž SUPPORT & COMMUNITY

Need Help?

Share Your Success!

  • Tweet your completion with #AppModLabs #AngularJSMigration
  • Star the repo โญ if you found it helpful
  • Contribute improvements via Pull Requests

๐Ÿ“„ LICENSE

MIT License - See LICENSE file for details.


๐ŸŒŸ READY TO BEGIN YOUR JOURNEY? ๐ŸŒŸ

   _____ _______       _____ _______   __  ______  _    _ _____    __  __ _____ _____ _____ _____ _______ _____ ____  _   _ 
  / ____|__   __|/\   |  __ \__   __| |  \/  / \ | |  | |  __ \  |  \/  |_   _/ ____|  __ \_   _|__   __|_   _/ __ \| \ | |
 | (___    | |  /  \  | |__) | | |    | \  / |  \| |  | | |__) | | \  / | | || |  __| |__) || |    | |    | || |  | |  \| |
  \___ \   | | / /\ \ |  _  /  | |    | |\/| | . ` |  | |  _  /  | |\/| | | || | |_ |  _  / | |    | |    | || |  | | . ` |
  ____) |  | |/ ____ \| | \ \  | |    | |  | | |\  |  | | | \ \  | |  | |_| || |__| | | \ \_| |_   | |   _| || |__| | |\  |
 |_____/   |_/_/    \_\_|  \_\ |_|    |_|  |_|_| \_|  |_|_|  \_\ |_|  |_|_____\_____|_|  \_\_____|  |_|  |_____\____/|_| \_|
                                                                                                                              

๐ŸŽฎ INSERT COIN TO CONTINUE ๐ŸŽฎ

โฌ‡๏ธ CLONE THE REPO โ€ข ๐Ÿ“– READ THE FULL LAB โ€ข ๐Ÿš€ START MIGRATING


Built with ๐Ÿ’œ by the App Modernization Labs Team
Powered by โ˜๏ธ Azure โ€ข Assisted by ๐Ÿค– GitHub Copilot

About

๐Ÿ•น๏ธ AppMod Lab: Migrate AngularJS 1.x to React 18 or Angular 17 โ€” Corporate travel portal

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors