{"version":3,"file":"bootkit-ng1-http.mjs","sources":["../../../projects/ng1/http/provide.ts","../../../projects/ng1/http/to-form-data.ts","../../../projects/ng1/http/http.service.ts","../../../projects/ng1/http/types.ts","../../../projects/ng1/http/data-request-resolvers/http-data-request-resolver-1.ts","../../../projects/ng1/http/bootkit-ng1-http.ts"],"sourcesContent":["import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders, Provider } from \"@angular/core\";\nimport { HttpDataRequestResolver } from \"./types\";\nimport { HttpService } from \"./http.service\";\n\nexport const HTTP_SERVICE_CONFIG = new InjectionToken<HttpServiceConfig>('HttpServiceConfig');\n\n/**\n * Configuration for the HttpService.\n */\nexport interface HttpServiceConfig {\n    /**\n     * Base URL for the HTTP requests.\n     * This is prepended to all request URLs.\n     */\n    baseUrl?: string;\n\n    /**\n     * A Resolver function to convert DataRequest to DataResult.\n     */\n    dataRequestResolver?: HttpDataRequestResolver;\n}\n\nexport interface HttpServiceFeature { \n     ɵproviders: Array<Provider | EnvironmentProviders>;\n}\n\n/**\n * Provides the configuration for the HttpService.\n * @param config \n * @returns \n */\nexport function provideHttpService(config?: HttpServiceConfig, ...features: Partial<HttpServiceFeature>[]) {\n    // const mergedfeatures = Object.assign({}, ...features);\n    return makeEnvironmentProviders([\n        HttpService,\n        { provide: HTTP_SERVICE_CONFIG, useValue: config || {} },\n        features.map((feature) => feature.ɵproviders),\n    ]);\n}\n","/**\n * Utility function to create FormData from an object.\n * The function iterates over the properties of the input object and appends them to a FormData instance.\n * It handles string, File, Blob, number, and nested object types. For nested objects, it stringifies them before appending.\n * This function is useful for preparing data to be sent in a multipart/form-data request, \n * especially when dealing with file uploads and complex data structures.\n * @example\n * const data = {\n *   name: 'John Doe',\n *   age: 30,\n *   profilePicture: fileInput.files[0],\n *   preferences: { theme: 'dark', notifications: true }\n * };\n * const formData = toFormData(data);\n * // formData can now be sent in an HTTP request with content type 'multipart/form-data'.\n * @param data The input object containing the data to be converted into FormData. The properties of this object can be of type string, number, File, Blob, or nested objects.\n * @returns The FormData instance containing the data from the input object.\n */\nexport function toFormData(data: any): FormData {\n    const formData = new FormData();\n    for (const key in data) {\n        if (data.hasOwnProperty(key)) {\n            const field = data[key];\n            let value;\n\n            if (typeof field === 'string' || field instanceof File || field instanceof Blob) {\n                value = field;\n            } else if (typeof field === 'number') {\n                value = field.toString();\n            } else if (typeof field === 'object') {\n                value = JSON.stringify(field);\n            }\n\n            if (value) {\n                formData.append(key, value);\n            }\n        }\n    }\n\n    return formData;\n}","import { HttpClient, HttpEvent, HttpEventType, HttpHeaders } from '@angular/common/http';\nimport { Observable, of, Subject, tap } from 'rxjs';\nimport { HttpRequestOptions, HttpRequestEvent } from './types';\nimport { inject, Inject, Injectable, Injector, makeStateKey, PLATFORM_ID, runInInjectionContext, TransferState } from '@angular/core';\nimport { isPlatformServer } from '@angular/common';\nimport { DataRequest, DataResult } from '@bootkit/ng1/data';\nimport { HTTP_SERVICE_CONFIG } from './provide';\nimport { toFormData } from './to-form-data';\n\n/**\n * HttpService provides a simple HTTP client for making requests.\n * It supports GET, POST, PUT, DELETE methods and can handle DataRequest objects.\n * It also supports transfer state for server-side rendering.\n * It emits events for request lifecycle: Send, Progress, Complete and Error.\n * It can be configured with a base URL and a default DataRequest resolver.\n * It can also handle multipart/form-data requests.\n */\n@Injectable()\nexport class HttpService {\n  private readonly _config = inject(HTTP_SERVICE_CONFIG);\n  private readonly _http = inject(HttpClient);\n  private readonly _transferState = inject(TransferState);\n  private readonly _injector = inject(Injector);\n  private readonly _platformId: Object = inject(PLATFORM_ID);\n  private readonly _eventsSubject = new Subject<HttpRequestEvent>();\n  private _baseUrl?: string;\n\n  public readonly events = this._eventsSubject.asObservable();\n  public defaultHeaders?: HttpHeaders;\n\n  constructor() {\n    this._baseUrl = this._config.baseUrl ?? '';\n  }\n\n  /**\n   * Sends a GET request to the specified URL.\n   * @param url The URL to send the request to.\n   * @param options The options for the request.\n   * @returns An observable of the response.\n   */\n  public get<T>(url: string, options?: HttpRequestOptions): Observable<T> {\n    this._verifyOptions(options);\n    const transferStateData = this._findInTransferState<T>(options);\n    if (transferStateData.found) {\n      return of(transferStateData.data!);\n    }\n\n    this._eventsSubject.next({ type: 'Send', url, options });\n    let obs = this._http.get<T>(this._makeUrl(url, options), options as any).pipe(\n      tap(result => {\n        if (isPlatformServer(this._platformId) && options?.transferState) {\n          const key = makeStateKey<T>(options.id);\n          this._transferState.set(key, result as T);\n        }\n      })\n    );\n    return this._handleEvents<T>(obs, url, options);\n  }\n\n\n  /**\n   * Sends a DataRequest to the specified URL and returns a DataResult.\n   * This method is used for paginated or filtered data requests.\n   * It uses the configured DataRequestResolver to handle the request. \n   * @param url The URL to send the request to.\n   * @param request The DataRequest object containing the request parameters.\n   * @param options The options for the request.\n   * @returns An observable of DataResult<T>.\n   */\n  public getDataResult<T>(url: string, request: DataRequest, options?: HttpRequestOptions): Observable<DataResult<T>> {\n    this._verifyOptions(options);\n    const transferStateData = this._findInTransferState<DataResult<T>>(options);\n    if (transferStateData.found) {\n      return of(transferStateData.data!);\n    }\n\n    this._eventsSubject.next({ type: 'Send', url, options });\n    let resolver = this._config.dataRequestResolver;\n    if (!resolver) {\n      throw new Error('No HttpDataRequestResolver provided.');\n    }\n\n    const URL = this._makeUrl(url, options);\n    let obs = runInInjectionContext<Observable<DataResult<T>>>(this._injector, resolver.bind(null, URL, request, options));\n    if (!(obs instanceof Observable)) {\n      throw Error('HttpDataRequestResolver should return an observable.');\n    }\n\n    return this._handleEvents(obs, url, options);\n  }\n\n  /**\n   * Sends a POST request to the specified URL with the given body.\n   * @param url The URL to send the request to.\n   * @param body The body of the request.\n   * @param options The options for the request.\n   * @returns An observable of the response.\n   */\n  public post<T>(url: string, body: any, options?: HttpRequestOptions): Observable<T> {\n    this._verifyOptions(options);\n    this._eventsSubject.next({ type: 'Send', url, options });\n    const BODY = this._makeBody(body, options);\n    let obs = this._http.post(this._makeUrl(url, options), BODY, options as any) as Observable<T>;\n    return this._handleEvents<T>(obs, url, options);\n  }\n\n  /**\n   * Sends a PUT request to the specified URL with the given body.\n   * @param url The URL to send the request to.\n   * @param body The body of the request.\n   * @param options The options for the request.\n   * @returns An observable of the response.\n   */\n  public put<T>(url: string, body: any, options?: HttpRequestOptions): Observable<T> {\n    this._verifyOptions(options);\n    this._eventsSubject.next({ type: 'Send', url, options });\n    const BODY = this._makeBody(body, options);\n    let obs = this._http.put(this._makeUrl(url, options), BODY, options as any) as Observable<T>;\n    return this._handleEvents<T>(obs, url, options);\n  }\n\n  /**\n   * Sends a DELETE request to the specified URL.\n   * @param url The URL to send the request to.\n   * @param options The options for the request.\n   * @returns An observable of the response.\n   */\n  public delete<T>(url: string, options?: HttpRequestOptions): Observable<T> {\n    this._verifyOptions(options);\n    this._eventsSubject.next({ type: 'Send', url, options });\n    let obs = this._http.delete(this._makeUrl(url, options), options as any)\n    return this._handleEvents<T>(obs, url, options);\n  }\n\n  private _makeUrl(url: string, options?: HttpRequestOptions) {\n    return (options?.pathType === 'absolute') ? url : (this._baseUrl + url);\n  }\n\n  private _makeBody(body: any, options?: HttpRequestOptions) {\n    return options?.contentType === 'multipart/form-data' ? toFormData(body) : body;\n  }\n\n  private _handleEvents<T>(o: Observable<any>, url: string, options?: HttpRequestOptions): Observable<T> {\n    return o.pipe(\n      tap({\n        next: (e: any) => {\n          if (options?.observe === 'events') {\n            if (e?.type === HttpEventType.DownloadProgress || e?.type === HttpEventType.UploadProgress) {\n              this._eventsSubject.next({ type: 'Progress', url, options });\n            } else {\n              this._eventsSubject.next({ type: 'Complete', url, options, response: e });\n            }\n          } else {\n            this._eventsSubject.next({ type: 'Complete', url, options, response: e });\n          }\n        },\n        error: e => {\n          this._eventsSubject.next({ type: 'Error', url, options, error: e });\n        }\n      })\n    )\n  }\n\n  private _verifyOptions(options?: HttpRequestOptions) {\n    if (options?.transferState) {\n      if (!options.id) {\n        throw Error('To use transferState, set request id')\n      }\n\n      if (options.observe == 'events' || options.observe == 'response') {\n        throw Error('TransferState is only supported with observe \"body\".');\n      }\n    }\n  }\n\n  private _findInTransferState<T>(options?: HttpRequestOptions): { found: boolean, data: T | undefined } {\n    if (!options?.transferState || isPlatformServer(this._platformId)) {\n      return { found: false, data: undefined };\n    }\n\n    const key = makeStateKey<T>(options.id);\n    if (this._transferState.hasKey(key)) {\n      const data = this._transferState.get<T>(key, null!);\n      if ((options.transferState as any)?.['clearAfterUse']) {\n        this._transferState.remove(key); // Free memory\n      }\n\n      return { found: true, data: data };\n    }\n\n    return { found: false, data: undefined };\n  }\n}\n","import { HttpClient, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { DataRequest, DataResult } from '@bootkit/ng1/data';\nimport { Observable } from 'rxjs';\n\nexport interface HttpRequestOptions {\n    /** Http request ID */\n    id?: any;\n    params?: HttpParams | Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n    headers?: HttpHeaders | Record<string, string | string[]>;\n    pathType?: 'relative' | 'absolute';\n    responseType?: 'json' | 'blob' | 'text';\n    contentType?: 'json' | 'multipart/form-data';\n    reportProgress?: boolean;\n    observe?: 'response' | 'body' | 'events';\n\n    /**\n     * Additional data to associate with this object.\n     */\n    tag?: Record<string, string | number | boolean | ReadonlyArray<string | number | boolean>>;\n\n    /** \n     * Save response in transfer state \n     * \n     */\n    transferState?: boolean | {\n        /**\n         * Clear transfer state after first read.\n         */\n        clearAfterUse?: boolean;\n    };\n}\n\n/**\n * HttpDataRequestResolver is a function that takes a URL, a DataRequest, and options,\n * and returns an Observable that emits a DataResult.\n * This is used to convert a DataRequest into query parameters or request body for an HTTP request.\n * @param url The URL to send the request to.\n * @param dataRequest The DataRequest to convert.\n * @param options Additional options for the request, such as headers.\n */\nexport type HttpDataRequestResolver<T = any> = (url: string, dataRequest: DataRequest, options?: HttpRequestOptions) => Observable<DataResult<T>>;\n\nexport interface HttpRequestEventBase {\n    type: 'Send' | 'Complete' | 'Progress' | 'Error';\n    url: string;\n    options?: HttpRequestOptions\n}\n\nexport interface HttpRequestSendEvent extends HttpRequestEventBase {\n    type: 'Send';\n}\n\nexport interface HttpRequestCompleteEvent extends HttpRequestEventBase {\n    type: 'Complete';\n    response?: any;\n}\n\nexport interface HttpRequestProgressEvent extends HttpRequestEventBase {\n    type: 'Progress';\n}\n\nexport interface HttpRequestErrorEvent extends HttpRequestEventBase {\n    type: 'Error';\n    error: any;\n}\n\nexport type HttpRequestEvent = HttpRequestSendEvent | HttpRequestCompleteEvent | HttpRequestProgressEvent | HttpRequestErrorEvent;\n\n/**\n * HttpDataRequestWriter is a function that takes an HTTP request and a DataRequest\n * and writes the DataRequest parameters to the HTTP request.\n * This is used to convert a DataRequest into query parameters or request body.\n * @param url The URL to send the request to.\n * @param dataRequest The DataRequest to convert.\n * @param httpClient The HttpClient to use for the request.\n * @param options Additional options for the request, such as headers.\n * @template T data item type\n * @returns An Observable that emits the DataResult.\n */\n","import { DataRequest, DataResult } from \"@bootkit/ng1/data\";\nimport { HttpRequestOptions } from \"../types\";\nimport { map, Observable } from \"rxjs\";\nimport { HttpClient } from \"@angular/common/http\";\nimport { inject } from \"@angular/core\";\n\n/**\n * Default implementation of httpDataRequestResolver1.\n * It adds DataRequest parameters as query string to the HTTP request.\n * @param url \n * @param dataRequest \n * @param options\n * @template T data item type\n * @returns \n */\nexport function httpDataRequestResolver1<T = any>(\n    url: string,\n    dataRequest: DataRequest,\n    options?: HttpRequestOptions): Observable<DataResult<T>> {\n    var query: Record<string, any> = {};\n\n    const httpClient = inject(HttpClient);\n\n    if (dataRequest.page) {\n        query['page[size]'] = dataRequest.page.size;\n        query['page[index]'] = dataRequest.page.index;\n    }\n\n    if (dataRequest.sort) {\n        query['sort[field]'] = dataRequest.sort.field;\n        query['sort[asc]'] = dataRequest.sort.asc;\n    }\n\n    if (Array.isArray(dataRequest.filters)) {\n        for (let i = 0; i < dataRequest.filters.length; i++) {\n            const filter = dataRequest.filters[i];\n            query[`filters[${i}].field`] = filter.field;\n            query[`filters[${i}].operator`] = filter.operator;\n            query[`filters[${i}].value`] = filter.value;\n        }\n    }\n\n    if (typeof dataRequest.computeTotal == 'boolean') {\n        query['computeTotal'] = dataRequest.computeTotal;\n    }\n\n    return httpClient.get<{ data: T[], total?: number }>(url, {\n        params: query,\n        headers: options?.headers,\n    }).pipe(\n        map(result => {\n            return new DataResult<T>(result.data, result.total)\n        })\n    );\n}\n\n// /**\n//  * Provides httpDataRequestResolver1.\n//  * This is used to convert a DataRequest into query parameters for the HTTP (GET) request.\n//  * @returns \n//  */\n// export function withHttpDataRequestResolver1(): HttpServiceFeature {\n//     return {\n//         ɵproviders: [\n//             { provide: DEFAULT_DATA_REQUEST_RESOLVER, useValue: HttpDataRequestResolver1 }\n//         ]\n//     };\n// }","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}