UNPKG

angular-in-memory-web-api

Version:

An in-memory web api for Angular demos and tests

100 lines 11.8 kB
/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { XhrFactory } from '@angular/common'; import { HttpHeaders, HttpParams, HttpResponse, HttpXhrBackend, } from '@angular/common/http'; import { Inject, Injectable, Optional } from '@angular/core'; import { map } from 'rxjs/operators'; import { BackendService } from './backend-service'; import { STATUS } from './http-status-codes'; import { InMemoryBackendConfig, InMemoryBackendConfigArgs, InMemoryDbService, } from './interfaces'; import * as i0 from "@angular/core"; import * as i1 from "./interfaces"; import * as i2 from "@angular/common"; /** * For Angular `HttpClient` simulate the behavior of a RESTy web api * backed by the simple in-memory data store provided by the injected `InMemoryDbService`. * Conforms mostly to behavior described here: * https://www.restapitutorial.com/lessons/httpmethods.html * * ### Usage * * Create an in-memory data store class that implements `InMemoryDbService`. * Call `config` static method with this service class and optional configuration object: * ``` * // other imports * import { HttpClientModule } from '@angular/common/http'; * import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api'; * * import { InMemHeroService, inMemConfig } from '../api/in-memory-hero.service'; * @NgModule({ * imports: [ * HttpModule, * HttpClientInMemoryWebApiModule.forRoot(InMemHeroService, inMemConfig), * ... * ], * ... * }) * export class AppModule { ... } * ``` */ export class HttpClientBackendService extends BackendService { constructor(inMemDbService, config, xhrFactory) { super(inMemDbService, config); this.xhrFactory = xhrFactory; } handle(req) { try { return this.handleRequest(req); } catch (error) { const err = error.message || error; const resOptions = this.createErrorResponseOptions(req.url, STATUS.INTERNAL_SERVER_ERROR, `${err}`); return this.createResponse$(() => resOptions); } } getJsonBody(req) { return req.body; } getRequestMethod(req) { return (req.method || 'get').toLowerCase(); } createHeaders(headers) { return new HttpHeaders(headers); } createQueryMap(search) { const map = new Map(); if (search) { const params = new HttpParams({ fromString: search }); params.keys().forEach((p) => map.set(p, params.getAll(p) || [])); } return map; } createResponse$fromResponseOptions$(resOptions$) { return resOptions$.pipe(map((opts) => new HttpResponse(opts))); } createPassThruBackend() { try { return new HttpXhrBackend(this.xhrFactory); } catch (ex) { ex.message = 'Cannot create passThru404 backend; ' + (ex.message || ''); throw ex; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: HttpClientBackendService, deps: [{ token: i1.InMemoryDbService }, { token: InMemoryBackendConfig, optional: true }, { token: i2.XhrFactory }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: HttpClientBackendService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0", ngImport: i0, type: HttpClientBackendService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.InMemoryDbService }, { type: i1.InMemoryBackendConfigArgs, decorators: [{ type: Inject, args: [InMemoryBackendConfig] }, { type: Optional }] }, { type: i2.XhrFactory }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQtYmFja2VuZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbWlzYy9hbmd1bGFyLWluLW1lbW9yeS13ZWItYXBpL3NyYy9odHRwLWNsaWVudC1iYWNrZW5kLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFHTCxXQUFXLEVBQ1gsVUFBVSxFQUVWLFlBQVksRUFDWixjQUFjLEdBQ2YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsaUJBQWlCLEdBRWxCLE1BQU0sY0FBYyxDQUFDOzs7O0FBRXRCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUVILE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxjQUFjO0lBQzFELFlBQ0UsY0FBaUMsRUFDVSxNQUFpQyxFQUNwRSxVQUFzQjtRQUU5QixLQUFLLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRnRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFHaEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFxQjtRQUMxQixJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLEdBQUcsR0FBSSxLQUFlLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztZQUM5QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQ2hELEdBQUcsQ0FBQyxHQUFHLEVBQ1AsTUFBTSxDQUFDLHFCQUFxQixFQUM1QixHQUFHLEdBQUcsRUFBRSxDQUNULENBQUM7WUFDRixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7SUFFa0IsV0FBVyxDQUFDLEdBQXFCO1FBQ2xELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBRWtCLGdCQUFnQixDQUFDLEdBQXFCO1FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFa0IsYUFBYSxDQUFDLE9BQWtDO1FBQ2pFLE9BQU8sSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVrQixjQUFjLENBQUMsTUFBYztRQUM5QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztRQUN4QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVrQixtQ0FBbUMsQ0FDcEQsV0FBd0M7UUFFeEMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxZQUFZLENBQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFa0IscUJBQXFCO1FBQ3RDLElBQUksQ0FBQztZQUNILE9BQU8sSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFBQyxPQUFPLEVBQU8sRUFBRSxDQUFDO1lBQ2pCLEVBQUUsQ0FBQyxPQUFPLEdBQUcscUNBQXFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sRUFBRSxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7eUhBekRVLHdCQUF3QixtREFHekIscUJBQXFCOzZIQUhwQix3QkFBd0I7O3NHQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVU7OzBCQUlOLE1BQU07MkJBQUMscUJBQXFCOzswQkFBRyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7WGhyRmFjdG9yeX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEh0dHBCYWNrZW5kLFxuICBIdHRwRXZlbnQsXG4gIEh0dHBIZWFkZXJzLFxuICBIdHRwUGFyYW1zLFxuICBIdHRwUmVxdWVzdCxcbiAgSHR0cFJlc3BvbnNlLFxuICBIdHRwWGhyQmFja2VuZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tICcuL2JhY2tlbmQtc2VydmljZSc7XG5pbXBvcnQge1NUQVRVU30gZnJvbSAnLi9odHRwLXN0YXR1cy1jb2Rlcyc7XG5pbXBvcnQge1xuICBJbk1lbW9yeUJhY2tlbmRDb25maWcsXG4gIEluTWVtb3J5QmFja2VuZENvbmZpZ0FyZ3MsXG4gIEluTWVtb3J5RGJTZXJ2aWNlLFxuICBSZXNwb25zZU9wdGlvbnMsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICogRm9yIEFuZ3VsYXIgYEh0dHBDbGllbnRgIHNpbXVsYXRlIHRoZSBiZWhhdmlvciBvZiBhIFJFU1R5IHdlYiBhcGlcbiAqIGJhY2tlZCBieSB0aGUgc2ltcGxlIGluLW1lbW9yeSBkYXRhIHN0b3JlIHByb3ZpZGVkIGJ5IHRoZSBpbmplY3RlZCBgSW5NZW1vcnlEYlNlcnZpY2VgLlxuICogQ29uZm9ybXMgbW9zdGx5IHRvIGJlaGF2aW9yIGRlc2NyaWJlZCBoZXJlOlxuICogaHR0cHM6Ly93d3cucmVzdGFwaXR1dG9yaWFsLmNvbS9sZXNzb25zL2h0dHBtZXRob2RzLmh0bWxcbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBDcmVhdGUgYW4gaW4tbWVtb3J5IGRhdGEgc3RvcmUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGBJbk1lbW9yeURiU2VydmljZWAuXG4gKiBDYWxsIGBjb25maWdgIHN0YXRpYyBtZXRob2Qgd2l0aCB0aGlzIHNlcnZpY2UgY2xhc3MgYW5kIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0OlxuICogYGBgXG4gKiAvLyBvdGhlciBpbXBvcnRzXG4gKiBpbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuICogaW1wb3J0IHsgSHR0cENsaWVudEluTWVtb3J5V2ViQXBpTW9kdWxlIH0gZnJvbSAnYW5ndWxhci1pbi1tZW1vcnktd2ViLWFwaSc7XG4gKlxuICogaW1wb3J0IHsgSW5NZW1IZXJvU2VydmljZSwgaW5NZW1Db25maWcgfSBmcm9tICcuLi9hcGkvaW4tbWVtb3J5LWhlcm8uc2VydmljZSc7XG4gKiBATmdNb2R1bGUoe1xuICogIGltcG9ydHM6IFtcbiAqICAgIEh0dHBNb2R1bGUsXG4gKiAgICBIdHRwQ2xpZW50SW5NZW1vcnlXZWJBcGlNb2R1bGUuZm9yUm9vdChJbk1lbUhlcm9TZXJ2aWNlLCBpbk1lbUNvbmZpZyksXG4gKiAgICAuLi5cbiAqICBdLFxuICogIC4uLlxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUgeyAuLi4gfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIdHRwQ2xpZW50QmFja2VuZFNlcnZpY2UgZXh0ZW5kcyBCYWNrZW5kU2VydmljZSBpbXBsZW1lbnRzIEh0dHBCYWNrZW5kIHtcbiAgY29uc3RydWN0b3IoXG4gICAgaW5NZW1EYlNlcnZpY2U6IEluTWVtb3J5RGJTZXJ2aWNlLFxuICAgIEBJbmplY3QoSW5NZW1vcnlCYWNrZW5kQ29uZmlnKSBAT3B0aW9uYWwoKSBjb25maWc6IEluTWVtb3J5QmFja2VuZENvbmZpZ0FyZ3MsXG4gICAgcHJpdmF0ZSB4aHJGYWN0b3J5OiBYaHJGYWN0b3J5LFxuICApIHtcbiAgICBzdXBlcihpbk1lbURiU2VydmljZSwgY29uZmlnKTtcbiAgfVxuXG4gIGhhbmRsZShyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlcXVlc3QocmVxKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyID0gKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlIHx8IGVycm9yO1xuICAgICAgY29uc3QgcmVzT3B0aW9ucyA9IHRoaXMuY3JlYXRlRXJyb3JSZXNwb25zZU9wdGlvbnMoXG4gICAgICAgIHJlcS51cmwsXG4gICAgICAgIFNUQVRVUy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgIGAke2Vycn1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJlc3BvbnNlJCgoKSA9PiByZXNPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0SnNvbkJvZHkocmVxOiBIdHRwUmVxdWVzdDxhbnk+KTogYW55IHtcbiAgICByZXR1cm4gcmVxLmJvZHk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0UmVxdWVzdE1ldGhvZChyZXE6IEh0dHBSZXF1ZXN0PGFueT4pOiBzdHJpbmcge1xuICAgIHJldHVybiAocmVxLm1ldGhvZCB8fCAnZ2V0JykudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVIZWFkZXJzKGhlYWRlcnM6IHtbaW5kZXg6IHN0cmluZ106IHN0cmluZ30pOiBIdHRwSGVhZGVycyB7XG4gICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycyhoZWFkZXJzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVRdWVyeU1hcChzZWFyY2g6IHN0cmluZyk6IE1hcDxzdHJpbmcsIHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKHtmcm9tU3RyaW5nOiBzZWFyY2h9KTtcbiAgICAgIHBhcmFtcy5rZXlzKCkuZm9yRWFjaCgocCkgPT4gbWFwLnNldChwLCBwYXJhbXMuZ2V0QWxsKHApIHx8IFtdKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlUmVzcG9uc2UkZnJvbVJlc3BvbnNlT3B0aW9ucyQoXG4gICAgcmVzT3B0aW9ucyQ6IE9ic2VydmFibGU8UmVzcG9uc2VPcHRpb25zPixcbiAgKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj4ge1xuICAgIHJldHVybiByZXNPcHRpb25zJC5waXBlKG1hcCgob3B0cykgPT4gbmV3IEh0dHBSZXNwb25zZTxhbnk+KG9wdHMpKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlUGFzc1RocnVCYWNrZW5kKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IEh0dHBYaHJCYWNrZW5kKHRoaXMueGhyRmFjdG9yeSk7XG4gICAgfSBjYXRjaCAoZXg6IGFueSkge1xuICAgICAgZXgubWVzc2FnZSA9ICdDYW5ub3QgY3JlYXRlIHBhc3NUaHJ1NDA0IGJhY2tlbmQ7ICcgKyAoZXgubWVzc2FnZSB8fCAnJyk7XG4gICAgICB0aHJvdyBleDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==