@peppierre/typesafe-http-iots
Version:
Type-safe HTTP client for Angular using io-ts and fp-ts
1 lines • 23.6 kB
Source Map (JSON)
{"version":3,"file":"peppierre-typesafe-http-iots.mjs","sources":["../../../projects/typesafe-http-iots/src/lib/typesafe-http.service.ts","../../../projects/typesafe-http-iots/src/lib/provide.util.ts","../../../projects/typesafe-http-iots/src/public-api.ts","../../../projects/typesafe-http-iots/src/peppierre-typesafe-http-iots.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { HttpClient, HttpEvent, HttpEventType, HttpResponse } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError, tap } from 'rxjs/operators';\nimport * as iots from 'io-ts';\nimport {\n OptionsArrayBufferOptions,\n OptionsArrayBufferEventsOptions,\n OptionsArrayBufferResponseOptions,\n OptionsBlobOptions,\n OptionsBlobEventsOptions,\n OptionsBlobResponseOptions,\n OptionsTextOptions,\n OptionsTextEventsOptions,\n OptionsTextResponseOptions,\n OptionsJsonOptions,\n OptionsJsonEventsOptions,\n OptionsJsonResponseOptions,\n OptionsJsonTypedOptions,\n OptionsJsonEventsTypedOptions,\n OptionsJsonResponseTypedOptions,\n HeadArrayBufferOptions,\n HeadArrayBufferEventsOptions,\n HeadArrayBufferResponseOptions,\n HeadBlobOptions,\n HeadBlobEventsOptions,\n HeadBlobResponseOptions,\n HeadTextOptions,\n HeadTextEventsOptions,\n HeadTextResponseOptions,\n HeadJsonOptions,\n HeadJsonEventsOptions,\n HeadJsonResponseOptions,\n HeadJsonTypedOptions,\n HeadJsonEventsTypedOptions,\n HeadJsonResponseTypedOptions,\n GetArrayBufferOptions,\n GetArrayBufferEventsOptions,\n GetArrayBufferResponseOptions,\n GetBlobOptions,\n GetBlobEventsOptions,\n GetBlobResponseOptions,\n GetTextOptions,\n GetTextEventsOptions,\n GetTextResponseOptions,\n GetJsonOptions,\n GetJsonEventsOptions,\n GetJsonResponseOptions,\n GetJsonTypedOptions,\n GetJsonEventsTypedOptions,\n GetJsonResponseTypedOptions,\n DeleteArrayBufferOptions,\n DeleteArrayBufferEventsOptions,\n DeleteArrayBufferResponseOptions,\n DeleteBlobOptions,\n DeleteBlobEventsOptions,\n DeleteBlobResponseOptions,\n DeleteTextOptions,\n DeleteTextEventsOptions,\n DeleteTextResponseOptions,\n DeleteJsonOptions,\n DeleteJsonEventsOptions,\n DeleteJsonResponseOptions,\n DeleteJsonTypedOptions,\n DeleteJsonEventsTypedOptions,\n DeleteJsonResponseTypedOptions,\n PatchArrayBufferOptions,\n PatchArrayBufferEventsOptions,\n PatchArrayBufferResponseOptions,\n PatchBlobOptions,\n PatchBlobEventsOptions,\n PatchBlobResponseOptions,\n PatchTextOptions,\n PatchTextEventsOptions,\n PatchTextResponseOptions,\n PatchJsonOptions,\n PatchJsonEventsOptions,\n PatchJsonResponseOptions,\n PatchJsonTypedOptions,\n PatchJsonEventsTypedOptions,\n PatchJsonResponseTypedOptions,\n PostArrayBufferEventsOptions,\n PostArrayBufferOptions,\n PostArrayBufferResponseOptions,\n PostBlobEventsOptions,\n PostBlobOptions,\n PostBlobResponseOptions,\n PostJsonEventsOptions,\n PostJsonEventsTypedOptions,\n PostJsonOptions,\n PostJsonResponseOptions,\n PostJsonResponseTypedOptions,\n PostJsonTypedOptions,\n PostTextEventsOptions,\n PostTextOptions,\n PostTextResponseOptions,\n PutArrayBufferEventsOptions,\n PutArrayBufferOptions,\n PutArrayBufferResponseOptions,\n PutBlobEventsOptions,\n PutBlobOptions,\n PutBlobResponseOptions,\n PutJsonEventsOptions,\n PutJsonEventsTypedOptions,\n PutJsonOptions,\n PutJsonResponseOptions,\n PutJsonResponseTypedOptions,\n PutJsonTypedOptions,\n PutTextEventsOptions,\n PutTextOptions,\n PutTextResponseOptions\n} from './types/http-options.type';\n\nconst IOTS_RESULT_TAG_LEFT = 'Left';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TypesafeHttpService {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n constructor(private http: HttpClient) {}\n\n public delete (url: string, options: DeleteArrayBufferOptions): Observable<ArrayBuffer>;\n public delete (url: string, options: DeleteArrayBufferEventsOptions): Observable<HttpEvent<ArrayBuffer>>;\n public delete (url: string, options: DeleteArrayBufferResponseOptions): Observable<HttpResponse<ArrayBuffer>>;\n public delete (url: string, options: DeleteBlobOptions): Observable<Blob>;\n public delete (url: string, options: DeleteBlobEventsOptions): Observable<HttpEvent<Blob>>;\n public delete (url: string, options: DeleteBlobResponseOptions): Observable<HttpResponse<Blob>>;\n public delete (url: string, options: DeleteTextOptions): Observable<string>;\n public delete (url: string, options: DeleteTextEventsOptions): Observable<HttpEvent<string>>;\n public delete (url: string, options: DeleteTextResponseOptions): Observable<HttpResponse<string>>;\n public delete (url: string, options?: DeleteJsonOptions | undefined): Observable<object>;\n public delete (url: string, options: DeleteJsonEventsOptions): Observable<HttpEvent<object>>;\n public delete (url: string, options: DeleteJsonResponseOptions): Observable<HttpResponse<object>>;\n public delete<T> (url: string, options?: DeleteJsonTypedOptions<T> | undefined): Observable<T>;\n public delete<T> (url: string, options: DeleteJsonEventsTypedOptions<T>): Observable<HttpEvent<T>>;\n public delete<T> (url: string, options: DeleteJsonResponseTypedOptions<T>): Observable<HttpResponse<T>>;\n public delete<T> (url: string, options?: any): Observable<ArrayBuffer | object | Blob | string | T > | Observable<HttpEvent<ArrayBuffer | object | Blob | string | T>> | Observable<HttpResponse<ArrayBuffer | object | Blob | string | T>> {\n return this.http.delete(url, options).pipe(\n tap(generateHandler<T>(options)),\n catchError(handleDecodeError)\n );\n }\n\n public get (url: string, options: GetArrayBufferOptions): Observable<ArrayBuffer>;\n public get (url: string, options: GetArrayBufferEventsOptions): Observable<HttpEvent<ArrayBuffer>>;\n public get (url: string, options: GetArrayBufferResponseOptions): Observable<HttpResponse<ArrayBuffer>>;\n public get (url: string, options: GetBlobOptions): Observable<Blob>;\n public get (url: string, options: GetBlobEventsOptions): Observable<HttpEvent<Blob>>;\n public get (url: string, options: GetBlobResponseOptions): Observable<HttpResponse<Blob>>;\n public get (url: string, options: GetTextOptions): Observable<string>;\n public get (url: string, options: GetTextEventsOptions): Observable<HttpEvent<string>>;\n public get (url: string, options: GetTextResponseOptions): Observable<HttpResponse<string>>;\n public get (url: string, options?: GetJsonOptions | undefined): Observable<object>;\n public get (url: string, options: GetJsonEventsOptions): Observable<HttpEvent<object>>;\n public get (url: string, options: GetJsonResponseOptions): Observable<HttpResponse<object>>;\n public get<T> (url: string, options?: GetJsonTypedOptions<T> | undefined): Observable<T>;\n public get<T> (url: string, options: GetJsonEventsTypedOptions<T>): Observable<HttpEvent<T>>;\n public get<T> (url: string, options: GetJsonResponseTypedOptions<T>): Observable<HttpResponse<T>>;\n public get<T> (url: string, options?: any): Observable<ArrayBuffer | object | Blob | string | T > | Observable<HttpEvent<ArrayBuffer | object | Blob | string | T>> | Observable<HttpResponse<ArrayBuffer | object | Blob | string | T>> {\n return this.http.get(url, options).pipe(\n tap(generateHandler<T>(options)),\n catchError(handleDecodeError)\n );\n }\n\n public head (url: string, options: HeadArrayBufferOptions): Observable<ArrayBuffer>;\n public head (url: string, options: HeadArrayBufferEventsOptions): Observable<HttpEvent<ArrayBuffer>>;\n public head (url: string, options: HeadArrayBufferResponseOptions): Observable<HttpResponse<ArrayBuffer>>;\n public head (url: string, options: HeadBlobOptions): Observable<Blob>;\n public head (url: string, options: HeadBlobEventsOptions): Observable<HttpEvent<Blob>>;\n public head (url: string, options: HeadBlobResponseOptions): Observable<HttpResponse<Blob>>;\n public head (url: string, options: HeadTextOptions): Observable<string>;\n public head (url: string, options: HeadTextEventsOptions): Observable<HttpEvent<string>>;\n public head (url: string, options: HeadTextResponseOptions): Observable<HttpResponse<string>>;\n public head (url: string, options?: HeadJsonOptions | undefined): Observable<object>;\n public head (url: string, options: HeadJsonEventsOptions): Observable<HttpEvent<object>>;\n public head (url: string, options: HeadJsonResponseOptions): Observable<HttpResponse<object>>;\n public head<T> (url: string, options?: HeadJsonTypedOptions<T> | undefined): Observable<T>;\n public head<T> (url: string, options: HeadJsonEventsTypedOptions<T>): Observable<HttpEvent<T>>;\n public head<T> (url: string, options: HeadJsonResponseTypedOptions<T>): Observable<HttpResponse<T>>;\n public head<T> (url: string, options?: any): Observable<ArrayBuffer | object | Blob | string | T > | Observable<HttpEvent<ArrayBuffer | object | Blob | string | T>> | Observable<HttpResponse<ArrayBuffer | object | Blob | string | T>> {\n return this.http.head(url, options).pipe(\n tap(generateHandler<T>(options)),\n catchError(handleDecodeError)\n );\n }\n\n public options (url: string, options: OptionsArrayBufferOptions): Observable<ArrayBuffer>;\n public options (url: string, options: OptionsArrayBufferEventsOptions): Observable<HttpEvent<ArrayBuffer>>;\n public options (url: string, options: OptionsArrayBufferResponseOptions): Observable<HttpResponse<ArrayBuffer>>;\n public options (url: string, options: OptionsBlobOptions): Observable<Blob>;\n public options (url: string, options: OptionsBlobEventsOptions): Observable<HttpEvent<Blob>>;\n public options (url: string, options: OptionsBlobResponseOptions): Observable<HttpResponse<Blob>>;\n public options (url: string, options: OptionsTextOptions): Observable<string>;\n public options (url: string, options: OptionsTextEventsOptions): Observable<HttpEvent<string>>;\n public options (url: string, options: OptionsTextResponseOptions): Observable<HttpResponse<string>>;\n public options (url: string, options?: OptionsJsonOptions | undefined): Observable<object>;\n public options (url: string, options: OptionsJsonEventsOptions): Observable<HttpEvent<object>>;\n public options (url: string, options: OptionsJsonResponseOptions): Observable<HttpResponse<object>>;\n public options<T>(url: string, options?: OptionsJsonTypedOptions<T> | undefined): Observable<T>;\n public options<T>(url: string, options: OptionsJsonEventsTypedOptions<T>): Observable<HttpEvent<T>>;\n public options<T>(url: string, options: OptionsJsonResponseTypedOptions<T>): Observable<HttpResponse<T>>;\n public options<T>(url: string, options?: any): Observable<ArrayBuffer | object | Blob | string | T > | Observable<HttpEvent<ArrayBuffer | object | Blob | string | T>> | Observable<HttpResponse<ArrayBuffer | object | Blob | string | T>> {\n return this.http.options(url, options).pipe(\n tap(generateHandler<T>(options)),\n catchError(handleDecodeError)\n );\n }\n\n public patch (url: string, body: unknown, options: PatchArrayBufferOptions): Observable<ArrayBuffer>;\n public patch (url: string, body: unknown, options: PatchArrayBufferEventsOptions): Observable<HttpEvent<ArrayBuffer>>;\n public patch (url: string, body: unknown, options: PatchArrayBufferResponseOptions): Observable<HttpResponse<ArrayBuffer>>;\n public patch (url: string, body: unknown, options: PatchBlobOptions): Observable<Blob>;\n public patch (url: string, body: unknown, options: PatchBlobEventsOptions): Observable<HttpEvent<Blob>>;\n public patch (url: string, body: unknown, options: PatchBlobResponseOptions): Observable<HttpResponse<Blob>>;\n public patch (url: string, body: unknown, options: PatchTextOptions): Observable<string>;\n public patch (url: string, body: unknown, options: PatchTextEventsOptions): Observable<HttpEvent<string>>;\n public patch (url: string, body: unknown, options: PatchTextResponseOptions): Observable<HttpResponse<string>>;\n public patch (url: string, body: unknown, options?: PatchJsonOptions | undefined): Observable<object>;\n public patch (url: string, body: unknown, options: PatchJsonEventsOptions): Observable<HttpEvent<object>>;\n public patch (url: string, body: unknown, options: PatchJsonResponseOptions): Observable<HttpResponse<object>>;\n public patch<T> (url: string, body: unknown, options?: PatchJsonTypedOptions<T> | undefined): Observable<T>;\n public patch<T> (url: string, body: unknown, options: PatchJsonEventsTypedOptions<T>): Observable<HttpEvent<T>>;\n public patch<T> (url: string, body: unknown, options: PatchJsonResponseTypedOptions<T>): Observable<HttpResponse<T>>;\n public patch<T> (url: string, body: unknown, options?: any): Observable<ArrayBuffer | object | Blob | string | T > | Observable<HttpEvent<ArrayBuffer | object | Blob | string | T>> | Observable<HttpResponse<ArrayBuffer | object | Blob | string | T>> {\n return this.http.patch(url, body, options).pipe(\n tap(generateHandler<T>(options)),\n catchError(handleDecodeError)\n );\n }\n public post (url: string, body: any, options: PostArrayBufferOptions): Observable<ArrayBuffer>;\n public post (url: string, body: any, options: PostArrayBufferEventsOptions): Observable<HttpEvent<ArrayBuffer>>;\n public post (url: string, body: any, options: PostArrayBufferResponseOptions): Observable<HttpResponse<ArrayBuffer>>;\n public post (url: string, body: any, options: PostBlobOptions): Observable<Blob>;\n public post (url: string, body: any, options: PostBlobEventsOptions): Observable<HttpEvent<Blob>>;\n public post (url: string, body: any, options: PostBlobResponseOptions): Observable<HttpResponse<Blob>>;\n public post (url: string, body: any, options: PostTextOptions): Observable<string>;\n public post (url: string, body: any, options: PostTextEventsOptions): Observable<HttpEvent<string>>;\n public post (url: string, body: any, options: PostTextResponseOptions): Observable<HttpResponse<string>>;\n public post (url: string, body: any, options?: PostJsonOptions | undefined): Observable<object>;\n public post (url: string, body: any, options: PostJsonEventsOptions): Observable<HttpEvent<object>>;\n public post (url: string, body: any, options: PostJsonResponseOptions): Observable<HttpResponse<object>>;\n public post<T> (url: string, body: any, options?: PostJsonTypedOptions<T> | undefined): Observable<T>;\n public post<T> (url: string, body: any, options: PostJsonEventsTypedOptions<T>): Observable<HttpEvent<T>>;\n public post<T> (url: string, body: any, options: PostJsonResponseTypedOptions<T>): Observable<HttpResponse<T>>;\n public post<T> (url: string, body: any, options?: any): Observable<ArrayBuffer | object | Blob | string | T > | Observable<HttpEvent<ArrayBuffer | object | Blob | string | T>> | Observable<HttpResponse<ArrayBuffer | object | Blob | string | T>> {\n return this.http.post(url, body, options).pipe(\n tap(generateHandler<T>(options)),\n catchError(handleDecodeError)\n );\n }\n\n public put (url: string, body: any, options: PutArrayBufferOptions): Observable<ArrayBuffer>;\n public put (url: string, body: any, options: PutArrayBufferEventsOptions): Observable<HttpEvent<ArrayBuffer>>;\n public put (url: string, body: any, options: PutArrayBufferResponseOptions): Observable<HttpResponse<ArrayBuffer>>;\n public put (url: string, body: any, options: PutBlobOptions): Observable<Blob>;\n public put (url: string, body: any, options: PutBlobEventsOptions): Observable<HttpEvent<Blob>>;\n public put (url: string, body: any, options: PutBlobResponseOptions): Observable<HttpResponse<Blob>>;\n public put (url: string, body: any, options: PutTextOptions): Observable<string>;\n public put (url: string, body: any, options: PutTextEventsOptions): Observable<HttpEvent<string>>;\n public put (url: string, body: any, options: PutTextResponseOptions): Observable<HttpResponse<string>>;\n public put (url: string, body: any, options?: PutJsonOptions | undefined): Observable<object>;\n public put (url: string, body: any, options: PutJsonEventsOptions): Observable<HttpEvent<object>>;\n public put (url: string, body: any, options: PutJsonResponseOptions): Observable<HttpResponse<object>>;\n public put<T> (url: string, body: any, options?: PutJsonTypedOptions<T> | undefined): Observable<T>;\n public put<T> (url: string, body: any, options: PutJsonEventsTypedOptions<T>): Observable<HttpEvent<T>>;\n public put<T> (url: string, body: any, options: PutJsonResponseTypedOptions<T>): Observable<HttpResponse<T>>; \n public put<T> (url: string, body: any, options?: any): Observable<ArrayBuffer | object | Blob | string | T > | Observable<HttpEvent<ArrayBuffer | object | Blob | string | T>> | Observable<HttpResponse<ArrayBuffer | string | object | Blob | T>> {\n return this.http.put(url, body, options).pipe(\n tap(generateHandler<T>(options)),\n catchError(handleDecodeError)\n );\n }\n}\n\nfunction generateHandler<R>(options: any = {}): (response: ArrayBuffer | string | object | R | HttpEvent<ArrayBuffer | string | object | R> | HttpResponse<ArrayBuffer | string | object | R>) => void {\n const { runtimeType, observe = 'body', responseType = 'json' } = options;\n return (response: ArrayBuffer | string | object | R | HttpEvent<ArrayBuffer | string | object | R> | HttpResponse<ArrayBuffer | string | object | R>) => {\n if (responseType === 'json' && runtimeType instanceof iots.Type) {\n let resultValue: R | null = null;\n if (observe === 'body') {\n resultValue = response as R;\n } else if (observe === 'response') {\n resultValue = (response as HttpResponse<any>).body as R;\n } else if (observe === 'events' && (response as HttpEvent<R>).type === HttpEventType.Response) {\n resultValue = (response as HttpResponse<R>).body! as R;\n }\n if (resultValue === null) {\n return;\n }\n const result = runtimeType.decode(resultValue);\n if (result._tag === IOTS_RESULT_TAG_LEFT) {\n throw new TypeError(generateCustomTypeErrorMessage(\n runtimeType.name,\n response,\n result.left\n ));\n }\n }\n };\n}\n\nfunction generateCustomTypeErrorMessage(runtimeTypeName: string, response: unknown, errors: iots.Errors) {\n return `Type '${ runtimeTypeName }' decode mismatch.\\n` +\n '\\tUnable to decode following value:\\n' +\n `\\t${ JSON.stringify(response) }\\n\\n` +\n '\\tFollowing errors were found:\\n' +\n `${ errors.map(\n (error) => `${\n error.context\n .filter((context) => context.key !== '')\n .map((context) => `\\t\\t${ context.key }: ${ context.type.name } -> ${ context.actual }`)\n .join('\\n')\n }`\n ).join('\\n') }`;\n}\n\nfunction handleDecodeError(error: TypeError) {\n return throwError(() => error);\n}\n","import { Provider } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { TypesafeHttpService } from './typesafe-http.service';\n\nexport function provideTypesafeHttp(): Provider {\n return {\n provide: TypesafeHttpService,\n useClass: TypesafeHttpService,\n deps: [HttpClient],\n };\n}\n","/*\n * Public API Surface of typesafe-http-iots\n */\n\nexport * from './lib/typesafe-http.service';\nexport * from './lib/provide.util';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}