or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

angular-modules.mdbackend-implementation.mdconfiguration-options.mdheaders-parameters.mdhttp-services.mdindex.mdrequest-response.mdtesting.md
tile.json

angular-modules.mddocs/

Angular Module Integration

Angular modules for dependency injection and service configuration with HttpModule and JsonpModule. Provides complete integration with Angular's dependency injection system for HTTP services.

Capabilities

HttpModule

Main Angular module providing HTTP services and dependencies for XMLHttpRequest-based operations.

/**
 * Angular module for HTTP services
 * Provides all necessary dependencies for XMLHttpRequest-based HTTP operations
 * Configures dependency injection for Http service and related components
 */
class HttpModule {
  // Provides the following services:
  // - Http (factory: httpFactory)
  // - BrowserXhr
  // - RequestOptions (useClass: BaseRequestOptions)
  // - ResponseOptions (useClass: BaseResponseOptions)
  // - XHRBackend
  // - XSRFStrategy (factory: _createDefaultCookieXSRFStrategy)
}

Usage Examples:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule } from '@angular/http';
import { AppComponent } from './app.component';

@NgModule({
  imports: [
    BrowserModule,
    HttpModule  // Import HttpModule to enable HTTP services
  ],
  declarations: [AppComponent],
  bootstrap: [AppComponent]
})
export class AppModule {}
import { Component } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Component({
  selector: 'app-users',
  template: `
    <div *ngFor="let user of users | async">
      {{ user.name }} - {{ user.email }}
    </div>
  `
})
export class UsersComponent {
  users: Observable<any[]>;
  
  constructor(private http: Http) {
    // Http service is automatically injected by HttpModule
    this.users = this.http.get('/api/users')
      .pipe(map(response => response.json()));
  }
}

JsonpModule

Angular module providing JSONP services and dependencies for cross-domain requests.

/**
 * Angular module for JSONP services
 * Provides all necessary dependencies for JSONP-based HTTP operations
 * Configures dependency injection for Jsonp service and related components
 */
class JsonpModule {
  // Provides the following services:
  // - Jsonp (factory: jsonpFactory)
  // - BrowserJsonp
  // - RequestOptions (useClass: BaseRequestOptions)
  // - ResponseOptions (useClass: BaseResponseOptions)
  // - JSONPBackend
}

Usage Examples:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { JsonpModule } from '@angular/http';
import { AppComponent } from './app.component';

@NgModule({
  imports: [
    BrowserModule,
    JsonpModule  // Import JsonpModule to enable JSONP services
  ],
  declarations: [AppComponent],
  bootstrap: [AppComponent]
})
export class AppModule {}
import { Component } from '@angular/core';
import { Jsonp } from '@angular/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Component({
  selector: 'app-external-data',
  template: `
    <div *ngFor="let item of externalData | async">
      {{ item.title }}
    </div>
  `
})
export class ExternalDataComponent {
  externalData: Observable<any[]>;
  
  constructor(private jsonp: Jsonp) {
    // Jsonp service is automatically injected by JsonpModule
    const url = 'https://api.external.com/data?callback=JSONP_CALLBACK';
    this.externalData = this.jsonp.get(url)
      .pipe(map(response => response.json()));
  }
}

Combined Module Usage

Using both HttpModule and JsonpModule in the same application.

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule, JsonpModule } from '@angular/http';
import { AppComponent } from './app.component';

@NgModule({
  imports: [
    BrowserModule,
    HttpModule,    // For regular HTTP requests
    JsonpModule    // For JSONP requests
  ],
  declarations: [AppComponent],
  bootstrap: [AppComponent]
})
export class AppModule {}
import { Injectable } from '@angular/core';
import { Http, Jsonp } from '@angular/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class DataService {
  
  constructor(
    private http: Http,    // From HttpModule
    private jsonp: Jsonp   // From JsonpModule
  ) {}
  
  // Use Http for same-origin requests
  getLocalData(): Observable<any[]> {
    return this.http.get('/api/local-data')
      .pipe(map(response => response.json()));
  }
  
  // Use Jsonp for cross-origin requests
  getExternalData(): Observable<any[]> {
    const url = 'https://api.external.com/data?callback=JSONP_CALLBACK';
    return this.jsonp.get(url)
      .pipe(map(response => response.json()));
  }
}

Factory Functions

Internal factory functions used by the modules for service creation.

/**
 * Factory function for creating Http service
 * @param xhrBackend - XMLHttpRequest backend implementation
 * @param requestOptions - Default request options
 * @returns Configured Http service instance
 */
function httpFactory(xhrBackend: XHRBackend, requestOptions: RequestOptions): Http;

/**
 * Factory function for creating Jsonp service
 * @param jsonpBackend - JSONP backend implementation
 * @param requestOptions - Default request options
 * @returns Configured Jsonp service instance
 */
function jsonpFactory(jsonpBackend: JSONPBackend, requestOptions: RequestOptions): Jsonp;

/**
 * Factory function for creating default XSRF strategy
 * @returns Default cookie-based XSRF strategy
 */
function _createDefaultCookieXSRFStrategy(): CookieXSRFStrategy;

Advanced Module Configuration

Custom Module Configuration

import { NgModule, ModuleWithProviders } from '@angular/core';
import { 
  Http, 
  XHRBackend, 
  RequestOptions, 
  BaseRequestOptions,
  ResponseOptions,
  BaseResponseOptions,
  BrowserXhr,
  XSRFStrategy,
  CookieXSRFStrategy
} from '@angular/http';

