{"version":3,"file":"spinque-angular-ui.mjs","sources":["../../../projects/spinque-angular-ui/src/spinque-angular-ui.module.ts","../../../projects/spinque-angular-ui/src/api.service.ts","../../../projects/spinque-angular-ui/src/infer-type.directive.ts","../../../projects/spinque-angular-ui/src/spinque-angular-ui.ts"],"sourcesContent":["import { provideHttpClient, withInterceptorsFromDi, withXhr } from '@angular/common/http';\nimport { InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';\nimport { ApiConfig } from '@spinque/query-api';\n\nexport const ApiConfigValue = new InjectionToken<ApiConfig>('ApiConfig');\n\n/**\n * Main module of @spinque/angular-ui. Import with forRoot and pass an ApiConfig object.\n */\n@NgModule({ declarations: [], imports: [], providers: [provideHttpClient(withXhr(), withInterceptorsFromDi())] })\nexport class SpinqueAngularUIModule {\n\n  static forRoot(config: ApiConfig): ModuleWithProviders<SpinqueAngularUIModule> {\n    return {\n      ngModule: SpinqueAngularUIModule,\n      providers: [\n        {\n          provide: ApiConfigValue,\n          useValue: config,\n        },\n      ],\n    };\n  }\n}","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { combineLatest, Observable, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\n\nimport {\n  ApiConfig,\n  Query,\n  RequestOptions,\n  RequestType,\n  TupleTypes,\n  ResultsResponse,\n  StatisticsResponse,\n  urlFromQueries,\n} from '@spinque/query-api';\n\nimport { ApiConfigValue } from './spinque-angular-ui.module';\n\n/**\n * Function that will be called before making requests to the Spinque Query API.\n * Arguments passed are `queryStack`, `operation` and `options`.\n *\n * The function must return a RequestEnrichment, containing params, headers or other\n * options that will be added to the request made.\n */\nexport type RequestEnrichmentFunc = (\n  queryStack: Query | Query[],\n  operation: RequestType,\n  options: { [name: string]: any },\n) => Observable<RequestEnrichment>;\n\n/**\n * Params, headers or other options to be added to a request.\n */\nexport interface RequestEnrichment {\n  params?: HttpParams | { [key: string]: any };\n  headers?: { ['Authorization']: string };\n  withCredentials?: boolean;\n}\n\n/**\n * Service to make requests to the Spinque Query API with.\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class SpinqueApiService {\n  private requestEnrichtmentFuncs: RequestEnrichmentFunc[] = [];\n\n  constructor(@Inject(ApiConfigValue) private config: ApiConfig, private http: HttpClient) {}\n\n  /**\n   * Get the results of a query.\n   */\n  getResults<T = TupleTypes[]>(\n    queries: Query | Query[],\n    options: RequestOptions = {},\n    config: ApiConfig = {},\n  ): Observable<ResultsResponse<T>> {\n    return this.fetch<ResultsResponse<T>>(queries, options, RequestType.Results, config);\n  }\n\n  getResultPage<T = TupleTypes[]>(\n    queries: Query | Query[],\n    options: RequestOptions = {},\n    config: ApiConfig = {},\n  ): Observable<ResultsResponse<T>> {\n    return this.fetch<ResultsResponse<T>>(queries, options, RequestType.ResultPage, config);\n  }\n\n  /**\n   * Get the statistics of a query.\n   */\n  getStatistics(\n    queries: Query | Query[],\n    options: RequestOptions = {},\n    config: ApiConfig = {},\n  ): Observable<StatisticsResponse> {\n    return this.fetch<StatisticsResponse>(queries, options, RequestType.Statistics, config);\n  }\n\n  /**\n   * Registers a function that is executed every time a request to the Spinque Query API\n   * is made and can add params, header and other options to the request.\n   */\n  addRequestEnrichment(func: RequestEnrichmentFunc): void {\n    this.requestEnrichtmentFuncs.push(func);\n  }\n\n  /**\n   * Underlies getResults and getStatistics\n   */\n  private fetch<T = ResultsResponse | StatisticsResponse>(\n    queries: Query | Query[],\n    options: RequestOptions,\n    requestType: RequestType,\n    config: ApiConfig = {},\n  ): Observable<T> {\n    // Convert single query to array of queries\n    if (!(queries instanceof Array)) {\n      queries = [queries];\n    }\n    if (queries.length === 0) {\n      throw new Error('Queries array is empty');\n    }\n\n    // Use the config object passed to SpinqueAngularUIModule as base and overwrite\n    // with the config object passed to fetch.\n    const _config: ApiConfig = { ...this.config, ...config };\n\n    // Use tools from @spinque/query-api to construct an URL from Query objects\n    const fullUrl = urlFromQueries(_config, queries, options, requestType);\n\n    // Split URL into params for use with Angular's HTTP lib\n    const url = fullUrl.split('?')[0];\n    const params =\n      fullUrl.split('?').length > 1\n        ? fullUrl\n            .split('?')\n            .slice(1)\n            .join('?')\n            .split('&')\n            .reduce((acc: any, cur: string) => ({ ...acc, [cur.split('=')[0]]: cur.split('=')[1] }), {})\n        : {};\n\n    // Add possible registered enrichments to the request\n    let enrichment$: Observable<RequestEnrichment>;\n    if (this.requestEnrichtmentFuncs?.length > 0) {\n      enrichment$ = combineLatest(\n        // Execute any functions that may have registered.  Currently only @spinque/angular-ui/auth registers one\n        // but external functions are also possible.\n        this.requestEnrichtmentFuncs.map((fn) => fn(queries, requestType, options)),\n      ).pipe(map((results) => results.reduce((acc, cur) => ({ ...acc, ...cur }), {})));\n    } else {\n      enrichment$ = of({});\n    }\n\n    return enrichment$.pipe(switchMap((enrichment) => this.http.get<T>(url, { params, ...enrichment })));\n  }\n}\n","import { Directive, Input } from \"@angular/core\";\n\nexport interface ImplicitTemplateVariableFromItemMapping<T> {\n  $implicit: T;\n  inferTypeFrom: (item: any) => T;\n}\n\n@Directive({\n  selector: 'ng-template[inferTypeFrom]',\n  standalone: true,\n})\nexport class InferTypeFromMappingForTemplateDirective<T> {\n  @Input({\n    alias: 'inferTypeFrom',\n    required: true\n  }) itemMapping!: (item: any) => T;\n\n  static ngTemplateContextGuard<TContext>(\n    _: InferTypeFromMappingForTemplateDirective<TContext>,\n    ctx: unknown\n  ): ctx is ImplicitTemplateVariableFromItemMapping<TContext> {\n    return true;\n  }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}