{"version":3,"file":"my-http-resource.mjs","sources":["../../../projects/my-http-resource/src/lib/model/reactive.http.model.ts","../../../projects/my-http-resource/src/lib/model/params.model.ts","../../../projects/my-http-resource/src/lib/services/my.http.service.ts","../../../projects/my-http-resource/src/lib/utils/index.ts","../../../projects/my-http-resource/src/my-http-resource.ts"],"sourcesContent":["import { signal, WritableSignal } from '@angular/core';\r\n\r\nexport class ReactiveHttpModel<T> {\r\n  public value: WritableSignal<T> = signal(null);\r\n  public loading: WritableSignal<boolean> = signal(false);\r\n  public error: WritableSignal<any> = signal(null);\r\n\r\n  constructor(initialValue?: T) {\r\n    if (initialValue) {\r\n      this.value.set(initialValue);\r\n    }\r\n  }\r\n}\r\n","import { IRequest } from '../interfaces';\r\nimport { TOptionsData } from '../types';\r\nimport { HttpHeaders } from '@angular/common/http';\r\n\r\nexport class ParamsModel<T> {\r\n  public body: TOptionsData['body'] = {}\r\n  public params: TOptionsData['params'] = {}\r\n  public headers: TOptionsData['headers'] = {}\r\n\r\n  constructor(data?: IRequest<T>) {\r\n    if ('queryParams' in data) this.params = data.queryParams;\r\n    if ('body' in data) this.body = data.body;\r\n    if ('headers' in data) this.headers = new HttpHeaders(data.headers);\r\n  }\r\n}\r\n","import { DestroyRef, inject } from '@angular/core';\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport {IWithOutBody, IHttpResource, IWithBody, IRequest, IWithOutBodyDelete} from '../interfaces';\r\nimport { ReactiveHttpModel} from '../model/reactive.http.model';\r\nimport {\r\n  Delete,\r\n  Get,\r\n  Patch,\r\n  Post,\r\n  Put,\r\n  TMethod,\r\n  TMethodWithoutBody,\r\n  TMethodFnWithBody,\r\n  TOptionsData,\r\n  TResult,\r\n  TUrlParams, TypeMethod\r\n} from '../types';\r\nimport { ParamsModel } from '../model/params.model';\r\n\r\nexport class MyHttpService {\r\n  private http: HttpClient = inject(HttpClient);\r\n  private destroyRef: DestroyRef = inject(DestroyRef);\r\n\r\n  private getAfterActions<T>(reactiveData: ReactiveHttpModel<T>, data: IRequest<T>): TResult<T> {\r\n    return {\r\n      next: (result: T): void => {\r\n        const value: T = data.mergeValues\r\n          ? this.mergeResult(result, reactiveData.value())\r\n          : result\r\n\r\n        reactiveData.value.set(value);\r\n\r\n        if (data.afterSuccess) data.afterSuccess(value);\r\n\r\n        reactiveData.loading.set(false);\r\n      },\r\n      error: (error: HttpErrorResponse) => {\r\n        reactiveData.error.set(error)\r\n\r\n        if (data.afterError) data.afterError(error);\r\n\r\n        reactiveData.loading.set(false);\r\n      },\r\n    }\r\n  }\r\n\r\n  private mergeResult<T>(result: T, currentValue: T): T {\r\n    if (!result || !currentValue || typeof result !== typeof currentValue ) {\r\n      return result;\r\n    }\r\n\r\n    if (Array.isArray(result) && Array.isArray(currentValue)) {\r\n      return [...currentValue, ...result] as T;\r\n    }\r\n\r\n    if (\r\n      typeof result === 'object' &&\r\n      typeof currentValue === 'object' &&\r\n      !Array.isArray(result) &&\r\n      !Array.isArray(currentValue)\r\n    ) {\r\n      return {...currentValue, ...result};\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  private createUrl(url: string, urlParams: TUrlParams): string {\r\n    return url.replace(/{{(.*?)}}/g, (_, key) => {\r\n      const trimmedKey: string = key.trim();\r\n      const value: string | number = urlParams?.[trimmedKey];\r\n\r\n      if (value === undefined) {\r\n        throw new Error(`Missing value for URL parameter: ${trimmedKey}`);\r\n      }\r\n\r\n      return encodeURIComponent(value);\r\n    });\r\n  }\r\n\r\n  private createConfigForWithOutBody(paramsModel: Partial<TOptionsData>): any {\r\n    const config: Partial<TOptionsData> = {\r\n      params: paramsModel.params,\r\n      headers: paramsModel.headers\r\n    }\r\n\r\n    if (Object.keys(paramsModel.body).length > 0) {\r\n      config.body = paramsModel.body;\r\n    }\r\n\r\n    return config;\r\n  }\r\n\r\n  private getHttp<T>(method: TMethod, data: IRequest<T>): Observable<T> {\r\n    const url: string = this.createUrl(data.url, data.urlParams);\r\n    const paramsModel: Partial<TOptionsData> = new ParamsModel(data);\r\n    const { body, headers }: Partial<TOptionsData> = paramsModel;\r\n    const isWithoutBody: boolean = ['get', 'delete'].includes(method);\r\n\r\n    const request$: Observable<T> = isWithoutBody\r\n      ? (this.http[method] as TMethodWithoutBody<T>)(url, this.createConfigForWithOutBody(paramsModel))\r\n      : (this.http[method] as TMethodFnWithBody<T>)(url, body, { headers });\r\n\r\n    const baseRequest: Observable<T> = request$.pipe(takeUntilDestroyed(this.destroyRef));\r\n\r\n    return data.pipe ? baseRequest.pipe(data.pipe) : baseRequest;\r\n  }\r\n\r\n  public get<T = any>(data: IWithOutBody<T>): IHttpResource<Get, T> {\r\n    return this.createResource<T, IWithOutBody<T>, Get>(data, 'get');\r\n  }\r\n\r\n  public delete<T = any>(data: IWithOutBodyDelete<T>): IHttpResource<Delete, T> {\r\n    return this.createResource<T, IWithOutBodyDelete<T>, Delete>(data, 'delete');\r\n  }\r\n\r\n  public post<T = any>(data: IWithBody<T>): IHttpResource<Post, T> {\r\n    return this.createResource<T, IWithBody<T>, Post>(data, 'post');\r\n  }\r\n\r\n  public patch<T = any>(data: IWithBody<T>): IHttpResource<Patch, T> {\r\n    return this.createResource<T, IWithBody<T>, Patch>(data, 'patch');\r\n  }\r\n\r\n  public put<T = any>(data: IWithBody<T>): IHttpResource<Put, T> {\r\n    return this.createResource<T, IWithBody<T>, Put>(data, 'put');\r\n  }\r\n\r\n  private createResource<T, Req extends IRequest<T>, Method extends TypeMethod>(\r\n    data: Req,\r\n    method: TMethod,\r\n  ): IHttpResource<Method, T> {\r\n    const reactiveData: ReactiveHttpModel<T> = new ReactiveHttpModel(data.initialValue);\r\n\r\n    if (!data.manual) {\r\n      reactiveData.loading.set(true);\r\n\r\n      this.getHttp(method, data).subscribe(\r\n        this.getAfterActions(reactiveData, data)\r\n      );\r\n    }\r\n\r\n    return {\r\n      value: reactiveData.value,\r\n      error: reactiveData.error,\r\n      loading: reactiveData.loading.asReadonly(),\r\n      request$: (fetchData: Method) => {\r\n        return this.getHttp(method, {...data, ...fetchData})\r\n      } ,\r\n      fetch: (fetchData: Method) => {\r\n        reactiveData.loading.set(true);\r\n\r\n        const mergedData: Req & Method = {  ...data, ...fetchData };\r\n\r\n        this.getHttp(method, mergedData).subscribe(\r\n          this.getAfterActions(reactiveData, mergedData)\r\n        );\r\n      }\r\n    }\r\n  }\r\n}\r\n","import { MyHttpService } from '../services/my.http.service';\r\n\r\nexport function myHttpResource(): MyHttpService {\r\n  return new MyHttpService();\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}