// Custom HTTP module with configuration
@NgModule({})
export class CustomHttpModule {
  
  static forRoot(config?: HttpConfig): ModuleWithProviders {
    return {
      ngModule: CustomHttpModule,
      providers: [
        BrowserXhr,
        { provide: RequestOptions, useClass: BaseRequestOptions },
        { provide: ResponseOptions, useClass: BaseResponseOptions },
        XHRBackend,
        { 
          provide: XSRFStrategy, 
          useFactory: () => new CookieXSRFStrategy(
            config?.xsrfCookieName || 'XSRF-TOKEN',
            config?.xsrfHeaderName || 'X-XSRF-TOKEN'
          )
        },
        {
          provide: Http,
          useFactory: (backend: XHRBackend, options: RequestOptions) => {
            return new Http(backend, options);
          },
          deps: [XHRBackend, RequestOptions]
        }
      ]
    };
  }
}

interface HttpConfig {
  xsrfCookieName?: string;
  xsrfHeaderName?: string;
}

// Usage
@NgModule({
  imports: [
    CustomHttpModule.forRoot({
      xsrfCookieName: 'MY_XSRF_TOKEN',
      xsrfHeaderName: 'X-MY-XSRF-TOKEN'
    })
  ]
})
export class AppModule {}

Custom Provider Configuration

import { NgModule } from '@angular/core';
import { 
  Http,
  RequestOptions,
  BaseRequestOptions,
  Headers
} from '@angular/http';

// Custom request options
export class CustomRequestOptions extends BaseRequestOptions {
  constructor() {
    super();
    // Set default headers for all requests
    this.headers = new Headers({
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'X-API-Version': '2.0'
    });
    this.withCredentials = true;
  }
}

@NgModule({
  imports: [HttpModule],
  providers: [
    // Override default request options
    { provide: RequestOptions, useClass: CustomRequestOptions }
  ]
})
export class CustomHttpConfigModule {}

Interceptor-like Functionality

import { Injectable } from '@angular/core';
import { Http, RequestOptionsArgs, Response } from '@angular/http';
import { Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';

// Service that wraps Http with additional functionality
@Injectable()
export class InterceptedHttp {
  
  constructor(private http: Http) {}
  
  get(url: string, options?: RequestOptionsArgs): Observable<Response> {
    return this.http.get(url, this.addAuthHeaders(options))
      .pipe(
        map(this.handleResponse),
        catchError(this.handleError)
      );
  }
  
  post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
    return this.http.post(url, body, this.addAuthHeaders(options))
      .pipe(
        map(this.handleResponse),
        catchError(this.handleError)
      );
  }
  
  private addAuthHeaders(options?: RequestOptionsArgs): RequestOptionsArgs {
    const token = localStorage.getItem('authToken');
    const headers = new Headers(options?.headers || {});
    
    if (token) {
      headers.set('Authorization', `Bearer ${token}`);
    }
    
    return { ...options, headers };
  }
  
  private handleResponse = (response: Response): Response => {
    // Log successful responses
    console.log(`HTTP ${response.status}: ${response.url}`);
    return response;
  }
  
  private handleError = (error: any): Observable<never> => {
    // Log errors
    console.error('HTTP Error:', error);
    return throwError(error);
  }
}

// Module providing the intercepted HTTP service
@NgModule({
  imports: [HttpModule],
  providers: [
    InterceptedHttp,
    // Optionally override Http with InterceptedHttp
    // { provide: Http, useExisting: InterceptedHttp }
  ]
})
export class InterceptedHttpModule {}

Environment-Specific Configuration

import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { environment } from '../environments/environment';

// Development-specific HTTP configuration
@NgModule({
  imports: [HttpModule],
  providers: environment.production ? [] : [
    // Development-only providers
    {
      provide: 'API_BASE_URL',
      useValue: 'http://localhost:3000/api'
    }
  ]
})
export class EnvironmentHttpModule {}

// Service using environment configuration
@Injectable()
export class ApiService {
  
  constructor(
    private http: Http,
    @Inject('API_BASE_URL') private baseUrl: string
  ) {}
  
  getData(): Observable<any> {
    const url = `${this.baseUrl}/data`;
    return this.http.get(url)
      .pipe(map(response => response.json()));
  }
}

Testing Configuration

import { NgModule } from '@angular/core';
import { MockBackend, MockConnection } from '@angular/http/testing';
import { Http, BaseRequestOptions, ResponseOptions, Response } from '@angular/http';

// Testing module with mock backend
@NgModule({
  providers: [
    MockBackend,
    BaseRequestOptions,
    {
      provide: Http,
      useFactory: (mockBackend: MockBackend, options: BaseRequestOptions) => {
        return new Http(mockBackend, options);
      },
      deps: [MockBackend, BaseRequestOptions]
    }
  ]
})
export class HttpTestingModule {}

// Usage in tests
describe('DataService', () => {
  let service: DataService;
  let mockBackend: MockBackend;
  
  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpTestingModule],
      providers: [DataService]
    });
    
    service = TestBed.get(DataService);
    mockBackend = TestBed.get(MockBackend);
  });
  
  it('should fetch data', () => {
    mockBackend.connections.subscribe((connection: MockConnection) => {
      connection.mockRespond(new Response(new ResponseOptions({
        body: JSON.stringify({ data: 'test' })
      })));
    });
    
    service.getData().subscribe(data => {
      expect(data.data).toBe('test');
    });
  });
});