{"version":3,"file":"lagoshny-ngx-hateoas-client.mjs","sources":["../../../projects/ngx-hateoas-client/src/lib/util/dependency-injector.ts","../../../projects/ngx-hateoas-client/src/lib/config/hateoas-configuration.interface.ts","../../../projects/ngx-hateoas-client/src/lib/model/declarations.ts","../../../projects/ngx-hateoas-client/src/lib/config/lib-config.ts","../../../projects/ngx-hateoas-client/src/lib/logger/console-logger.ts","../../../projects/ngx-hateoas-client/src/lib/model/resource-type.ts","../../../projects/ngx-hateoas-client/src/lib/logger/stage.enum.ts","../../../projects/ngx-hateoas-client/src/lib/logger/stage-logger.ts","../../../projects/ngx-hateoas-client/src/lib/util/validation.utils.ts","../../../projects/ngx-hateoas-client/src/lib/util/url.utils.ts","../../../projects/ngx-hateoas-client/src/lib/util/resource.utils.ts","../../../projects/ngx-hateoas-client/src/lib/service/internal/cache/model/cache-key.ts","../../../projects/ngx-hateoas-client/src/lib/util/cache.utils.ts","../../../projects/ngx-hateoas-client/src/lib/service/http-executor.ts","../../../projects/ngx-hateoas-client/src/lib/service/internal/cache/model/cached-resource.ts","../../../projects/ngx-hateoas-client/src/lib/service/internal/cache/resource-cache.service.ts","../../../projects/ngx-hateoas-client/src/lib/service/internal/resource-http.service.ts","../../../projects/ngx-hateoas-client/src/lib/model/resource/abstract-resource.ts","../../../projects/ngx-hateoas-client/src/lib/service/internal/resource-collection-http.service.ts","../../../projects/ngx-hateoas-client/src/lib/service/internal/paged-resource-collection-http.service.ts","../../../projects/ngx-hateoas-client/src/lib/model/resource/base-resource.ts","../../../projects/ngx-hateoas-client/src/lib/model/resource/resource.ts","../../../projects/ngx-hateoas-client/src/lib/model/resource/resource-collection.ts","../../../projects/ngx-hateoas-client/src/lib/model/resource/embedded-resource.ts","../../../projects/ngx-hateoas-client/src/lib/model/resource/paged-resource-collection.ts","../../../projects/ngx-hateoas-client/src/lib/config/ngx-hateoas-client-configuration.service.ts","../../../projects/ngx-hateoas-client/src/lib/service/internal/common-resource-http.service.ts","../../../projects/ngx-hateoas-client/src/lib/service/external/hateoas-resource.service.ts","../../../projects/ngx-hateoas-client/src/lib/service/external/hateoas-resource-operation.ts","../../../projects/ngx-hateoas-client/src/lib/model/decorators.ts","../../../projects/ngx-hateoas-client/src/lib/ngx-hateoas-client.module.ts","../../../projects/ngx-hateoas-client/src/public-api.ts","../../../projects/ngx-hateoas-client/src/lagoshny-ngx-hateoas-client.ts"],"sourcesContent":["import { Injector, Type } from '@angular/core';\r\n\r\n/**\r\n * Holds dependency injector to allow use ше in internal the lib classes.\r\n */\r\n/* tslint:disable:variable-name */\r\nexport class DependencyInjector {\r\n\r\n  private static _injector: Injector = null;\r\n\r\n  static get<T>(type: Type<T>): T {\r\n    if (this._injector) {\r\n      return this._injector.get(type);\r\n    }\r\n    throw new Error('You need initialize Injector');\r\n  }\r\n\r\n  static set injector(value: Injector) {\r\n    this._injector = value;\r\n  }\r\n\r\n}\r\n","/**\r\n * Describe all client configuration params.\r\n */\r\nimport { Resource } from '../model/resource/resource';\r\nimport { EmbeddedResource } from '../model/resource/embedded-resource';\r\nimport { CacheMode } from '../model/declarations';\r\n\r\nexport const DEFAULT_ROUTE_NAME = 'defaultRoute';\r\n\r\n/**\r\n * Used to specify additional {@link Resource} options.\r\n */\r\nexport interface ResourceOption {\r\n  /**\r\n   * Name of the route that configured in {@link HateoasConfiguration#http} as {@link MultipleResourceRoutes}.\r\n   * Be default used route with name 'defaultRoute'.\r\n   *\r\n   * See more about this option in <a href=\"https://github.com/lagoshny/ngx-hateoas-client/blob/master/README.md#options\">documentation</a>.\r\n   */\r\n  routeName?: string;\r\n}\r\n\r\n/**\r\n * Resource route config that defined where from retrieve resources.\r\n * If you use this config, then a default route created with name 'defaultRoute' will be assigned to all resources.\r\n */\r\nexport interface ResourceRoute {\r\n  /**\r\n   * Root server url.\r\n   *\r\n   * For default Spring application it looks like: http://localhost:8080.\r\n   */\r\n  rootUrl: string;\r\n  /**\r\n   * Proxy url on which to send requests.\r\n   * If passed then it uses to change rootUrl to proxyUrl when get relation link.\r\n   *\r\n   * For default Spring application it looks like: http://localhost:8080/api/v1.\r\n   */\r\n  proxyUrl?: string;\r\n}\r\n\r\n/**\r\n * Defines several resource routes.\r\n */\r\nexport interface MultipleResourceRoutes {\r\n  /**\r\n   * Each resource route is declared as {@link ResourceRoute} object with root and proxy url if need it.\r\n   * Specified route name  is used in {@link ResourceOption#routeName} to retrieve resource by this route.\r\n   *\r\n   * If you want to declare only one route, you need to use default route name as 'defaultRoute' or use simple {@link ResourceRoute} config.\r\n   */\r\n  [routeName: string]: ResourceRoute;\r\n}\r\n\r\nexport interface HateoasConfiguration {\r\n\r\n  /**\r\n   * Http options.\r\n   * {@link ResourceRoute} declare common resource route that created with default name 'defaultRoute'.\r\n   * {@link MultipleResourceRoutes} declare several resource routes,\r\n   * to define default route in this case, use default route name 'defaultRoute'.\r\n   */\r\n  http: ResourceRoute | MultipleResourceRoutes;\r\n\r\n  /**\r\n   * Logging option.\r\n   */\r\n  logs?: {\r\n    /**\r\n     * Should print verbose logs to the console.\r\n     */\r\n    verboseLogs?: boolean;\r\n  };\r\n\r\n  /**\r\n   * Cache options.\r\n   */\r\n  cache?: {\r\n    /**\r\n     * When {@code true} then cache will be used, {@code false} otherwise.\r\n     */\r\n    enabled: boolean;\r\n    /**\r\n     * Allows to adjust cache more granular using {@link CacheMode} modes.\r\n     */\r\n    mode?: CacheMode;\r\n    /**\r\n     * Time in milliseconds after which cache need to be expired.\r\n     */\r\n    lifeTime?: number;\r\n  };\r\n\r\n  /**\r\n   * Declared resource/embedded resource types that will be used to create resources from server response that contains resources.\r\n   */\r\n  useTypes?: {\r\n    resources: Array<new (...args: any[]) => Resource>;\r\n    embeddedResources?: Array<new (...args: any[]) => EmbeddedResource>;\r\n  };\r\n\r\n  /**\r\n   * {@code true} when running in production environment, {@code false} otherwise.\r\n   */\r\n  isProduction?: boolean;\r\n\r\n  /**\r\n   * Specifying format for some type values.\r\n   */\r\n  typesFormat?: {\r\n    /**\r\n     * This date format will be used when parse {@link Resource} properties.\r\n     * If the property will be match to some one of specified formats, then the property type will be as Date object.\r\n     * Otherwise, raw type will be used as default.\r\n     */\r\n    date?: {\r\n      /**\r\n       * Date pattern.\r\n       * The {@link https://date-fns.org} lib is used to parse date with patterns, use patterns supported by this lib.\r\n       * See more about supported formats <a href='https://date-fns.org/v2.28.0/docs/parse'>here</a>.\r\n       */\r\n      patterns: Array<string>;\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Let to change default page params that is size = 20, page = 0.\r\n   */\r\n  pagination?: {\r\n    defaultPage: {\r\n      size: number;\r\n      page?: number;\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Additional configuration to specify settings for HAL format.\r\n   */\r\n  halFormat?: {\r\n    json?: {\r\n      /**\r\n       * {@code true} when empty object {} should be converted to {@code null} value\r\n       * {@code false} when empty object {} should be used as is\r\n       */\r\n      convertEmptyObjectToNull: boolean;\r\n    },\r\n    collections?: {\r\n      /**\r\n       * If {@code true}, then for empty collections, not required to specify _embedded property.\r\n       * When {@code false} (be default), you need to specify empty _embedded property for empty collections.\r\n       *\r\n       * By default, Spring Data REST includes empty _embedded property for empty collections,\r\n       * but when using Spring HATEOAS you need to do it manually.\r\n       *\r\n       * Recommending use Spring Data REST approach and return empty _embedded property for empty collection\r\n       * for more predictable determine resource type algorithm.\r\n       */\r\n      embeddedOptional: boolean;\r\n    }\r\n  };\r\n\r\n}\r\n","import { Resource } from './resource/resource';\r\nimport { BaseResource } from './resource/base-resource';\r\nimport { EmbeddedResource } from './resource/embedded-resource';\r\nimport { HttpHeaders, HttpParams } from '@angular/common/http';\r\n\r\nexport const RESOURCE_NAME_PROP = '__resourceName__';\r\nexport const RESOURCE_OPTIONS_PROP = '__options__';\r\n\r\n/**\r\n * Resource link object.\r\n */\r\nexport interface Link {\r\n  /**\r\n   * Link name.\r\n   */\r\n  [key: string]: LinkData;\r\n}\r\n\r\nexport interface LinkData {\r\n  /**\r\n   * Link url.\r\n   */\r\n  href: string;\r\n  /**\r\n   * {@code true} if <b>href</b> has template, {@code false} otherwise.\r\n   */\r\n  templated?: boolean;\r\n}\r\n\r\n/**\r\n * Interface that allows to identify that object is resource when it is has a links object.\r\n */\r\nexport interface ResourceIdentifiable {\r\n\r\n  /**\r\n   * List of links related with the resource.\r\n   */\r\n  _links: Link;\r\n}\r\n\r\n/**\r\n * Http options that used by Angular HttpClient.\r\n */\r\nexport interface HttpClientOptions {\r\n  headers?: HttpHeaders | {\r\n    [header: string]: string | string[];\r\n  };\r\n  observe?: 'body' | 'response';\r\n  params?: HttpParams;\r\n  reportProgress?: boolean;\r\n  responseType?: 'json';\r\n  withCredentials?: boolean;\r\n}\r\n\r\n/**\r\n * Extend {@link GetOption} with page param.\r\n */\r\nexport interface PagedGetOption extends GetOption {\r\n  pageParams?: PageParam;\r\n}\r\n\r\n/**\r\n * Contains options that can be applied to POST/PUT/PATCH/DELETE request.\r\n */\r\nexport interface RequestOption {\r\n  params?: RequestParam;\r\n  headers?: HttpHeaders | {\r\n    [header: string]: string | string[];\r\n  };\r\n  observe?: 'body' | 'response';\r\n  reportProgress?: boolean;\r\n  withCredentials?: boolean;\r\n}\r\n\r\n/**\r\n * Contains additional options that can be applied to the GET request.\r\n */\r\nexport interface GetOption extends RequestOption {\r\n  /**\r\n   * Sorting options.\r\n   */\r\n  sort?: Sort;\r\n  useCache?: boolean;\r\n}\r\n\r\n/**\r\n * Request params that will be applied to the result url as http request params.\r\n *\r\n * Should not contains params as: 'projection' and {@link PageParam} properties.\r\n * If want pass this params then use suitable properties from {@link GetOption} or {@link PagedGetOption},\r\n * otherwise exception will be thrown.\r\n */\r\nexport interface RequestParam {\r\n  [paramName: string]: Resource | string | number | boolean | Array<string> | Array<number>;\r\n}\r\n\r\n/**\r\n * Page content params.\r\n */\r\nexport interface PageParam {\r\n  /**\r\n   * Number of page.\r\n   */\r\n  page?: number;\r\n\r\n  /**\r\n   * Page size.\r\n   */\r\n  size?: number;\r\n}\r\n\r\n/**\r\n * Page params with sort option.\r\n */\r\nexport interface SortedPageParam {\r\n  /**\r\n   * Page content params.\r\n   */\r\n  pageParams?: PageParam;\r\n  /**\r\n   * Sorting options.\r\n   */\r\n  sort?: Sort;\r\n}\r\n\r\nexport type SortOrder = 'DESC' | 'ASC';\r\n\r\nexport interface Sort {\r\n  /**\r\n   * Name of the property to sort.\r\n   */\r\n  [propertyToSort: string]: SortOrder;\r\n}\r\n\r\n/**\r\n * Page resource response from Spring application.\r\n */\r\nexport interface PageData {\r\n  page: {\r\n    size: number;\r\n    totalElements: number;\r\n    totalPages: number;\r\n    number: number;\r\n  };\r\n  _links?: {\r\n    first: {\r\n      href: string\r\n    };\r\n    prev?: {\r\n      href: string\r\n    };\r\n    self: {\r\n      href: string\r\n    };\r\n    next?: {\r\n      href: string\r\n    };\r\n    last: {\r\n      href: string\r\n    };\r\n  };\r\n}\r\n\r\nexport enum Include {\r\n  /**\r\n   * Allows to include null values to request body\r\n   */\r\n  NULL_VALUES = 'NULL_VALUES',\r\n  /**\r\n   * Not replace related resources with their self links, instead pass them as JSON objects.\r\n   */\r\n  REL_RESOURCES_AS_OBJECTS = 'REL_RESOURCES_AS_OBJECTS'\r\n}\r\n\r\n/**\r\n * Include options that allow configure should include or not some specific values\r\n * (e.q. null values).\r\n */\r\nexport interface ValuesOption {\r\n  include: Include | Include[];\r\n}\r\n\r\n/**\r\n * Request body object.\r\n */\r\nexport interface RequestBody<T> {\r\n  /**\r\n   * Any object that will be passed as request body.\r\n   */\r\n  body: T;\r\n  /**\r\n   * Use this param to influence on body values that you want include or not.\r\n   */\r\n  valuesOption?: ValuesOption;\r\n}\r\n\r\n/**\r\n * Supported http methods for custom query.\r\n */\r\nexport enum HttpMethod {\r\n  GET = 'GET', POST = 'POST', PUT = 'PUT', PATCH = 'PATCH'\r\n}\r\n\r\ntype NonResourcePropertyType<T> = {\r\n  [K in keyof T]: T[K] extends BaseResource ? never : K;\r\n}[keyof T];\r\n\r\n/**\r\n * Type that allowed represent resource relations as resource projection excluding {@link Resource},\r\n * {@link EmbeddedResource} props and methods from current type.\r\n */\r\nexport type ProjectionRelType<T extends BaseResource> =\r\n  Pick<T, Exclude<keyof T, keyof Resource | keyof EmbeddedResource> & NonResourcePropertyType<T>>;\r\n\r\n/**\r\n * Additional cache modes.\r\n */\r\nexport enum CacheMode {\r\n  /**\r\n   * Default mode.\r\n   * When cache enable, then all HTTP GET methods will use cache. Except methods where explicitly passed {useCache : false}.\r\n   */\r\n  ALWAYS = 'ALWAYS',\r\n\r\n  /**\r\n   * This is opposite option for ALWAYS mode.\r\n   * When cache enable, that mode will NOT use cache by default on all HTTP GET methods.\r\n   * Except methods where explicitly passed {useCache : true}.\r\n   */\r\n  ON_DEMAND = 'ON_DEMAND'\r\n}\r\n","import { DEFAULT_ROUTE_NAME, HateoasConfiguration } from './hateoas-configuration.interface';\r\nimport { CacheMode } from '../model/declarations';\r\n\r\n/**\r\n * Contains all configuration lib params.\r\n */\r\n// tslint:disable:no-string-literal\r\nexport class LibConfig {\r\n\r\n  public static readonly DEFAULT_CONFIG: HateoasConfiguration = {\r\n    http: {\r\n      [DEFAULT_ROUTE_NAME]: {\r\n        rootUrl: 'http://localhost:8080/api/v1'\r\n      },\r\n    },\r\n    logs: {\r\n      verboseLogs: false\r\n    },\r\n    cache: {\r\n      enabled: true,\r\n      mode: CacheMode.ALWAYS,\r\n      lifeTime: 5 * 60 * 1000\r\n    },\r\n    useTypes: {\r\n      resources: []\r\n    },\r\n    pagination: {\r\n      defaultPage: {\r\n        size: 20,\r\n        page: 0\r\n      }\r\n    },\r\n    halFormat: {\r\n      json: {\r\n        convertEmptyObjectToNull: true\r\n      },\r\n      collections: {\r\n        embeddedOptional: false\r\n      }\r\n    },\r\n    isProduction: false\r\n  };\r\n\r\n  private static config: HateoasConfiguration = LibConfig.DEFAULT_CONFIG;\r\n\r\n  public static setConfig(hateoasConfiguration: HateoasConfiguration) {\r\n    LibConfig.config = LibConfig.mergeConfigs(hateoasConfiguration);\r\n  }\r\n\r\n  public static getConfig(): HateoasConfiguration {\r\n    return LibConfig.config;\r\n  }\r\n\r\n  public static mergeConfigs(config: HateoasConfiguration): HateoasConfiguration {\r\n    return {\r\n      ...LibConfig.DEFAULT_CONFIG,\r\n      ...config,\r\n      halFormat: {\r\n        json: {\r\n          ...LibConfig.DEFAULT_CONFIG.halFormat.json,\r\n          ...config?.halFormat?.json\r\n        },\r\n        collections: {\r\n          ...LibConfig.DEFAULT_CONFIG.halFormat.collections,\r\n          ...config?.halFormat?.collections\r\n        }\r\n      },\r\n      pagination: {\r\n        defaultPage: {\r\n          ...LibConfig.DEFAULT_CONFIG.pagination.defaultPage,\r\n          ...config?.pagination?.defaultPage\r\n        }\r\n      },\r\n      cache: {\r\n        ...LibConfig.DEFAULT_CONFIG.cache,\r\n        ...config?.cache\r\n      },\r\n    };\r\n  }\r\n\r\n}\r\n","import { LibConfig } from '../config/lib-config';\r\nimport { camelCase, capitalize, isEmpty } from 'lodash-es';\r\n\r\n/* tslint:disable:variable-name no-console */\r\nexport class ConsoleLogger {\r\n\r\n  public static info(message?: any, ...optionalParams: any[]): void {\r\n    if (!this.isLoggingEnabled()) {\r\n      return;\r\n    }\r\n    console.info(message, ...optionalParams);\r\n  }\r\n\r\n  public static warn(message?: any, ...optionalParams: any[]): void {\r\n    if (!this.isLoggingEnabled()) {\r\n      return;\r\n    }\r\n    console.warn(message, ...optionalParams);\r\n  }\r\n\r\n  public static error(message?: any, ...optionalParams: any[]): void {\r\n    if (!this.isLoggingEnabled()) {\r\n      return;\r\n    }\r\n    console.error(message, ...optionalParams);\r\n  }\r\n\r\n  /**\r\n   * Log info messages in pretty format.\r\n   *\r\n   * @param message log message\r\n   * @param params additional params for verbose log\r\n   */\r\n  public static prettyInfo(message: string, params?: object): void {\r\n    if (!this.isLoggingEnabled()) {\r\n      return;\r\n    }\r\n\r\n    let msg = `%c${ message }\\n`;\r\n    const color = [\r\n      'color: #201AB3;'\r\n    ];\r\n\r\n    if (!isEmpty(params)) {\r\n      for (const [key, value] of Object.entries(params)) {\r\n        if (key.toLowerCase() === 'result') {\r\n          msg += `%c${ capitalize(key) }: %c${ value }\\n`;\r\n          color.push('color: #3AA6D0;', 'color: #00BA45;');\r\n        } else {\r\n          msg += `%c${ camelCase(key) }: %c${ value }\\n`;\r\n          color.push('color: #3AA6D0;', 'color: default;');\r\n        }\r\n      }\r\n    }\r\n\r\n    ConsoleLogger.info(msg, ...color);\r\n  }\r\n\r\n  public static objectPrettyInfo(message: string, params?: object): void {\r\n    if (!this.isLoggingEnabled()) {\r\n      return;\r\n    }\r\n\r\n    const msg = `%c${ message }\\n`;\r\n    const color = [\r\n      'color: #201AB3;'\r\n    ];\r\n\r\n    ConsoleLogger.info(msg, ...color, params);\r\n  }\r\n\r\n  /**\r\n   * Log resource info messages in pretty format.\r\n   *\r\n   * @param message log message\r\n   * @param resourceName resource name\r\n   * @param params additional params for verbose log\r\n   */\r\n  public static resourcePrettyInfo(resourceName: string, message: string, params?: object): void {\r\n    if (!this.isLoggingEnabled()) {\r\n      return;\r\n    }\r\n\r\n    let msg = `%c${ resourceName } %c${ message }\\n`;\r\n    const color = [\r\n      'color: #DA005C;',\r\n      'color: #201AB3;'\r\n    ];\r\n\r\n    if (!isEmpty(params)) {\r\n      for (const [key, value] of Object.entries(params)) {\r\n        if (key.toLowerCase() === 'result') {\r\n          msg += `%c${ capitalize(key) }: %c${ value }\\n`;\r\n          color.push('color: #3AA6D0;', 'color: #00BA45;');\r\n        } else {\r\n          msg += `%c${ camelCase(key) }: %c${ value }\\n`;\r\n          color.push('color: #3AA6D0;', 'color: default;');\r\n        }\r\n      }\r\n    }\r\n\r\n    ConsoleLogger.info(msg, ...color);\r\n  }\r\n\r\n  /**\r\n   * Log error messages in pretty format.\r\n   *\r\n   * @param message log message\r\n   * @param params additional params for verbose log\r\n   */\r\n  public static prettyError(message: string, params?: object): void {\r\n    if (!this.isLoggingEnabled()) {\r\n      return;\r\n    }\r\n\r\n    let msg = `%c${ message }\\n`;\r\n    const color = [\r\n      'color: #df004f;'\r\n    ];\r\n\r\n    if (!isEmpty(params)) {\r\n      for (const [key, value] of Object.entries(params)) {\r\n        if (key.toLowerCase() === 'error') {\r\n          msg += `%c${ capitalize(key) }: %c${ value }\\n`;\r\n          color.push('color: #df004f;', 'color: #ff0000;');\r\n        } else {\r\n          msg += `%c${ capitalize(key) }: %c${ value }\\n`;\r\n          color.push('color: #3AA6D0;', 'color: #000;');\r\n        }\r\n      }\r\n    }\r\n\r\n    ConsoleLogger.error(msg, ...color);\r\n  }\r\n\r\n  /**\r\n   * Log warn messages in pretty format.\r\n   *\r\n   * @param message log message\r\n   * @param params additional params for verbose log\r\n   */\r\n  public static prettyWarn(message: string, params?: object): void {\r\n    if (!this.isLoggingEnabled()) {\r\n      return;\r\n    }\r\n\r\n    let msg = `%c${ message }\\n`;\r\n    const color = [\r\n      'color: #ffbe00;'\r\n    ];\r\n\r\n    if (!isEmpty(params)) {\r\n      for (const [key, value] of Object.entries(params)) {\r\n        msg += `%c${ capitalize(key) }: %c${ value }\\n`;\r\n        color.push('color: #3AA6D0;', 'color: #000;');\r\n      }\r\n    }\r\n\r\n    ConsoleLogger.warn(msg, ...color);\r\n  }\r\n\r\n  private static isLoggingEnabled() {\r\n    return (!LibConfig.getConfig().isProduction && LibConfig.getConfig().logs.verboseLogs)\r\n      || LibConfig.getConfig().logs.verboseLogs;\r\n  }\r\n\r\n}\r\n","import { isObject } from 'lodash-es';\r\nimport { LibConfig } from '../config/lib-config';\r\n\r\nexport function isEmbeddedResource(object: any) {\r\n  // Embedded resource doesn't have self link in _links object\r\n  return !isPagedResourceCollection(object) && !isResourceCollection(object)\r\n    && isResourceObject(object) && !('self' in (object._links as object));\r\n}\r\n\r\nexport function isResource(object: any): boolean {\r\n  return !isPagedResourceCollection(object) && !isResourceCollection(object)\r\n    && isResourceObject(object) && ('self' in (object._links as object));\r\n}\r\n\r\nexport function isResourceCollection(object: any): boolean {\r\n  const baseCondition = isObject(object) &&\r\n    ('_links' in object) &&\r\n    !('page' in object);\r\n  if (!baseCondition) {\r\n    return false;\r\n  }\r\n\r\n  if (LibConfig.getConfig().halFormat.collections.embeddedOptional) {\r\n    return baseCondition && (Object.keys(object).length === 1 ||\r\n      '_embedded' in object && Object.keys(object).length === 2);\r\n  } else {\r\n    return baseCondition && '_embedded' in object && Object.keys(object).length === 2;\r\n  }\r\n}\r\n\r\nexport function isPagedResourceCollection(object: any): boolean {\r\n  const baseCondition = isObject(object) &&\r\n    ('_links' in object) &&\r\n    ('page' in object);\r\n  if (!baseCondition) {\r\n    return false;\r\n  }\r\n\r\n  if (LibConfig.getConfig().halFormat.collections.embeddedOptional) {\r\n    return baseCondition && (Object.keys(object).length === 2 ||\r\n      '_embedded' in object && Object.keys(object).length === 3);\r\n  } else {\r\n    return baseCondition && '_embedded' in object && Object.keys(object).length === 3;\r\n  }\r\n}\r\n\r\n/**\r\n * Check that passed object has links property.\r\n *\r\n * @param object which need to check links property\r\n */\r\nexport function isResourceObject(object: any) {\r\n  return isObject(object) && ('_links' in object);\r\n}\r\n\r\n/**\r\n * Defining resource type bypassed object.\r\n *\r\n * @param object that presumably is one of resource type\r\n */\r\nexport function getResourceType(object: any): string {\r\n  if (isEmbeddedResource(object)) {\r\n    return 'EmbeddedResource';\r\n  } else if (isResource(object)) {\r\n    return 'Resource';\r\n  } else if (isResourceCollection(object)) {\r\n    return 'ResourceCollection';\r\n  } else if (isPagedResourceCollection(object)) {\r\n    return 'PagedResourceCollection';\r\n  } else {\r\n    return 'Unknown';\r\n  }\r\n}\r\n","export enum Stage {\r\n  BEGIN = 'BEGIN',\r\n  PREPARE_URL = 'PREPARE_URL',\r\n  CHECK_PARAMS = 'CHECK_PARAMS',\r\n  PREPARE_PARAMS = 'PREPARE_PARAMS',\r\n  INIT_RESOURCE = 'INIT_RESOURCE',\r\n  RESOLVE_VALUES = 'RESOLVE_VALUES',\r\n  CACHE_PUT = 'CACHE_PUT',\r\n  CACHE_GET = 'CACHE_GET',\r\n  CACHE_EVICT = 'CACHE_EVICT',\r\n  CACHE_EVICT_ALL = 'CACHE_EVICT_ALL',\r\n  HTTP_REQUEST = 'HTTP_REQUEST',\r\n  HTTP_RESPONSE = 'HTTP_RESPONSE',\r\n  END = 'END'\r\n}\r\n","import { ConsoleLogger } from './console-logger';\r\nimport { Stage } from './stage.enum';\r\nimport { LibConfig } from '../config/lib-config';\r\nimport { capitalize, isEmpty, isNil, isObject, isString } from 'lodash-es';\r\nimport { RESOURCE_NAME_PROP } from '../model/declarations';\r\n\r\n/**\r\n * Simplify logger calls.\r\n */\r\n\r\n/* tslint:disable:no-string-literal */\r\nexport class StageLogger {\r\n\r\n  public static resourceBeginLog(resource: object | string, method: string, params?: object): void {\r\n    if (!LibConfig.getConfig().logs.verboseLogs && !LibConfig.getConfig().isProduction) {\r\n      return;\r\n    }\r\n    const paramToLog = this.prepareParams(params);\r\n\r\n    let resourceName;\r\n    if (isString(resource)) {\r\n      resourceName = resource;\r\n    } else if (!isNil(resource)) {\r\n      resourceName = RESOURCE_NAME_PROP in resource ? resource[RESOURCE_NAME_PROP] : 'EmbeddedResource';\r\n    } else {\r\n      resourceName = 'NOT_DEFINED_RESOURCE_NAME';\r\n    }\r\n    ConsoleLogger.resourcePrettyInfo(`${ capitalize(resourceName) } ${ method }`,\r\n      `STAGE ${ Stage.BEGIN }`, paramToLog);\r\n  }\r\n\r\n  public static resourceEndLog(resource: object | string, method: string, params: object): void {\r\n    if (!LibConfig.getConfig().logs.verboseLogs && !LibConfig.getConfig().isProduction) {\r\n      return;\r\n    }\r\n    const paramToLog = this.prepareParams(params);\r\n\r\n    let resourceName;\r\n    if (isString(resource)) {\r\n      resourceName = resource;\r\n    } else {\r\n      resourceName = RESOURCE_NAME_PROP in resource ? resource[RESOURCE_NAME_PROP] : 'EmbeddedResource';\r\n    }\r\n\r\n    ConsoleLogger.resourcePrettyInfo(`${ capitalize(resourceName) } ${ method }`,\r\n      `STAGE ${ Stage.END }`, paramToLog);\r\n  }\r\n\r\n  public static stageLog(stage: Stage, params: object): void {\r\n    if (!LibConfig.getConfig().logs.verboseLogs && !LibConfig.getConfig().isProduction) {\r\n      return;\r\n    }\r\n    const paramToLog = this.prepareParams(params);\r\n\r\n    ConsoleLogger.prettyInfo(`STAGE ${ stage }`, paramToLog);\r\n  }\r\n\r\n  public static stageErrorLog(stage: Stage, params: object): void {\r\n    if (LibConfig.getConfig().isProduction) {\r\n      return;\r\n    }\r\n    const paramToLog = this.prepareParams(params);\r\n\r\n    ConsoleLogger.prettyError(`STAGE ${ stage }`, paramToLog);\r\n  }\r\n\r\n  public static stageWarnLog(stage: Stage, params: object): void {\r\n    if (LibConfig.getConfig().isProduction) {\r\n      return;\r\n    }\r\n    const paramToLog = this.prepareParams(params);\r\n\r\n    ConsoleLogger.prettyWarn(`STAGE ${ stage }`, paramToLog);\r\n  }\r\n\r\n  private static prepareParams(params: object) {\r\n    const paramToLog = {};\r\n    if (isEmpty(params)) {\r\n      return paramToLog;\r\n    }\r\n    for (const [key, value] of Object.entries(params)) {\r\n      if (!params.hasOwnProperty(key)) {\r\n        continue;\r\n      }\r\n      if (isObject(value)) {\r\n        paramToLog[key] = JSON.stringify(value, null, 2);\r\n      } else {\r\n        paramToLog[key] = value;\r\n      }\r\n    }\r\n    return paramToLog;\r\n  }\r\n}\r\n","import { StageLogger } from '../logger/stage-logger';\r\nimport { Stage } from '../logger/stage.enum';\r\nimport { isArray, isEmpty, isFunction, isNil, isObject, isPlainObject, isString } from 'lodash-es';\r\nimport { RESOURCE_NAME_PROP } from '../model/declarations';\r\n\r\nexport class ValidationUtils {\r\n\r\n  /**\r\n   * Checks that passed object with params has all valid params.\r\n   * Params should not has null, undefined, empty object, empty string values.\r\n   *\r\n   * @param params object with params to check\r\n   * @throws error if any params are not defined\r\n   */\r\n  public static validateInputParams(params: object): void {\r\n    if (isNil(params)) {\r\n      const errMsg = 'Passed params object is not valid';\r\n      StageLogger.stageErrorLog(Stage.CHECK_PARAMS, {error: errMsg});\r\n      throw new Error(errMsg);\r\n    }\r\n\r\n    const notValidParams = [];\r\n    for (const [key, value] of Object.entries(params)) {\r\n      // tslint:disable-next-line:no-string-literal\r\n      if (isFunction(value) && isFunction(value.constructor) && !value[RESOURCE_NAME_PROP]) {\r\n        throw new Error(`Resource '${ value.name }' has not 'resourceName' value. Set it with @HateoasResource decorator on '${ value.name }' class.`);\r\n      }\r\n\r\n      if (isNil(value)\r\n        || (isString(value) && !value)\r\n        || (isPlainObject(value) && isEmpty(value))\r\n        || (isArray(value) && value.length === 0)) {\r\n\r\n        let formattedValue = value;\r\n        if (isObject(value)) {\r\n          formattedValue = JSON.stringify(value, null, 2);\r\n        }\r\n        notValidParams.push(`'${ key } = ${ formattedValue }'`);\r\n      }\r\n    }\r\n    if (notValidParams.length > 0) {\r\n      const errMsg = `Passed param(s) ${ notValidParams.join(', ') } ${ notValidParams.length > 1 ? 'are' : 'is' } not valid`;\r\n      StageLogger.stageErrorLog(Stage.CHECK_PARAMS, {error: errMsg});\r\n      throw new Error(errMsg);\r\n    }\r\n  }\r\n\r\n}\r\n","import { HttpParams } from '@angular/common/http';\r\nimport { isResource } from '../model/resource-type';\r\nimport { Resource } from '../model/resource/resource';\r\nimport { GetOption, HttpClientOptions, LinkData, PagedGetOption, Sort } from '../model/declarations';\r\nimport { ValidationUtils } from './validation.utils';\r\nimport { LibConfig } from '../config/lib-config';\r\nimport { isArray, isEmpty, isNil, isObject, toString } from 'lodash-es';\r\nimport { UriTemplate } from 'uri-templates-es';\r\nimport { MultipleResourceRoutes, ResourceRoute } from '../config/hateoas-configuration.interface';\r\nimport { ConsoleLogger } from '../logger/console-logger';\r\n\r\nexport class UrlUtils {\r\n\r\n  /**\r\n   * Convert passed params to the {@link HttpParams}.\r\n   *\r\n   * @param options which need to convert\r\n   * @param httpParams (optional) if passed then will be applied to this one, otherwise created a new one\r\n   */\r\n  public static convertToHttpParams(options: PagedGetOption, httpParams?: HttpParams): HttpParams {\r\n    let resultParams = httpParams ? httpParams : new HttpParams();\r\n    if (isEmpty(options) || isNil(options)) {\r\n      return resultParams;\r\n    }\r\n    UrlUtils.checkDuplicateParams(options);\r\n\r\n    if (isObject(options.params) && !isEmpty(options.params)) {\r\n      for (const [key, value] of Object.entries(options.params)) {\r\n        if (options.params.hasOwnProperty(key)) {\r\n          if (isResource(value)) {\r\n            // Append resource as resource link\r\n            resultParams = resultParams.append(key, (value as Resource).getSelfLinkHref());\r\n          } else if (isArray(options.params[key])) {\r\n            // Append arrays params as repeated key with each value from array\r\n            (options.params[key] as Array<any>).forEach((item) => {\r\n              resultParams = resultParams.append(`${ key.toString() }`, item);\r\n            });\r\n          } else {\r\n            // Else append simple param as is\r\n            resultParams = resultParams.append(key, value.toString());\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    if (!isEmpty(options.pageParams)) {\r\n      resultParams = resultParams.append('page', toString(options.pageParams.page));\r\n      resultParams = resultParams.append('size', toString(options.pageParams.size));\r\n    }\r\n    if (!isEmpty(options.sort)) {\r\n      resultParams = UrlUtils.generateSortParams(options.sort, resultParams);\r\n    }\r\n\r\n    return resultParams;\r\n  }\r\n\r\n  /**\r\n   * Convert ngx-hateoas-client option to Angular HttpClient.\r\n   * @param options ngx-hateoas-client options\r\n   */\r\n  public static convertToHttpOptions(options: PagedGetOption): HttpClientOptions {\r\n    if (isEmpty(options) || isNil(options)) {\r\n      return {};\r\n    }\r\n\r\n    return {\r\n      params: UrlUtils.convertToHttpParams(options),\r\n      headers: options.headers,\r\n      observe: options.observe,\r\n      reportProgress: options.reportProgress,\r\n      withCredentials: options.withCredentials,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Generate link url.\r\n   * If proxyUrl is not empty then relation url will be use proxy.\r\n   *\r\n   * @param relationLink resource link to which need to generate the url\r\n   * @param options (optional) additional options that should be applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public static generateLinkUrl(relationLink: LinkData, options?: PagedGetOption): string {\r\n    ValidationUtils.validateInputParams({relationLink, linkUrl: relationLink?.href});\r\n    let url;\r\n    if (options && !isEmpty(options)) {\r\n      url = relationLink.templated ? UrlUtils.fillTemplateParams(relationLink.href, options) : relationLink.href;\r\n    } else {\r\n      url = relationLink.templated ? UrlUtils.removeTemplateParams(relationLink.href) : relationLink.href;\r\n    }\r\n\r\n    const route = UrlUtils.guessResourceRoute(url);\r\n    if (route.proxyUrl) {\r\n      return url.replace(route.rootUrl, route.proxyUrl);\r\n    }\r\n    return url;\r\n  }\r\n\r\n  /**\r\n   * Return server api url based on proxy url when it is not empty or root url otherwise.\r\n   *\r\n   * @param routeName resource route name that configured in {@link MultipleResourceRoutes}.\r\n   */\r\n  public static getApiUrl(routeName: string): string {\r\n    const route = UrlUtils.getRouteByName(routeName);\r\n    if (route.proxyUrl) {\r\n      return route.proxyUrl;\r\n    } else {\r\n      return route.rootUrl;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Try to determine resource route by passed resource url.\r\n   * @param url resource url\r\n   */\r\n  public static guessResourceRoute(url: string): ResourceRoute {\r\n    let resourceRoute: ResourceRoute;\r\n    for (const [routeName] of Object.entries(UrlUtils.getRoutes())) {\r\n      const route = UrlUtils.getRouteByName(routeName);\r\n      const lowerCaseUrl = url.toLowerCase();\r\n      if (lowerCaseUrl.includes(route.rootUrl.toLowerCase())\r\n        || (!isEmpty(route.proxyUrl) && lowerCaseUrl.includes(route.proxyUrl.toLowerCase()))) {\r\n        resourceRoute = route;\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (isEmpty(resourceRoute)) {\r\n      throw new Error(`Failed to determine resource route by url: ${ url }`);\r\n    }\r\n\r\n    return resourceRoute;\r\n  }\r\n\r\n  /**\r\n   * Generate url use base and the resource name.\r\n   *\r\n   * @param baseUrl will be as first part as a result url\r\n   * @param resourceName added to the base url through slash\r\n   * @param query (optional) if passed then adds to end of the url\r\n   * @throws error when required params are not valid\r\n   */\r\n  public static generateResourceUrl(baseUrl: string, resourceName: string, query?: string): string {\r\n    ValidationUtils.validateInputParams({baseUrl, resourceName});\r\n\r\n    let url = baseUrl;\r\n    if (!url.endsWith('/')) {\r\n      url = url.concat('/');\r\n    }\r\n    return url.concat(resourceName).concat(query ? `${ query.startsWith('/') ? query : '/' + query }` : '');\r\n  }\r\n\r\n  /**\r\n   * Retrieve a resource name from resource url.\r\n   *\r\n   * @param url resource url\r\n   */\r\n  public static getResourceNameFromUrl(url: string): string {\r\n    ValidationUtils.validateInputParams({url});\r\n    const lowerCaseUrl = url.toLowerCase();\r\n    const resourceRoute = UrlUtils.guessResourceRoute(url);\r\n\r\n    let baseUrl;\r\n    if (lowerCaseUrl.includes(resourceRoute.rootUrl)) {\r\n      baseUrl = resourceRoute.rootUrl;\r\n    } else if (!isEmpty(resourceRoute.proxyUrl) && lowerCaseUrl.includes(resourceRoute.proxyUrl)) {\r\n      baseUrl = resourceRoute.proxyUrl;\r\n    } else {\r\n      throw new Error(`Failed to determine resource name from url: ${ url }, found resource route ${ JSON.stringify(resourceRoute) }`);\r\n    }\r\n\r\n    if (!baseUrl.endsWith('/')) {\r\n      baseUrl = baseUrl.concat('/');\r\n    }\r\n\r\n    return url.toLowerCase().replace(`${ baseUrl }`, '').split('/')[0];\r\n  }\r\n\r\n  /**\r\n   * Clear url from template params.\r\n   *\r\n   * @param url to be cleaned\r\n   * @throws error when required params are not valid\r\n   */\r\n  public static removeTemplateParams(url: string): string {\r\n    ValidationUtils.validateInputParams({url});\r\n\r\n    return UrlUtils.fillTemplateParams(url, {});\r\n  }\r\n\r\n  /**\r\n   * Clear all url params.\r\n   *\r\n   * @param url to clear params\r\n   * @throws error when required params are not valid\r\n   */\r\n  public static clearUrlParams(url: string): string {\r\n    ValidationUtils.validateInputParams({url});\r\n    const srcUrl = new URL(url);\r\n\r\n    return srcUrl.origin + srcUrl.pathname;\r\n  }\r\n\r\n  /**\r\n   * Fill url template params.\r\n   *\r\n   * @param url to be filled\r\n   * @param options contains params to apply to result url, if empty then template params will be cleared\r\n   * @throws error when required params are not valid\r\n   */\r\n  public static fillTemplateParams(url: string, options: PagedGetOption): string {\r\n    ValidationUtils.validateInputParams({url});\r\n    UrlUtils.checkDuplicateParams(options);\r\n\r\n    /*\r\n       Sort params will be applied through Http request params not with template params\r\n       because often sort params is not present in template params then sort params need to put through Http request params.\r\n       But when sort params present in template params we need to avoid duplication sort params from Http request params\r\n       and template params therefore we need to add it in one place.\r\n    */\r\n    const paramsWithoutSortParam = {\r\n      ...options,\r\n      ...options?.params,\r\n      ...options?.pageParams,\r\n    };\r\n    return new UriTemplate(url).fill(isNil(paramsWithoutSortParam) ? {} : paramsWithoutSortParam);\r\n  }\r\n\r\n  public static fillDefaultPageDataIfNoPresent(options: PagedGetOption) {\r\n    const pagedOptions = !isEmpty(options) ? options : {};\r\n    if (isEmpty(pagedOptions.pageParams)) {\r\n      pagedOptions.pageParams = LibConfig.getConfig().pagination.defaultPage;\r\n    } else if (!pagedOptions.pageParams.size) {\r\n      pagedOptions.pageParams.size = LibConfig.getConfig().pagination.defaultPage.size;\r\n    } else if (!pagedOptions.pageParams.page) {\r\n      pagedOptions.pageParams.page = LibConfig.getConfig().pagination.defaultPage.page;\r\n    }\r\n\r\n    return pagedOptions;\r\n  }\r\n\r\n  private static generateSortParams(sort: Sort, httpParams?: HttpParams): HttpParams {\r\n    let resultParams = httpParams ? httpParams : new HttpParams();\r\n    if (!isEmpty(sort)) {\r\n      for (const [sortPath, sortOrder] of Object.entries(sort)) {\r\n        resultParams = resultParams.append('sort', `${ sortPath },${ sortOrder }`);\r\n      }\r\n    }\r\n\r\n    return resultParams;\r\n  }\r\n\r\n  private static checkDuplicateParams(options: GetOption): void {\r\n    if (isEmpty(options) || isEmpty(options.params)) {\r\n      return;\r\n    }\r\n    if ('page' in options.params || 'size' in options.params) {\r\n      throw Error('Please, pass page params in page object key, not with params object!');\r\n    }\r\n  }\r\n\r\n  public static getRouteByName(routeName: string): ResourceRoute {\r\n    const route = LibConfig.getConfig().http[routeName];\r\n    if (isEmpty(route)) {\r\n      ConsoleLogger.error(`No Resource route found by name: '${ routeName }'. Check you configuration. Read more about this ...`, {\r\n        availableRoutes: UrlUtils.getRoutes()\r\n      });\r\n      throw Error(`No Resource route found by name: '${ routeName }'.`);\r\n    }\r\n\r\n    return route;\r\n  }\r\n\r\n  public static getRoutes(): MultipleResourceRoutes {\r\n    return LibConfig.getConfig().http as MultipleResourceRoutes;\r\n  }\r\n\r\n}\r\n","import { BaseResource } from '../model/resource/base-resource';\r\nimport { isEmbeddedResource, isResource } from '../model/resource-type';\r\nimport { ResourceCollection } from '../model/resource/resource-collection';\r\nimport { PagedResourceCollection } from '../model/resource/paged-resource-collection';\r\nimport { GetOption, Include, Link, PageData, RequestBody } from '../model/declarations';\r\nimport { Resource } from '../model/resource/resource';\r\nimport { EmbeddedResource } from '../model/resource/embedded-resource';\r\nimport { UrlUtils } from './url.utils';\r\nimport { Stage } from '../logger/stage.enum';\r\nimport { StageLogger } from '../logger/stage-logger';\r\nimport { includes, isArray, isEmpty, isNil, isObject, isPlainObject } from 'lodash-es';\r\nimport { ConsoleLogger } from '../logger/console-logger';\r\nimport { LibConfig } from '../config/lib-config';\r\nimport { isMatch, parse } from 'date-fns';\r\n\r\n/* tslint:disable:no-string-literal */\r\nexport class ResourceUtils {\r\n\r\n  public static RESOURCE_NAME_TYPE_MAP: Map<string, any> = new Map<string, any>();\r\n  public static RESOURCE_NAME_PROJECTION_TYPE_MAP: Map<string, any> = new Map<string, any>();\r\n  public static RESOURCE_PROJECTION_REL_NAME_TYPE_MAP: Map<string, any> = new Map<string, any>();\r\n  public static EMBEDDED_RESOURCE_TYPE_MAP: Map<string, any> = new Map<string, any>();\r\n\r\n  private static resourceType: new() => BaseResource;\r\n\r\n  private static resourceCollectionType: new() => ResourceCollection<BaseResource>;\r\n\r\n  private static pagedResourceCollectionType: new(collection: ResourceCollection<BaseResource>, pageData?: PageData)\r\n    => PagedResourceCollection<BaseResource>;\r\n\r\n  private static embeddedResourceType: new() => EmbeddedResource;\r\n\r\n  public static useResourceType(type: new () => Resource) {\r\n    this.resourceType = type;\r\n  }\r\n\r\n  public static useResourceCollectionType(type: new() => ResourceCollection<BaseResource>) {\r\n    this.resourceCollectionType = type;\r\n  }\r\n\r\n  public static usePagedResourceCollectionType(type: new(collection: ResourceCollection<BaseResource>)\r\n    => PagedResourceCollection<BaseResource>) {\r\n    this.pagedResourceCollectionType = type;\r\n  }\r\n\r\n  public static useEmbeddedResourceType(type: new() => EmbeddedResource) {\r\n    this.embeddedResourceType = type;\r\n  }\r\n\r\n  public static instantiateResource<T extends BaseResource>(payload: object, isProjection?: boolean): T {\r\n    // @ts-ignore\r\n    if (isEmpty(payload)\r\n      || (!isObject(payload['_links']) || isEmpty(payload['_links']))) {\r\n      ConsoleLogger.warn('Incorrect resource object! Returned \\'null\\' value, because it has not \\'_links\\' array. Check that server send right resource object.', {incorrectResource: payload});\r\n      return null;\r\n    }\r\n\r\n    return this.createResource(this.resolvePayloadProperties(payload, isProjection), isProjection);\r\n  }\r\n\r\n  private static resolvePayloadProperties<T extends BaseResource>(payload: object, isProjection?: boolean): object {\r\n    for (const key of Object.keys(payload)) {\r\n      if (key === 'hibernateLazyInitializer') {\r\n        delete payload[key];\r\n        continue;\r\n      }\r\n      if (key === '_links') {\r\n        payload[key] = payload[key];\r\n        continue;\r\n      }\r\n\r\n      if (key === '_embedded' && isObject(payload[key])) {\r\n        payload = {\r\n          ...payload,\r\n          ...this.resolvePayloadProperties(payload[key], isProjection)\r\n        };\r\n        delete payload['_embedded'];\r\n\r\n        continue;\r\n      }\r\n\r\n      if (LibConfig.getConfig()?.typesFormat?.date?.patterns && !isEmpty(LibConfig.getConfig().typesFormat.date.patterns)) {\r\n        for (const pattern of LibConfig.getConfig().typesFormat.date.patterns) {\r\n          if (isMatch(payload[key], pattern)) {\r\n            const valueAsDate = parse(payload[key], pattern, new Date());\r\n            if (valueAsDate) {\r\n              payload[key] = valueAsDate;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        if (payload[key] instanceof Date) {\r\n          continue;\r\n        }\r\n      }\r\n\r\n      payload[key] = this.resolvePayloadType(key, payload[key], isProjection);\r\n    }\r\n\r\n    return payload;\r\n  }\r\n\r\n  private static resolvePayloadType<T extends BaseResource>(key: string, payload: object, isProjection?: boolean): object {\r\n    if (isNil(payload)) {\r\n      return payload;\r\n    } else if (isArray(payload)) {\r\n      for (let i = 0; i < payload.length; i++) {\r\n        payload[i] = this.resolvePayloadType(key, payload[i], isProjection);\r\n      }\r\n    } else if (isProjection && isPlainObject(payload)) {\r\n      // Need to check resource projection relation props because some inner props can be objects that can be also resources\r\n      payload = this.resolvePayloadProperties(this.createResourceProjectionRel(key, payload), isProjection);\r\n    } else if (isEmbeddedResource(payload) || ResourceUtils.EMBEDDED_RESOURCE_TYPE_MAP.get(key)) {\r\n      // Need to check embedded resource props because some inner props can be objects that can be also resources\r\n      payload = this.resolvePayloadProperties(this.createEmbeddedResource(key, payload), isProjection);\r\n    } else if (isResource(payload)) {\r\n      // Need to check resource props because some inner props can be objects that can be also resources\r\n      payload = this.resolvePayloadProperties(this.createResource(payload), isProjection);\r\n    }\r\n\r\n    return payload;\r\n  }\r\n\r\n  private static createResource<T extends BaseResource>(payload: any, isProjection?: boolean): T {\r\n    const resourceName = this.findResourceName(payload);\r\n    let resourceClass;\r\n    if (isProjection && !ResourceUtils.RESOURCE_NAME_PROJECTION_TYPE_MAP.get(resourceName)) {\r\n      resourceClass = ResourceUtils.RESOURCE_NAME_TYPE_MAP.get(resourceName);\r\n      ConsoleLogger.prettyWarn('Not found projection resource type when create resource projection: \\'' + resourceName + '\\' so used resource type: \\'' + (resourceClass ? resourceClass?.name : ' default Resource') + '\\'. \\n\\r' +\r\n        'It can be when you pass projection param as http request directly instead use projection type with @HateoasProjection.\\n\\r' +\r\n        '\\n\\rSee more how to use @HateoasProjection here https://github.com/lagoshny/ngx-hateoas-client#resource-projection-support.');\r\n    } else {\r\n      resourceClass = isProjection\r\n        ? ResourceUtils.RESOURCE_NAME_PROJECTION_TYPE_MAP.get(resourceName)\r\n        : ResourceUtils.RESOURCE_NAME_TYPE_MAP.get(resourceName);\r\n    }\r\n\r\n    if (resourceClass) {\r\n      return Object.assign(new (resourceClass)() as T, payload);\r\n    } else {\r\n      ConsoleLogger.prettyWarn('Not found resource type when create resource: \\'' + resourceName + '\\' so used default Resource type, for this can be some reasons: \\n\\r' +\r\n        '1) You did not pass resource property name as \\'' + resourceName + '\\' with @HateoasResource decorator. \\n\\r' +\r\n        '2) You did not declare resource type in configuration \"configuration.useTypes.resources\". \\n\\r' +\r\n        '\\n\\rSee more about declare resource types here: https://github.com/lagoshny/ngx-hateoas-client#usetypes-params..');\r\n\r\n      return Object.assign(new this.resourceType(), payload);\r\n    }\r\n  }\r\n\r\n  private static createResourceProjectionRel<T extends Resource>(relationName: string, payload: any): T {\r\n    const relationClass = ResourceUtils.RESOURCE_PROJECTION_REL_NAME_TYPE_MAP.get(relationName);\r\n    if (relationClass) {\r\n      return Object.assign(new (relationClass)() as T, payload);\r\n    } else {\r\n      ConsoleLogger.prettyWarn('Not found resource relation type when create relation: \\'' + relationName + '\\' so used default Resource type, for this can be some reasons: \\n\\r' +\r\n        'You did not pass relation type property with @ProjectionRel decorator on relation property \\'' + relationName + '\\'. \\n\\r' +\r\n        '\\n\\rSee more how to use @ProjectionRel here https://github.com/lagoshny/ngx-hateoas-client#resource-projection-support.');\r\n\r\n      return Object.assign(new this.resourceType(), payload);\r\n    }\r\n  }\r\n\r\n  private static createEmbeddedResource<T extends BaseResource>(key: string, payload: any): T {\r\n    const resourceClass = ResourceUtils.EMBEDDED_RESOURCE_TYPE_MAP.get(key);\r\n    if (resourceClass) {\r\n      return Object.assign(new (resourceClass)() as T, payload);\r\n    } else {\r\n      ConsoleLogger.prettyWarn('Not found embedded resource type when create resource: \\'' + key + '\\' so used default EmbeddedResource type, for this can be some reasons:. \\n\\r' +\r\n        '1) You did not pass embedded resource property name as \\'' + key + '\\' with @HateoasEmbeddedResource decorator. \\n\\r' +\r\n        '2) You did not declare embedded resource type in configuration \"configuration.useTypes.embeddedResources\". \\n\\r' +\r\n        '\\n\\r See more about declare resource types here: https://github.com/lagoshny/ngx-hateoas-client#usetypes-params.');\r\n\r\n      return Object.assign(new this.embeddedResourceType(), payload);\r\n    }\r\n  }\r\n\r\n  public static instantiateResourceCollection<T extends ResourceCollection<BaseResource>>(payload: object, isProjection?: boolean): T {\r\n    if (isEmpty(payload)\r\n      || (!isObject(payload['_links']) || isEmpty(payload['_links']))\r\n      || (!LibConfig.getConfig().halFormat.collections.embeddedOptional &&\r\n        (!('_embedded' in payload) || !isObject(payload['_embedded']) || isEmpty(payload['_embedded'])))) {\r\n      return null;\r\n    }\r\n    const result = new this.resourceCollectionType() as T;\r\n    if ('_embedded' in payload && isObject(payload['_embedded']) && !isEmpty(payload['_embedded'])) {\r\n      for (const resourceName of Object.keys(payload['_embedded'])) {\r\n        payload['_embedded'][resourceName].forEach((resource) => {\r\n          result.resources.push(this.instantiateResource(resource, isProjection));\r\n        });\r\n      }\r\n    }\r\n    result['_links'] = {...payload['_links']};\r\n\r\n    return result;\r\n  }\r\n\r\n  public static instantiatePagedResourceCollection<T extends PagedResourceCollection<BaseResource>>(payload: object,\r\n                                                                                                    isProjection?: boolean): T {\r\n    const resourceCollection = this.instantiateResourceCollection(payload, isProjection);\r\n    if (resourceCollection == null) {\r\n      return null;\r\n    }\r\n\r\n    let result;\r\n    if (payload['page']) {\r\n      result = new this.pagedResourceCollectionType(resourceCollection, payload as PageData);\r\n    } else {\r\n      result = new this.pagedResourceCollectionType(resourceCollection);\r\n    }\r\n    return result as T;\r\n  }\r\n\r\n  /**\r\n   * Resolve request body relations.\r\n   * If request body has {@link Resource} value then this value will be replaced by resource self link.\r\n   * If request body has {@link ValuesOption} it will be applied to body values.\r\n   *\r\n   * @param requestBody that contains the body directly and optional body values option {@link ValuesOption}\r\n   */\r\n  public static resolveValues(requestBody: RequestBody<any>): any {\r\n    if (isEmpty(requestBody) || isNil(requestBody.body)\r\n      || (LibConfig.getConfig().halFormat.json.convertEmptyObjectToNull\r\n        && !isArray(requestBody.body) && isObject(requestBody.body) && isEmpty(requestBody.body))) {\r\n      StageLogger.stageLog(Stage.RESOLVE_VALUES, {result: 'body is empty return null'});\r\n      return null;\r\n    }\r\n\r\n    const body = requestBody.body;\r\n    if (!isObject(body) || isArray(body)) {\r\n      StageLogger.stageLog(Stage.RESOLVE_VALUES, {result: 'body is not object or array return as is'});\r\n      return body;\r\n    }\r\n\r\n    let includeOptions = requestBody?.valuesOption?.include;\r\n    if (!isArray(includeOptions)) {\r\n      includeOptions = [includeOptions];\r\n    }\r\n\r\n    const result: object = {};\r\n    for (const key in body) {\r\n      if (!body.hasOwnProperty(key)) {\r\n        continue;\r\n      }\r\n      if (body[key] == null && includes(includeOptions, Include.NULL_VALUES)) {\r\n        result[key] = null;\r\n        continue;\r\n      }\r\n      if (isNil(body[key])) {\r\n        continue;\r\n      }\r\n      if (isArray(body[key])) {\r\n        const array: any[] = body[key];\r\n        result[key] = [];\r\n        array.forEach((element) => {\r\n          if (isResource(element) && !includes(includeOptions, Include.REL_RESOURCES_AS_OBJECTS)) {\r\n            result[key].push(element?._links?.self?.href);\r\n          } else {\r\n            result[key].push(this.resolveValues({body: element, valuesOption: requestBody?.valuesOption}));\r\n          }\r\n        });\r\n      } else if (isResource(body[key]) && !includes(includeOptions, Include.REL_RESOURCES_AS_OBJECTS)) {\r\n        result[key] = body[key]._links?.self?.href;\r\n      } else if (isPlainObject(body[key])) {\r\n        result[key] = this.resolveValues({body: body[key], valuesOption: requestBody?.valuesOption});\r\n      } else {\r\n        result[key] = body[key];\r\n      }\r\n    }\r\n    StageLogger.stageLog(Stage.RESOLVE_VALUES, {result});\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Assign {@link Resource} or {@link EmbeddedResource} properties to passed entity.\r\n   *\r\n   * @param entity to be converter to resource\r\n   */\r\n  public static initResource(entity: any): BaseResource | any {\r\n    if (isResource(entity)) {\r\n      return Object.assign(new this.resourceType(), entity);\r\n    } else if (isEmbeddedResource(entity)) {\r\n      return Object.assign(new this.embeddedResourceType(), entity);\r\n    } else {\r\n      return entity;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Define resource name based on resource links.\r\n   * It will get link name that href equals to self href resource link.\r\n   *\r\n   * @param payload that can be a resource for which to find the name\r\n   */\r\n  private static findResourceName(payload: object): string {\r\n    if (!payload || !payload['_links'] || !payload['_links'].self) {\r\n      return '';\r\n    }\r\n    const resourceLinks = payload['_links'] as Link;\r\n    if (isEmpty(resourceLinks) || isEmpty(resourceLinks.self) || isNil(resourceLinks.self.href)) {\r\n      return '';\r\n    }\r\n\r\n    return UrlUtils.getResourceNameFromUrl(UrlUtils.removeTemplateParams(resourceLinks.self.href));\r\n  }\r\n\r\n  /**\r\n   * Checks is a resource projection or not.\r\n   *\r\n   * @param payload object that can be resource or resource projection\r\n   */\r\n  private static isResourceProjection(payload: object): boolean {\r\n    if (!payload || !payload['_links'] || !payload['_links'].self) {\r\n      return false;\r\n    }\r\n\r\n    const selfLink = payload['_links'].self;\r\n    const resourceLinks = payload['_links'];\r\n    for (const key of Object.keys(resourceLinks)) {\r\n      if (key !== 'self' && resourceLinks[key].href.includes(selfLink.href)) {\r\n        return new URL(resourceLinks[key].href).search.includes('projection');\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  /**\r\n   * Try to get projectionName from resource type and set it to options. If resourceType has not projectionName then return options as is.\r\n   *\r\n   * @param resourceType from get projectionName\r\n   * @param options to set projectionName\r\n   */\r\n  public static fillProjectionNameFromResourceType<T extends Resource>(resourceType: new () => T, options?: GetOption) {\r\n    if (!resourceType) {\r\n      return;\r\n    }\r\n    const projectionName = resourceType['__projectionName__'];\r\n    if (projectionName) {\r\n      options = options ? options : {params: {}};\r\n      options = {\r\n        ...options,\r\n        params: {\r\n          ...options.params,\r\n          projection: projectionName\r\n        }\r\n      };\r\n    }\r\n\r\n    return options;\r\n  }\r\n\r\n}\r\n","import { HttpParams } from '@angular/common/http';\r\n\r\n/**\r\n * Contains all needed information about a resource.\r\n * It generates a string cache key to hold in a cache map from information about a resource.\r\n */\r\nexport class CacheKey {\r\n\r\n  /**\r\n   * String cache key value.\r\n   */\r\n  public value: string;\r\n\r\n  private constructor(public readonly url: string, private readonly options: {\r\n    observe?: 'body' | 'response';\r\n    params?: HttpParams\r\n  }) {\r\n    this.value = `url=${ this.url }`;\r\n    if (options) {\r\n      if (options.params && options.params.keys().length > 0) {\r\n        this.value += `${ this.value.includes('?') ? '&' : '?' }${ this.options?.params?.toString() }`;\r\n      }\r\n      if (options.observe) {\r\n        this.value += `&observe=${ this.options?.observe }`;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Create cache key from resource url and request params.\r\n   *\r\n   * @param url resource url\r\n   * @param params request params\r\n   */\r\n  public static of(url: string, params: {\r\n    observe?: 'body' | 'response';\r\n    params?: HttpParams\r\n  }): CacheKey {\r\n    return new CacheKey(url, params);\r\n  }\r\n\r\n}\r\n","import { LibConfig } from '../config/lib-config';\r\nimport { CacheMode } from '../model/declarations';\r\nimport { isBoolean } from 'lodash-es';\r\n\r\nexport class CacheUtils {\r\n\r\n  /**\r\n   * Checks that cache is enabled and applying used cached mode.\r\n   *\r\n   * When mode is CacheMode.ALWAYS then only when passed param useCache === false will not be using cache.\r\n   * When mode is CacheMode.ON_DEMAND then only when passed param useCache === true be using cache.\r\n   *\r\n   * @param useCache desired param can be undefined when caller has not passed it\r\n   */\r\n  public static shouldUseCache(useCache: boolean): boolean {\r\n    return LibConfig.getConfig().cache.enabled &&\r\n      ((CacheMode.ALWAYS === LibConfig.getConfig().cache.mode && (!isBoolean(useCache) || useCache))\r\n      || (CacheMode.ON_DEMAND === LibConfig.getConfig().cache.mode && isBoolean(useCache) && useCache));\r\n  }\r\n\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Observable, of as observableOf } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\nimport { StageLogger } from '../logger/stage-logger';\r\nimport { Stage } from '../logger/stage.enum';\r\nimport { ValidationUtils } from '../util/validation.utils';\r\nimport { CacheKey } from './internal/cache/model/cache-key';\r\nimport { isResourceObject } from '../model/resource-type';\r\nimport { ResourceCacheService } from './internal/cache/resource-cache.service';\r\nimport { LibConfig } from '../config/lib-config';\r\nimport { HttpClientOptions, ResourceIdentifiable } from '../model/declarations';\r\nimport { CacheUtils } from '../util/cache.utils';\r\n\r\n/**\r\n * Base class with common logics to perform HTTP requests.\r\n */\r\n\r\n/* tslint:disable:no-string-literal */\r\nexport class HttpExecutor {\r\n\r\n  constructor(protected httpClient: HttpClient,\r\n              protected cacheService: ResourceCacheService) {\r\n  }\r\n\r\n  private static logRequest(method: string,\r\n                            url: string,\r\n                            options: HttpClientOptions,\r\n                            body?: any) {\r\n    const params = {\r\n      method,\r\n      url,\r\n      options: {\r\n        ...options,\r\n        params: options?.params?.keys().length > 0 ? options?.params.toString() : '',\r\n      }\r\n    };\r\n    if (body) {\r\n      params['body'] = body;\r\n    }\r\n    StageLogger.stageLog(Stage.HTTP_REQUEST, params);\r\n  }\r\n\r\n  private static logResponse(method: string,\r\n                             url: string,\r\n                             options: HttpClientOptions,\r\n                             data: any) {\r\n    StageLogger.stageLog(Stage.HTTP_RESPONSE, {\r\n      method,\r\n      url,\r\n      options: {\r\n        ...options,\r\n        params: options?.params?.keys().length > 0 ? options?.params.toString() : '',\r\n      },\r\n      result: data\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Perform GET request.\r\n   *\r\n   * @param url to perform request\r\n   * @param options (optional) options that applied to the request\r\n   * @param useCache value {@code true} if need to use cache, {@code false} otherwise\r\n   * @throws error when required params are not valid\r\n   */\r\n  public getHttp(url: string,\r\n                 options?: HttpClientOptions,\r\n                 useCache?: boolean): Observable<any> {\r\n    ValidationUtils.validateInputParams({url});\r\n    if (CacheUtils.shouldUseCache(useCache)) {\r\n      const cachedValue = this.cacheService.getResource(CacheKey.of(url, options));\r\n      if (cachedValue != null) {\r\n        return observableOf(cachedValue);\r\n      }\r\n    }\r\n    HttpExecutor.logRequest('GET', url, options);\r\n\r\n    let response: Observable<object>;\r\n    if (options?.observe === 'response') {\r\n      response = this.httpClient.get(url, {...options, observe: 'response'});\r\n    } else {\r\n      response = this.httpClient.get(url, {...options, observe: 'body'});\r\n    }\r\n\r\n    return response.pipe(\r\n      tap((data: any) => {\r\n        HttpExecutor.logResponse('GET', url, options, data);\r\n        if (CacheUtils.shouldUseCache(useCache) && isResourceObject(data)) {\r\n          this.cacheService.putResource(CacheKey.of(url, options), data as ResourceIdentifiable);\r\n        }\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Perform POST request.\r\n   *\r\n   * @param url to perform request\r\n   * @param body to send with request\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public postHttp(url: string, body: any | null, options?: HttpClientOptions): Observable<any> {\r\n    HttpExecutor.logRequest('POST', url, options, body);\r\n    ValidationUtils.validateInputParams({url});\r\n\r\n    let response: Observable<object>;\r\n    if (options?.observe === 'response') {\r\n      response = this.httpClient.post(url, body, {...options, observe: 'response'});\r\n    } else {\r\n      response = this.httpClient.post(url, body, {...options, observe: 'body'});\r\n    }\r\n\r\n    return response.pipe(\r\n      tap((data) => {\r\n        HttpExecutor.logResponse('POST', url, options, data);\r\n        if (LibConfig.getConfig().cache.enabled) {\r\n          this.cacheService.evictResource(CacheKey.of(url, options));\r\n        }\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Perform PUT request.\r\n   *\r\n   * @param url to perform request\r\n   * @param body to send with request\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public putHttp(url: string, body: any | null, options?: HttpClientOptions): Observable<any> {\r\n    HttpExecutor.logRequest('PUT', url, options, body);\r\n    ValidationUtils.validateInputParams({url});\r\n\r\n    let response: Observable<object>;\r\n    if (options?.observe === 'response') {\r\n      response = this.httpClient.put(url, body, {...options, observe: 'response'});\r\n    } else {\r\n      response = this.httpClient.put(url, body, {...options, observe: 'body'});\r\n    }\r\n\r\n    return response.pipe(\r\n      tap((data) => {\r\n        HttpExecutor.logResponse('PUT', url, options, data);\r\n        if (LibConfig.getConfig().cache.enabled) {\r\n          this.cacheService.evictResource(CacheKey.of(url, options));\r\n        }\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Perform PATCH request.\r\n   *\r\n   * @param url to perform request\r\n   * @param body to send with request\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public patchHttp(url: string, body: any | null, options?: HttpClientOptions): Observable<any> {\r\n    HttpExecutor.logRequest('PATCH', url, options, body);\r\n    ValidationUtils.validateInputParams({url});\r\n\r\n    let response: Observable<object>;\r\n    if (options?.observe === 'response') {\r\n      response = this.httpClient.patch(url, body, {...options, observe: 'response'});\r\n    } else {\r\n      response = this.httpClient.patch(url, body, {...options, observe: 'body'});\r\n    }\r\n\r\n    return response.pipe(\r\n      tap((data) => {\r\n        HttpExecutor.logResponse('PATCH', url, options, data);\r\n        if (LibConfig.getConfig().cache.enabled) {\r\n          this.cacheService.evictResource(CacheKey.of(url, options));\r\n        }\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Perform DELETE request.\r\n   *\r\n   * @param url to perform request\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public deleteHttp(url: string, options?: HttpClientOptions): Observable<any> {\r\n    HttpExecutor.logRequest('DELETE', url, options);\r\n    ValidationUtils.validateInputParams({url});\r\n\r\n    let response: Observable<object>;\r\n    if (options?.observe === 'response') {\r\n      response = this.httpClient.delete(url, {...options, observe: 'response'});\r\n    } else {\r\n      response = this.httpClient.delete(url, {...options, observe: 'body'});\r\n    }\r\n\r\n    return response.pipe(\r\n      tap((data) => {\r\n        HttpExecutor.logResponse('DELETE', url, options, data);\r\n        if (LibConfig.getConfig().cache.enabled) {\r\n          this.cacheService.evictResource(CacheKey.of(url, options));\r\n        }\r\n      })\r\n    );\r\n  }\r\n\r\n}\r\n","/**\r\n * Represents cache resource model that contains resource and time when resource was added to the cache.\r\n */\r\nimport { ResourceIdentifiable } from '../../../../model/declarations';\r\n\r\nexport class CachedResource  {\r\n\r\n  /**\r\n   * Cached resource value.\r\n   * It's can be {@link Resource}, {@link ResourceCollection}, {@link PagedResourceCollection}.\r\n   */\r\n  public value: ResourceIdentifiable;\r\n\r\n  /**\r\n   * Time when value was added to the cache.\r\n   */\r\n  public cachedTime: Date;\r\n\r\n  constructor(value: any, cachedTime: Date) {\r\n    this.value = value;\r\n    this.cachedTime = cachedTime;\r\n  }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { CachedResource } from './model/cached-resource';\r\nimport { StageLogger } from '../../../logger/stage-logger';\r\nimport { Stage } from '../../../logger/stage.enum';\r\nimport { CacheKey } from './model/cache-key';\r\nimport { ValidationUtils } from '../../../util/validation.utils';\r\nimport { ResourceIdentifiable } from '../../../model/declarations';\r\nimport { LibConfig } from '../../../config/lib-config';\r\nimport { UrlUtils } from '../../../util/url.utils';\r\nimport { isEmpty, isNil } from 'lodash-es';\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class ResourceCacheService {\r\n\r\n  private cacheMap: Map<string, CachedResource> = new Map<string, CachedResource>();\r\n\r\n  /**\r\n   * Get cached resource value.\r\n   *\r\n   * @param key cache key\r\n   * @return cached value or {@code null} when cached value is not exist or expired\r\n   */\r\n  public getResource(key: CacheKey): ResourceIdentifiable {\r\n    ValidationUtils.validateInputParams({key});\r\n\r\n    const cacheValue = this.cacheMap.get(key.value);\r\n    if (isNil(cacheValue)) {\r\n      StageLogger.stageLog(Stage.CACHE_GET, {cacheKey: key.value, result: null});\r\n      return null;\r\n    }\r\n\r\n    const cacheExpiredTime = new Date(cacheValue.cachedTime);\r\n    cacheExpiredTime.setMilliseconds(cacheExpiredTime.getMilliseconds() + LibConfig.getConfig().cache.lifeTime);\r\n    if (cacheExpiredTime.getTime() < new Date().getTime()) {\r\n      this.evictResource(key);\r\n      StageLogger.stageLog(Stage.CACHE_GET, {cacheKey: key.value, message: 'cache was expired', result: null});\r\n      return null;\r\n    }\r\n\r\n    StageLogger.stageLog(Stage.CACHE_GET, {cacheKey: key.value, result: cacheValue.value});\r\n    return cacheValue.value;\r\n  }\r\n\r\n  /**\r\n   * Add resource value to the cache.\r\n   * Before add new value, previous will be deleted if it was exist.\r\n   *\r\n   * @param key cache key\r\n   * @param value cache value\r\n   */\r\n  public putResource(key: CacheKey, value: ResourceIdentifiable): void {\r\n    ValidationUtils.validateInputParams({key, value});\r\n\r\n    this.cacheMap.set(key.value, new CachedResource(value, new Date()));\r\n\r\n    StageLogger.stageLog(Stage.CACHE_PUT, {cacheKey: key.value, value});\r\n  }\r\n\r\n  /**\r\n   * Delete cached resource value by passed key.\r\n   *\r\n   * @param key cache key\r\n   */\r\n  public evictResource(key: CacheKey): void {\r\n    ValidationUtils.validateInputParams({key});\r\n\r\n    // Get resource name by url to evict all resource cache with collection/paged collection data\r\n    const resourceName = UrlUtils.getResourceNameFromUrl(key.url);\r\n    if (!resourceName) {\r\n      return;\r\n    }\r\n\r\n    const evictedCache = [];\r\n    for (const cacheKey of this.cacheMap.keys()) {\r\n      const resourceRoute = UrlUtils.guessResourceRoute(key.url);\r\n\r\n      if (cacheKey.startsWith(`url=${ resourceRoute.rootUrl }/${ resourceName }`) ||\r\n        (!isEmpty(resourceRoute.proxyUrl) && cacheKey.startsWith(`url=${ resourceRoute.proxyUrl }/${ resourceName }`))) {\r\n        evictedCache.push({\r\n          key: cacheKey\r\n        });\r\n        this.cacheMap.delete(cacheKey);\r\n      }\r\n    }\r\n    if (evictedCache.length > 0) {\r\n      StageLogger.stageLog(Stage.CACHE_EVICT, {cacheKey: key.value, evicted: evictedCache});\r\n    }\r\n  }\r\n\r\n  public evictAll(): void {\r\n    this.cacheMap.clear();\r\n    StageLogger.stageLog(Stage.CACHE_EVICT_ALL, {message: 'All resources cache evicted'});\r\n  }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, throwError as observableThrowError } from 'rxjs';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { ResourceUtils } from '../../util/resource.utils';\r\nimport { BaseResource } from '../../model/resource/base-resource';\r\nimport { DependencyInjector } from '../../util/dependency-injector';\r\nimport { UrlUtils } from '../../util/url.utils';\r\nimport { getResourceType, isResource } from '../../model/resource-type';\r\nimport { GetOption, RequestOption } from '../../model/declarations';\r\nimport { HttpExecutor } from '../http-executor';\r\nimport { LibConfig } from '../../config/lib-config';\r\nimport { Stage } from '../../logger/stage.enum';\r\nimport { StageLogger } from '../../logger/stage-logger';\r\nimport { ValidationUtils } from '../../util/validation.utils';\r\nimport { toString } from 'lodash-es';\r\nimport { CacheKey } from './cache/model/cache-key';\r\nimport { ResourceCacheService } from './cache/resource-cache.service';\r\nimport { ResourceOption } from '../../config/hateoas-configuration.interface';\r\n\r\n/**\r\n * Get instance of the ResourceHttpService by Angular DependencyInjector.\r\n */\r\nexport function getResourceHttpService(): ResourceHttpService {\r\n  return DependencyInjector.get(ResourceHttpService);\r\n}\r\n\r\n/**\r\n * Service to perform HTTP requests to get {@link Resource} type.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class ResourceHttpService extends HttpExecutor {\r\n\r\n  constructor(httpClient: HttpClient,\r\n              cacheService: ResourceCacheService) {\r\n    super(httpClient, cacheService);\r\n  }\r\n\r\n  /**\r\n   * Perform GET request to retrieve resource.\r\n   *\r\n   * @param url to perform request\r\n   * @param options request options\r\n   * @throws error when required params are not valid or returned resource type is not resource\r\n   */\r\n  public get<T extends BaseResource>(url: string,\r\n                                     options?: GetOption): Observable<T> {\r\n    const httpOptions = UrlUtils.convertToHttpOptions(options);\r\n    return super.getHttp(url, httpOptions, options?.useCache)\r\n      .pipe(\r\n        map((data: any) => {\r\n          if (!isResource(data)) {\r\n            if (LibConfig.getConfig().cache.enabled) {\r\n              this.cacheService.evictResource(CacheKey.of(url, httpOptions));\r\n            }\r\n            const errMsg = `You try to get wrong resource type: expected Resource type, actual ${ getResourceType(data) } type.`;\r\n            StageLogger.stageErrorLog(Stage.INIT_RESOURCE, {\r\n              options,\r\n              error: errMsg\r\n            });\r\n            throw new Error(errMsg);\r\n          }\r\n\r\n          return ResourceUtils.instantiateResource(data, httpOptions?.params?.has('projection')) as T;\r\n        }),\r\n        catchError(error => observableThrowError(error)));\r\n  }\r\n\r\n  /**\r\n   * Perform POST request.\r\n   *\r\n   * @param url to perform request\r\n   * @param body request body\r\n   * @param options request options\r\n   * @throws error when required params are not valid\r\n   */\r\n  public post(url: string, body: any | null, options?: RequestOption): Observable<any> {\r\n    return super.postHttp(url, body, UrlUtils.convertToHttpOptions(options))\r\n      .pipe(\r\n        map((data: any) => {\r\n          if (isResource(data)) {\r\n            return ResourceUtils.instantiateResource(data);\r\n          }\r\n          return data;\r\n        }),\r\n        catchError(error => observableThrowError(error))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Perform PUT request.\r\n   *\r\n   * @param url to perform request\r\n   * @param body request body\r\n   * @param options request options\r\n   * @throws error when required params are not valid\r\n   */\r\n  public put(url: string, body: any | null, options?: RequestOption): Observable<any> {\r\n    return super.putHttp(url, body, UrlUtils.convertToHttpOptions(options))\r\n      .pipe(\r\n        map((data: any) => {\r\n          if (isResource(data)) {\r\n            return ResourceUtils.instantiateResource(data);\r\n          }\r\n          return data;\r\n        }),\r\n        catchError(error => observableThrowError(error))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Perform PATCH request.\r\n   *\r\n   * @param url to perform request\r\n   * @param body request body\r\n   * @param options request options\r\n   * @throws error when required params are not valid\r\n   */\r\n  public patch(url: string, body: any | null, options?: RequestOption): Observable<any> {\r\n    return super.patchHttp(url, body, UrlUtils.convertToHttpOptions(options))\r\n      .pipe(\r\n        map((data: any) => {\r\n          if (isResource(data)) {\r\n            return ResourceUtils.instantiateResource(data);\r\n          }\r\n\r\n          return data;\r\n        }),\r\n        catchError(error => observableThrowError(error))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Perform DELETE request.\r\n   *\r\n   * @param url to perform request\r\n   * @param options request options\r\n   * @throws error when required params are not valid\r\n   */\r\n  public delete(url: string, options?: RequestOption): Observable<any> {\r\n    return super.deleteHttp(url, {\r\n      ...UrlUtils.convertToHttpOptions(options),\r\n      observe: options?.observe ? options?.observe : 'response'\r\n    })\r\n      .pipe(\r\n        map((data: any) => {\r\n          if (isResource(data)) {\r\n            return ResourceUtils.instantiateResource(data);\r\n          }\r\n          return data;\r\n        }),\r\n        catchError(error => observableThrowError(error))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Perform get resource request with url built by the resource name.\r\n   *\r\n   * @param resourceName used to build root url to the resource\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param id resource id\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public getResource<T extends BaseResource>(resourceName: string,\r\n                                             resourceOptions: ResourceOption,\r\n                                             id: number | string,\r\n                                             options?: GetOption): Observable<T> {\r\n    ValidationUtils.validateInputParams({resourceName, id});\r\n\r\n    const url = UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName).concat('/', toString(id));\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }', id: '${ id }'`,\r\n      options\r\n    });\r\n\r\n    return this.get(url, options);\r\n  }\r\n\r\n  /**\r\n   * Perform POST resource request with url built by the resource name.\r\n   *\r\n   * @param resourceName to be post\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param body resource to create\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public postResource(resourceName: string,\r\n                      resourceOptions: ResourceOption,\r\n                      body: BaseResource,\r\n                      options?: RequestOption): Observable<any> {\r\n    ValidationUtils.validateInputParams({resourceName, body});\r\n\r\n    const url = UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName);\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }'`,\r\n      options\r\n    });\r\n\r\n    return this.post(url, body, options);\r\n  }\r\n\r\n  /**\r\n   * Perform PATCH resource request with url built by the resource name and resource id.\r\n   *\r\n   * @param resourceName to be patched\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param id resource id\r\n   * @param body contains data to patch resource properties\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public patchResource(resourceName: string,\r\n                       resourceOptions: ResourceOption,\r\n                       id: number | string,\r\n                       body: any,\r\n                       options?: RequestOption): Observable<any> {\r\n    ValidationUtils.validateInputParams({resourceName, id, body});\r\n\r\n    const url = UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName, toString(id));\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }', resourceId: '${ id }'`,\r\n      options\r\n    });\r\n\r\n    return this.patch(url, body, options);\r\n  }\r\n\r\n  /**\r\n   * Perform PUT resource request with url built by the resource name and resource id.\r\n   *\r\n   * @param resourceName to be put\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param id resource id\r\n   * @param body contains data to replace resource properties\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public putResource(resourceName: string,\r\n                     resourceOptions: ResourceOption,\r\n                     id: number | string,\r\n                     body: any,\r\n                     options?: RequestOption): Observable<any> {\r\n    ValidationUtils.validateInputParams({resourceName, id, body});\r\n\r\n    const url = UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName, toString(id));\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }', resourceId: '${ id }'`,\r\n      options\r\n    });\r\n\r\n    return this.put(url, body, options);\r\n  }\r\n\r\n  /**\r\n   * Perform DELETE resource request with url built by the resource name and resource id.\r\n   *\r\n   * @param resourceName to be deleted\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param id resource id\r\n   * @param options (optional) additional options that will be applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public deleteResource(resourceName: string,\r\n                        resourceOptions: ResourceOption,\r\n                        id: number | string,\r\n                        options?: RequestOption): Observable<any> {\r\n    ValidationUtils.validateInputParams({resourceName, id});\r\n\r\n    const url = UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName, toString(id));\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }', resourceId: '${ id }'`,\r\n      options\r\n    });\r\n\r\n    return this.delete(url, options);\r\n  }\r\n\r\n  /**\r\n   * Perform search single resource request with url built by the resource name.\r\n   *\r\n   * @param resourceName used to build root url to the resource\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param searchQuery name of the search method\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public search<T extends BaseResource>(resourceName: string,\r\n                                        resourceOptions: ResourceOption,\r\n                                        searchQuery: string,\r\n                                        options?: GetOption): Observable<T> {\r\n    ValidationUtils.validateInputParams({resourceName, searchQuery});\r\n\r\n    const url = UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName)\r\n      .concat('/search/' + searchQuery);\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }', searchQuery: '${ searchQuery }'`,\r\n      options\r\n    });\r\n\r\n    return this.get(url, options);\r\n  }\r\n\r\n}\r\n","import { Link, LinkData } from '../declarations';\r\nimport { isEmpty } from 'lodash-es';\r\n\r\n/**\r\n * Abstract impl identifies resource interface.\r\n */\r\nexport abstract class AbstractResource {\r\n\r\n  /**\r\n   * List of links related with the resource.\r\n   */\r\n    // tslint:disable-next-line:variable-name\r\n  protected _links: Link;\r\n\r\n  /**\r\n   * Get relation link by relation name.\r\n   *\r\n   * @param relationName used to get the specific resource relation link\r\n   * @throws error if no link is found by passed relation name\r\n   */\r\n  public getRelationLink(relationName: string): LinkData {\r\n    if (isEmpty(this._links)) {\r\n      throw new Error(`Resource '${ this.constructor.name }' relation links are empty, can not to get relation with the name '${ relationName }'.`);\r\n    }\r\n\r\n    const relationLink = this._links[relationName];\r\n    if (isEmpty(relationLink) || isEmpty(relationLink.href)) {\r\n      throw new Error(`Resource '${ this.constructor.name }' has not relation link with the name '${ relationName }'.`);\r\n    }\r\n\r\n    return relationLink;\r\n  }\r\n\r\n  /**\r\n   * Checks if relation link is present.\r\n   *\r\n   * @param relationName used to check for the specified relation name\r\n   * @returns true if link is present, false otherwise\r\n   */\r\n  public hasRelation(relationName: string): boolean {\r\n    if (isEmpty(this._links)) {\r\n      return false;\r\n    } else {\r\n      return !isEmpty(this._links[relationName]);\r\n    }\r\n  }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { LibConfig } from '../../config/lib-config';\r\nimport { Observable, throwError as observableThrowError } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { getResourceType, isResourceCollection } from '../../model/resource-type';\r\nimport { ResourceUtils } from '../../util/resource.utils';\r\nimport { ResourceCollection } from '../../model/resource/resource-collection';\r\nimport { BaseResource } from '../../model/resource/base-resource';\r\nimport { DependencyInjector } from '../../util/dependency-injector';\r\nimport { GetOption } from '../../model/declarations';\r\nimport { UrlUtils } from '../../util/url.utils';\r\nimport { HttpExecutor } from '../http-executor';\r\nimport { StageLogger } from '../../logger/stage-logger';\r\nimport { Stage } from '../../logger/stage.enum';\r\nimport { ValidationUtils } from '../../util/validation.utils';\r\nimport { CacheKey } from './cache/model/cache-key';\r\nimport { ResourceCacheService } from './cache/resource-cache.service';\r\nimport { ResourceOption } from '../../config/hateoas-configuration.interface';\r\n\r\nexport function getResourceCollectionHttpService(): ResourceCollectionHttpService {\r\n  return DependencyInjector.get(ResourceCollectionHttpService);\r\n}\r\n\r\n/**\r\n * Service to perform HTTP requests to get {@link ResourceCollection} type.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class ResourceCollectionHttpService extends HttpExecutor {\r\n\r\n  constructor(httpClient: HttpClient,\r\n              cacheService: ResourceCacheService) {\r\n    super(httpClient, cacheService);\r\n  }\r\n\r\n  /**\r\n   * Perform GET request to retrieve collection of the resources.\r\n   *\r\n   * @param url to perform request\r\n   * @param options request options\r\n   * @throws error when required params are not valid or returned resource type is not collection of the resources\r\n   */\r\n  public get<T extends ResourceCollection<BaseResource>>(url: string,\r\n                                                         options?: GetOption): Observable<T> {\r\n    const httpOptions = UrlUtils.convertToHttpOptions(options);\r\n\r\n    return super.getHttp(url, httpOptions, options?.useCache)\r\n      .pipe(\r\n        map((data: any) => {\r\n          if (!isResourceCollection(data)) {\r\n            if (LibConfig.getConfig().cache.enabled) {\r\n              this.cacheService.evictResource(CacheKey.of(url, httpOptions));\r\n            }\r\n            const errMsg = `You try to get the wrong resource type: expected ResourceCollection type, actual ${ getResourceType(data) } type.`;\r\n            StageLogger.stageErrorLog(Stage.INIT_RESOURCE, {error: errMsg, options});\r\n            throw new Error(errMsg);\r\n          }\r\n\r\n          return ResourceUtils.instantiateResourceCollection(data, httpOptions?.params?.has('projection')) as T;\r\n        }),\r\n        catchError(error => observableThrowError(error)));\r\n  }\r\n\r\n  /**\r\n   * Perform get resource collection request with url built by the resource name.\r\n   *\r\n   * @param resourceName used to build root url to the resource\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public getResourceCollection<T extends ResourceCollection<BaseResource>>(resourceName: string,\r\n                                                                           resourceOptions: ResourceOption,\r\n                                                                           options?: GetOption): Observable<T> {\r\n    ValidationUtils.validateInputParams({resourceName});\r\n\r\n    const url = UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName);\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }'`,\r\n      options\r\n    });\r\n\r\n    return this.get(url, options);\r\n  }\r\n\r\n  /**\r\n   *  Perform search resource collection request with url built by the resource name.\r\n   *\r\n   * @param resourceName used to build root url to the resource\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param searchQuery name of the search method\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public search<T extends ResourceCollection<BaseResource>>(resourceName: string,\r\n                                                            resourceOptions: ResourceOption,\r\n                                                            searchQuery: string,\r\n                                                            options?: GetOption): Observable<T> {\r\n    ValidationUtils.validateInputParams({resourceName, searchQuery});\r\n\r\n    const url = UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName)\r\n      .concat('/search/' + searchQuery);\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }', searchQuery: '${ searchQuery }'`,\r\n      options\r\n    });\r\n\r\n    return this.get(url, options);\r\n  }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BaseResource } from '../../model/resource/base-resource';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { LibConfig } from '../../config/lib-config';\r\nimport { PagedResourceCollection } from '../../model/resource/paged-resource-collection';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { getResourceType, isPagedResourceCollection } from '../../model/resource-type';\r\nimport { Observable, throwError as observableThrowError } from 'rxjs';\r\nimport { ResourceUtils } from '../../util/resource.utils';\r\nimport { UrlUtils } from '../../util/url.utils';\r\nimport { DependencyInjector } from '../../util/dependency-injector';\r\nimport { PagedGetOption } from '../../model/declarations';\r\nimport { HttpExecutor } from '../http-executor';\r\nimport { StageLogger } from '../../logger/stage-logger';\r\nimport { Stage } from '../../logger/stage.enum';\r\nimport { ValidationUtils } from '../../util/validation.utils';\r\nimport { CacheKey } from './cache/model/cache-key';\r\nimport { ResourceCacheService } from './cache/resource-cache.service';\r\nimport { ResourceOption } from '../../config/hateoas-configuration.interface';\r\n\r\n/**\r\n * Get instance of the PagedResourceCollectionHttpService by Angular DependencyInjector.\r\n */\r\nexport function getPagedResourceCollectionHttpService(): PagedResourceCollectionHttpService {\r\n  return DependencyInjector.get(PagedResourceCollectionHttpService);\r\n}\r\n\r\n/**\r\n * Service to perform HTTP requests to get {@link PagedResourceCollection} type.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class PagedResourceCollectionHttpService extends HttpExecutor {\r\n\r\n  constructor(httpClient: HttpClient,\r\n              cacheService: ResourceCacheService) {\r\n    super(httpClient, cacheService);\r\n  }\r\n\r\n  /**\r\n   * Perform GET request to retrieve paged collection of the resources.\r\n   *\r\n   * @param url to perform request\r\n   * @param options request options\r\n   * @throws error when required params are not valid or returned resource type is not paged collection of the resources\r\n   */\r\n  public get<T extends PagedResourceCollection<BaseResource>>(url: string,\r\n                                                              options?: PagedGetOption): Observable<T> {\r\n    const httpOptions = UrlUtils.convertToHttpOptions(options);\r\n\r\n    return super.getHttp(url, httpOptions, options?.useCache)\r\n      .pipe(\r\n        map((data: any) => {\r\n          if (!isPagedResourceCollection(data)) {\r\n            if (LibConfig.getConfig().cache.enabled) {\r\n              this.cacheService.evictResource(CacheKey.of(url, httpOptions));\r\n            }\r\n            const errMsg = `You try to get wrong resource type: expected PagedResourceCollection type, actual ${ getResourceType(data) } type.`;\r\n            StageLogger.stageErrorLog(Stage.INIT_RESOURCE, {error: errMsg, options});\r\n            throw new Error(errMsg);\r\n          }\r\n\r\n          return ResourceUtils.instantiatePagedResourceCollection(data, httpOptions?.params?.has('projection')) as T;\r\n        }),\r\n        catchError(error => observableThrowError(error)));\r\n  }\r\n\r\n  /**\r\n   * Perform get paged resource collection request with url built by the resource name.\r\n   *\r\n   * @param resourceName used to build root url to the resource\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public getResourcePage<T extends PagedResourceCollection<BaseResource>>(resourceName: string,\r\n                                                                          resourceOptions: ResourceOption,\r\n                                                                          options?: PagedGetOption): Observable<T> {\r\n    ValidationUtils.validateInputParams({resourceName});\r\n\r\n    const url = UrlUtils.removeTemplateParams(UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName));\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }'`,\r\n      options\r\n    });\r\n\r\n    return this.get(url, UrlUtils.fillDefaultPageDataIfNoPresent(options));\r\n  }\r\n\r\n  /**\r\n   *  Perform search paged resource collection request with url built by the resource name.\r\n   *\r\n   * @param resourceName used to build root url to the resource\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param searchQuery name of the search method\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public search<T extends PagedResourceCollection<BaseResource>>(resourceName: string,\r\n                                                                 resourceOptions: ResourceOption,\r\n                                                                 searchQuery: string,\r\n                                                                 options?: PagedGetOption): Observable<T> {\r\n    ValidationUtils.validateInputParams({resourceName, searchQuery});\r\n\r\n    const url = UrlUtils.removeTemplateParams(\r\n      UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName)).concat('/search/' + searchQuery);\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }'`,\r\n      options\r\n    });\r\n\r\n    return this.get(url, UrlUtils.fillDefaultPageDataIfNoPresent(options));\r\n  }\r\n\r\n}\r\n","import { Observable } from 'rxjs';\r\nimport { getResourceHttpService } from '../../service/internal/resource-http.service';\r\nimport { UrlUtils } from '../../util/url.utils';\r\nimport { AbstractResource } from './abstract-resource';\r\nimport { ResourceCollection } from './resource-collection';\r\nimport { getResourceCollectionHttpService } from '../../service/internal/resource-collection-http.service';\r\nimport { GetOption, PagedGetOption, RequestBody, RequestOption } from '../declarations';\r\nimport { HttpResponse } from '@angular/common/http';\r\nimport { getPagedResourceCollectionHttpService } from '../../service/internal/paged-resource-collection-http.service';\r\nimport { PagedResourceCollection } from './paged-resource-collection';\r\nimport { ResourceUtils } from '../../util/resource.utils';\r\nimport { tap } from 'rxjs/operators';\r\nimport { StageLogger } from '../../logger/stage-logger';\r\nimport { ValidationUtils } from '../../util/validation.utils';\r\n\r\n/**\r\n * Common resource class.\r\n */\r\n// tslint:disable:no-string-literal\r\nexport abstract class BaseResource extends AbstractResource {\r\n\r\n  /**\r\n   * Get single resource by the relation name.\r\n   *\r\n   * @param relationName used to get the specific relation link\r\n   * @param options (optional) options that should be applied to the request\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public getRelation<T extends BaseResource>(relationName: string,\r\n                                             options?: GetOption\r\n  ): Observable<T> {\r\n    ValidationUtils.validateInputParams({relationName});\r\n    StageLogger.resourceBeginLog(this, 'GET_RELATION', {relationName, options});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n    const optionsToRequest = relationLink.templated\r\n      ? {...options, params: undefined, sort: undefined}\r\n      : options;\r\n\r\n    return getResourceHttpService()\r\n      .get(UrlUtils.generateLinkUrl(relationLink, options), optionsToRequest)\r\n      .pipe(\r\n        tap(() => {\r\n          StageLogger.resourceEndLog(this, 'GET_RELATION', {result: `relation ${ relationName } was got successful`});\r\n        })\r\n      ) as Observable<T>;\r\n  }\r\n\r\n  /**\r\n   * Get collection of resources by the relation name.\r\n   *\r\n   * @param relationName used to get the specific relation link\r\n   * @param options (optional) options that will be applied to the request\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public getRelatedCollection<T extends ResourceCollection<BaseResource>>(relationName: string,\r\n                                                                          options?: GetOption\r\n  ): Observable<T> {\r\n    ValidationUtils.validateInputParams({relationName});\r\n    StageLogger.resourceBeginLog(this, 'GET_RELATED_COLLECTION', {relationName, options});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n    // For templated links removed some part of params to avoid duplication in template params and http request params\r\n    const optionsToRequest = relationLink.templated\r\n      ? {...options, params: undefined}\r\n      : options;\r\n\r\n    return getResourceCollectionHttpService()\r\n      .get(UrlUtils.generateLinkUrl(relationLink, options), optionsToRequest)\r\n      .pipe(\r\n        tap(() => {\r\n          StageLogger.resourceEndLog(this, 'GET_RELATED_COLLECTION', {result: `related collection ${ relationName } was got successful`});\r\n        })\r\n      ) as Observable<T>;\r\n  }\r\n\r\n  /**\r\n   * Get paged collection of resources by the relation name.\r\n   *\r\n   * @param relationName used to get the specific relation link\r\n   * @param options (optional) additional options that should be applied to the request\r\n   *        if options didn't contains {@link PageParam} then will be used default page params.\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public getRelatedPage<T extends PagedResourceCollection<BaseResource>>(relationName: string,\r\n                                                                         options?: PagedGetOption): Observable<T> {\r\n    ValidationUtils.validateInputParams({relationName});\r\n    StageLogger.resourceBeginLog(this, 'GET_RELATED_PAGE', {relationName, options});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n    // For templated links removed some part of params to avoid duplication in template params and http request params\r\n    const optionsToRequest = relationLink.templated\r\n      ? {...options, params: undefined, pageParams: undefined}\r\n      : options;\r\n\r\n    return getPagedResourceCollectionHttpService()\r\n      .get(\r\n        UrlUtils.generateLinkUrl(relationLink, UrlUtils.fillDefaultPageDataIfNoPresent(options)),\r\n        optionsToRequest)\r\n      .pipe(\r\n        tap(() => {\r\n          StageLogger.resourceEndLog(this, 'GET_RELATED_PAGE', {result: `related page ${ relationName } was got successful`});\r\n        })\r\n      ) as Observable<T>;\r\n  }\r\n\r\n  /**\r\n   *  Perform POST request to the relation with the body and url params.\r\n   *\r\n   * @param relationName used to get the specific relation link\r\n   * @param requestBody that contains the body directly and optional body values option {@link ValuesOption}\r\n   * @param options (optional) request options that will be applied to the request\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public postRelation(relationName: string,\r\n                      requestBody: RequestBody<any>,\r\n                      options?: RequestOption): Observable<HttpResponse<any> | any> {\r\n    ValidationUtils.validateInputParams({relationName, requestBody});\r\n    StageLogger.resourceBeginLog(this, 'POST_RELATION', {relationName, requestBody, options});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n\r\n    return getResourceHttpService()\r\n      .post(\r\n        UrlUtils.generateLinkUrl(relationLink, options),\r\n        ResourceUtils.resolveValues(requestBody),\r\n        {\r\n          ...options,\r\n          observe: options?.observe ? options.observe : 'body',\r\n          params: relationLink.templated ? undefined : options?.params\r\n        })\r\n      .pipe(\r\n        tap(() => {\r\n          StageLogger.resourceEndLog(this, 'POST_RELATION', {result: `relation ${ relationName } was posted successful`});\r\n        })\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Perform PATCH request to relation with body and url params.\r\n   *\r\n   * @param relationName used to get the specific relation link\r\n   * @param requestBody contains the body directly and body values option {@link ValuesOption}\r\n   *        to clarify what specific values need to be included or not included in result request body\r\n   * @param options (optional) request options that will be applied to the request\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public patchRelation(relationName: string,\r\n                       requestBody: RequestBody<any>,\r\n                       options?: RequestOption): Observable<HttpResponse<any> | any> {\r\n    ValidationUtils.validateInputParams({relationName, requestBody});\r\n    StageLogger.resourceBeginLog(this, 'PATCH_RELATION', {relationName, requestBody, options});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n\r\n    return getResourceHttpService()\r\n      .patch(\r\n        UrlUtils.generateLinkUrl(relationLink, options),\r\n        ResourceUtils.resolveValues(requestBody),\r\n        {\r\n          ...options,\r\n          observe: options?.observe ? options.observe : 'body',\r\n          params: relationLink.templated ? undefined : options?.params\r\n        })\r\n      .pipe(\r\n        tap(() => {\r\n          StageLogger.resourceEndLog(this, 'PATCH_RELATION', {result: `relation ${ relationName } was patched successful`});\r\n        })\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Perform PUT request to relation with body and url params.\r\n   *\r\n   * @param relationName used to get the specific relation link\r\n   * @param requestBody contains the body directly and body values option {@link ValuesOption}\r\n   *        to clarify what specific values need to be included or not included in result request body\r\n   * @param options (optional) request options that will be applied to the request\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public putRelation(relationName: string,\r\n                     requestBody: RequestBody<any>,\r\n                     options?: RequestOption): Observable<HttpResponse<any> | any> {\r\n    ValidationUtils.validateInputParams({relationName, requestBody});\r\n    StageLogger.resourceBeginLog(this, 'PUT_RELATION', {relationName, requestBody, options});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n\r\n    return getResourceHttpService()\r\n      .put(\r\n        UrlUtils.generateLinkUrl(relationLink, options),\r\n        ResourceUtils.resolveValues(requestBody),\r\n        {\r\n          ...options,\r\n          observe: options?.observe ? options.observe : 'body',\r\n          params: relationLink.templated ? undefined : options?.params\r\n        })\r\n      .pipe(\r\n        tap(() => {\r\n          StageLogger.resourceEndLog(this, 'PUT_RELATION', {result: `relation ${ relationName } was put successful`});\r\n        })\r\n      );\r\n  }\r\n\r\n}\r\n","import { BaseResource } from './base-resource';\r\nimport { getResourceHttpService } from '../../service/internal/resource-http.service';\r\nimport { HttpHeaders, HttpResponse } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { ResourceUtils } from '../../util/resource.utils';\r\nimport { UrlUtils } from '../../util/url.utils';\r\nimport { LinkData } from '../declarations';\r\nimport { tap } from 'rxjs/operators';\r\nimport { Stage } from '../../logger/stage.enum';\r\nimport { StageLogger } from '../../logger/stage-logger';\r\nimport { ValidationUtils } from '../../util/validation.utils';\r\nimport { isArray, isNil, last, split } from 'lodash-es';\r\n\r\n/**\r\n * Resource class.\r\n * Should be extended by client model classes that represent entity objects.\r\n *\r\n * If you have an embedded entity then consider to use the {@link EmbeddedResource} class.\r\n */\r\n// tslint:disable:variable-name\r\n// tslint:disable:no-string-literal\r\nexport class Resource extends BaseResource {\r\n\r\n  /**\r\n   * Resource should has self link.\r\n   */\r\n  protected _links: {\r\n    self: LinkData;\r\n    [key: string]: LinkData;\r\n  };\r\n\r\n  /**\r\n   * Adding passed entities to the resource collection behind the relation name.\r\n   * Used POST method with 'Content-Type': 'text/uri-list'.\r\n   *\r\n   * This method DOES NOT REPLACE existing resources in the collection instead it adds new ones.\r\n   * To replace collection resource with passed entities use {@link bindRelation} method.\r\n   *\r\n   * @param relationName used to get the specific resource relation link to the resource collection\r\n   * @param entities one or more entities that should be added to the resource collection\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public addCollectionRelation<T extends Resource>(relationName: string, entities: Array<T>): Observable<HttpResponse<any>> {\r\n    StageLogger.resourceBeginLog(this, 'ADD_COLLECTION_RELATION', {relationName, resourceLinks: this._links, entities});\r\n    ValidationUtils.validateInputParams({relationName, entities});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n\r\n    const body = entities\r\n      .map(entity => {\r\n        return ResourceUtils.initResource(entity).getSelfLinkHref();\r\n      })\r\n      .join('\\n');\r\n\r\n    return getResourceHttpService().post(UrlUtils.generateLinkUrl(relationLink), body, {\r\n      observe: 'response',\r\n      headers: new HttpHeaders({'Content-Type': 'text/uri-list'})\r\n    }).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this, 'ADD_COLLECTION_RELATION',\r\n          {result: `collection relation ${ relationName } was updated successfully`});\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Bounding the passed entity or collection of entities to this resource by the relation name.\r\n   * Used PUT method with 'Content-Type': 'text/uri-list'.\r\n   *\r\n   * This method also REPLACED existing resources in the collection by passed entities.\r\n   * To add entities to collection resource use {@link addCollectionRelation} method.\r\n   *\r\n   * @param relationName with which will be associated passed entity to this resource\r\n   * @param entities one or more entities that should be bind to this resource\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public bindRelation<T extends Resource>(relationName: string, entities: T | Array<T>): Observable<HttpResponse<any>> {\r\n    StageLogger.resourceBeginLog(this, 'BIND_RELATION', {relationName, resourceLinks: this._links, entities});\r\n    ValidationUtils.validateInputParams({relationName, entities});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n    let body;\r\n    if (isArray(entities)) {\r\n      body = entities\r\n        .map(entity => {\r\n          return ResourceUtils.initResource(entity).getSelfLinkHref();\r\n        })\r\n        .join('\\n');\r\n    } else {\r\n      body = ResourceUtils.initResource(entities).getSelfLinkHref();\r\n    }\r\n\r\n    return getResourceHttpService().put(UrlUtils.generateLinkUrl(relationLink), body, {\r\n      observe: 'response',\r\n      headers: new HttpHeaders({'Content-Type': 'text/uri-list'})\r\n    }).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this, 'BIND_RELATION', {result: `relation ${ relationName } was bound successfully`});\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Unbinding single resource relation behind resource name.\r\n   * Used DELETE method to relation resource link URL.\r\n   *\r\n   * This method DOES NOT WORK WITH COLLECTION RESOURCE relations.\r\n   * To clear collection resource relation use {@link unbindCollectionRelation} method.\r\n   * To delete one resource from resource collection use {@link deleteRelation} method.\r\n   *\r\n   * @param relationName resource relation name to unbind\r\n   */\r\n  public unbindRelation<T extends Resource>(relationName: string): Observable<HttpResponse<any>> {\r\n    StageLogger.resourceBeginLog(this, 'UNBIND_RELATION', {relationName, resourceLinks: this._links});\r\n    ValidationUtils.validateInputParams({relationName});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n\r\n    return getResourceHttpService().delete(UrlUtils.generateLinkUrl(relationLink), {\r\n      observe: 'response',\r\n    }).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this, 'UNBIND_RELATION', {result: `relation ${ relationName } was unbound successfully`});\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Unbind all resources from collection by the relation name.\r\n   * Used PUT method with 'Content-Type': 'text/uri-list' and EMPTY body to clear relations.\r\n   *\r\n   * To delete one resource from collection use {@link deleteRelation} method.\r\n   * To delete single resource relations use {@link unbindRelation} or {@link deleteRelation} methods.\r\n   *\r\n   * @param relationName used to get relation link to unbind\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public unbindCollectionRelation<T extends Resource>(relationName: string): Observable<HttpResponse<any>> {\r\n    StageLogger.resourceBeginLog(this, 'UNBIND_COLLECTION_RELATION', {relationName, resourceLinks: this._links});\r\n    ValidationUtils.validateInputParams({relationName});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n\r\n    return getResourceHttpService().put(UrlUtils.generateLinkUrl(relationLink), '', {\r\n      observe: 'response',\r\n      headers: new HttpHeaders({'Content-Type': 'text/uri-list'})\r\n    }).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this, 'UNBIND_COLLECTION_RELATION', {result: `relation ${ relationName } was unbound successfully`});\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Deleting resource relation.\r\n   * For collection, means that only passed entity will be unbound from the collection.\r\n   * For single resource, deleting relation the same as @{link unbindRelation} method.\r\n   *\r\n   * To delete all resource relations from collection use {@link unbindCollectionRelation} method.\r\n   *\r\n   * @param relationName used to get relation link to unbind\r\n   * @param entity that should be unbind from this relation\r\n   * @throws error when required params are not valid or link not found by relation name\r\n   */\r\n  public deleteRelation<T extends Resource>(relationName: string, entity: T): Observable<HttpResponse<any>> {\r\n    StageLogger.resourceBeginLog(this, 'DELETE_RELATION', {relationName, resourceLinks: this._links, entity});\r\n    ValidationUtils.validateInputParams({relationName, entity});\r\n\r\n    const relationLink = this.getRelationLink(relationName);\r\n    const resource = ResourceUtils.initResource(entity) as Resource;\r\n    const resourceId = last(split(UrlUtils.generateLinkUrl(resource._links.self), '/'));\r\n\r\n    if (isNil(resourceId) || resourceId === '') {\r\n      StageLogger.stageErrorLog(Stage.PREPARE_URL, {\r\n        step: 'ResolveResourceId',\r\n        error: 'Passed resource self link should has id',\r\n        selfLink: UrlUtils.generateLinkUrl(resource._links.self)\r\n      });\r\n      throw Error('Passed resource self link should has id');\r\n    }\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      step: 'ResolveResourceId',\r\n      result: resourceId\r\n    });\r\n\r\n    return getResourceHttpService().delete(UrlUtils.generateLinkUrl(relationLink) + '/' + resourceId, {\r\n      observe: 'response'\r\n    }).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this, 'DELETE_RELATION', {result: `relation ${ relationName } was deleted successfully`});\r\n      })\r\n    );\r\n  }\r\n\r\n  public getSelfLinkHref(): string {\r\n    return this._links.self.href;\r\n  }\r\n\r\n}\r\n","import { AbstractResource } from './abstract-resource';\r\nimport { BaseResource } from './base-resource';\r\n\r\n/**\r\n * Collection of resources without pagination.\r\n *\r\n * If you want to have a pagination {@see PagedResourceCollection}.\r\n */\r\nexport class ResourceCollection<T extends BaseResource> extends AbstractResource {\r\n\r\n  public resources: Array<T> = [];\r\n\r\n  /**\r\n   * Resource collection constructor.\r\n   * If passed param then it used as a copy constructor.\r\n   *\r\n   * @param that (optional) another resource collection using to copy data from to current object\r\n   */\r\n  constructor(that?: ResourceCollection<T>) {\r\n    super();\r\n    if (that) {\r\n      this._links = that._links;\r\n      this.resources = that.resources;\r\n    }\r\n  }\r\n\r\n}\r\n","import { BaseResource } from './base-resource';\r\n\r\n/**\r\n * Using for model classes that it's not Resource but can hold Resources as property, for example is Embeddable entity.\r\n * A distinctive feature of such resources is that they do not have the <b>self</b> link while {@link Resource} has.\r\n * It's related with that Embeddable entity can't have an id property.\r\n *\r\n * Usage example:\r\n *\r\n * // Regular resource\r\n * class Product extends Resource {\r\n *   name: string;\r\n * }\r\n *\r\n * // EmbeddedResource that holds Product resource.\r\n * class CartItem extends EmbeddedResource {\r\n *   product: Product;\r\n * }\r\n */\r\nexport class EmbeddedResource extends BaseResource {\r\n}\r\n","import { ResourceCollection } from './resource-collection';\r\nimport { BaseResource } from './base-resource';\r\nimport { Observable, throwError as observableThrowError } from 'rxjs';\r\nimport { getPagedResourceCollectionHttpService } from '../../service/internal/paged-resource-collection-http.service';\r\nimport { LinkData, PageData, Sort, SortedPageParam } from '../declarations';\r\nimport { StageLogger } from '../../logger/stage-logger';\r\nimport { Stage } from '../../logger/stage.enum';\r\nimport { tap } from 'rxjs/operators';\r\nimport { ValidationUtils } from '../../util/validation.utils';\r\nimport { isEmpty, isNumber, result } from 'lodash-es';\r\n\r\n/**\r\n * Collection of resources with pagination.\r\n */\r\nexport class PagedResourceCollection<T extends BaseResource> extends ResourceCollection<T> {\r\n\r\n  private readonly selfLink: LinkData;\r\n  private readonly nextLink: LinkData;\r\n  private readonly prevLink: LinkData;\r\n  private readonly firstLink: LinkData;\r\n  private readonly lastLink: LinkData;\r\n\r\n  public readonly totalElements: number;\r\n  public readonly totalPages: number;\r\n  public readonly pageNumber: number;\r\n  public readonly pageSize: number;\r\n\r\n  /**\r\n   * Create a new paged resource collection from resource collection with the page data.\r\n   *\r\n   * @param resourceCollection collection that will be paged\r\n   * @param pageData contains data about characteristics of the page.\r\n   */\r\n  constructor(resourceCollection: ResourceCollection<T>, pageData?: PageData) {\r\n    super(resourceCollection);\r\n    this.totalElements = result(pageData, 'page.totalElements', 0);\r\n    this.totalPages = result(pageData, 'page.totalPages', 1);\r\n    this.pageSize = result(pageData, 'page.size', 20);\r\n    this.pageNumber = result(pageData, 'page.number', 0);\r\n\r\n    this.selfLink = result(pageData, '_links.self', null);\r\n    this.nextLink = result(pageData, '_links.next', null);\r\n    this.prevLink = result(pageData, '_links.prev', null);\r\n    this.firstLink = result(pageData, '_links.first', null);\r\n    this.lastLink = result(pageData, '_links.last', null);\r\n  }\r\n\r\n  public hasFirst(): boolean {\r\n    return !!this.firstLink && !!this.firstLink.href;\r\n  }\r\n\r\n  public hasLast(): boolean {\r\n    return !!this.lastLink && !!this.lastLink.href;\r\n  }\r\n\r\n  public hasNext(): boolean {\r\n    return !!this.nextLink && !!this.nextLink.href;\r\n  }\r\n\r\n  public hasPrev(): boolean {\r\n    return !!this.prevLink && !!this.prevLink.href;\r\n  }\r\n\r\n  public first(options?: { useCache: true }): Observable<PagedResourceCollection<T>> {\r\n    StageLogger.resourceBeginLog(this.resources[0], 'GET_FIRST_PAGE');\r\n    if (!this.hasFirst()) {\r\n      const errMsg = 'Page has not first url';\r\n      StageLogger.stageErrorLog(Stage.PREPARE_URL, {error: errMsg});\r\n      return observableThrowError(new Error(errMsg));\r\n    }\r\n    return doRequest<T>(this.firstLink.href, options?.useCache).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this.resources[0], 'GET_FIRST_PAGE', {result: 'get first page was performed successful'});\r\n      })\r\n    );\r\n  }\r\n\r\n  public last(options?: { useCache: true }): Observable<PagedResourceCollection<T>> {\r\n    StageLogger.resourceBeginLog(this.resources[0], 'GET_LAST_PAGE');\r\n    if (!this.hasLast()) {\r\n      const errMsg = 'Page has not last url';\r\n      StageLogger.stageErrorLog(Stage.PREPARE_URL, {error: errMsg});\r\n      return observableThrowError(new Error(errMsg));\r\n    }\r\n    return doRequest<T>(this.lastLink.href, options?.useCache).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this.resources[0], 'GET_LAST_PAGE', {result: 'get last page was performed successful'});\r\n      })\r\n    );\r\n  }\r\n\r\n  public next(options?: { useCache: true }): Observable<PagedResourceCollection<T>> {\r\n    StageLogger.resourceBeginLog(this.resources[0], 'GET_NEXT_PAGE');\r\n    if (!this.hasNext()) {\r\n      const errMsg = 'Page has not next url';\r\n      StageLogger.stageErrorLog(Stage.PREPARE_URL, {error: errMsg});\r\n      return observableThrowError(new Error(errMsg));\r\n    }\r\n    return doRequest<T>(this.nextLink.href, options?.useCache).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this.resources[0], 'GET_NEXT_PAGE', {result: 'get next page was performed successful'});\r\n      })\r\n    );\r\n  }\r\n\r\n  public prev(options?: { useCache: true }): Observable<PagedResourceCollection<T>> {\r\n    StageLogger.resourceBeginLog(this.resources[0], 'GET_PREV_PAGE');\r\n    if (!this.hasPrev()) {\r\n      const errMsg = 'Page has not prev url';\r\n      StageLogger.stageErrorLog(Stage.PREPARE_URL, {error: errMsg});\r\n      return observableThrowError(new Error(errMsg));\r\n    }\r\n    return doRequest<T>(this.prevLink.href, options?.useCache).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this.resources[0], 'GET_PREV_PAGE', {result: 'get prev page was performed successful'});\r\n      })\r\n    );\r\n  }\r\n\r\n  public page(pageNumber: number, options?: { useCache: true }): Observable<PagedResourceCollection<T>> {\r\n    return this.customPage({pageParams: {page: pageNumber}}, options);\r\n  }\r\n\r\n  public size(size: number, options?: { useCache: true }): Observable<PagedResourceCollection<T>> {\r\n    return this.customPage({pageParams: {page: 0, size}}, options);\r\n  }\r\n\r\n  public sortElements(sortParam: Sort, options?: { useCache: true }): Observable<PagedResourceCollection<T>> {\r\n    return this.customPage({sort: sortParam}, options);\r\n  }\r\n\r\n  /**\r\n   * Perform query with custom page data.\r\n   * That allows you change page size, current page or sort options.\r\n   *\r\n   * @param params contains data about new characteristics of the page.\r\n   * @param options (optional) additional options that will be applied to the request\r\n   * @throws error when required params are not valid or when passed inconsistent data\r\n   */\r\n  public customPage(params: SortedPageParam, options?: { useCache: true }): Observable<PagedResourceCollection<T>> {\r\n    StageLogger.resourceBeginLog(this.resources[0], 'CustomPage', {pageParam: params.pageParams});\r\n\r\n    if (!params.pageParams || isEmpty(params.pageParams)) {\r\n      params.pageParams = {};\r\n      params.pageParams.page = this.pageNumber;\r\n      params.pageParams.size = this.pageSize;\r\n    }\r\n    if (!isNumber(params.pageParams.page) || params.pageParams.page < 0) {\r\n      params.pageParams.page = this.pageNumber;\r\n      StageLogger.stageLog(Stage.PREPARE_PARAMS, {\r\n        message: 'Page number is not passed will be used current value',\r\n        currentPageNumber: this.pageNumber\r\n      });\r\n    }\r\n    if (!isNumber(params.pageParams.size) || params.pageParams.size < 0) {\r\n      params.pageParams.size = this.pageSize;\r\n      StageLogger.stageLog(Stage.PREPARE_PARAMS, {\r\n        message: 'Page size is not passed will be used current value',\r\n        currentPageSize: this.pageSize\r\n      });\r\n    }\r\n\r\n    const maxPageNumber = (this.totalElements / params.pageParams.size);\r\n    if (params.pageParams.page > maxPageNumber) {\r\n      const errMsg = `Error page number. Max page number is ${ parseInt(maxPageNumber + '', 10) }`;\r\n      StageLogger.stageErrorLog(Stage.PREPARE_PARAMS, {error: errMsg});\r\n      return observableThrowError(errMsg);\r\n    }\r\n\r\n    const requestUrl = new URL(this.selfLink.href);\r\n    requestUrl.searchParams.delete('page');\r\n    requestUrl.searchParams.delete('size');\r\n    if (!isEmpty(params.sort)) {\r\n      requestUrl.searchParams.delete('sort');\r\n    }\r\n\r\n    return doRequest<T>(requestUrl.href, options?.useCache, params).pipe(\r\n      tap(() => {\r\n        StageLogger.resourceEndLog(this.resources[0], 'CustomPage', {result: 'custom page was performed successful'});\r\n      })\r\n    );\r\n  }\r\n\r\n}\r\n\r\nfunction doRequest<T extends BaseResource>(url: string,\r\n                                           useCache: boolean = true,\r\n                                           params?: SortedPageParam): Observable<PagedResourceCollection<T>> {\r\n  ValidationUtils.validateInputParams({url});\r\n\r\n  return getPagedResourceCollectionHttpService()\r\n    .get(url, {...params, useCache}) as Observable<PagedResourceCollection<T>>;\r\n}\r\n","import { Injectable, Injector } from '@angular/core';\r\nimport { DependencyInjector } from '../util/dependency-injector';\r\nimport { LibConfig } from './lib-config';\r\nimport { DEFAULT_ROUTE_NAME, HateoasConfiguration, ResourceRoute } from './hateoas-configuration.interface';\r\nimport { ConsoleLogger } from '../logger/console-logger';\r\nimport { ResourceUtils } from '../util/resource.utils';\r\nimport { Resource } from '../model/resource/resource';\r\nimport { ResourceCollection } from '../model/resource/resource-collection';\r\nimport { EmbeddedResource } from '../model/resource/embedded-resource';\r\nimport { PagedResourceCollection } from '../model/resource/paged-resource-collection';\r\nimport { ValidationUtils } from '../util/validation.utils';\r\nimport { isString } from 'lodash-es';\r\n\r\n/**\r\n * This service for configuration library.\r\n *\r\n * You should inject this service in your main AppModule and pass\r\n * configuration using {@link #configure()} method.\r\n */\r\n// tslint:disable:no-string-literal\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class NgxHateoasClientConfigurationService {\r\n\r\n  constructor(private injector: Injector) {\r\n    DependencyInjector.injector = injector;\r\n    // Setting resource types to prevent circular dependencies\r\n    ResourceUtils.useResourceType(Resource);\r\n    ResourceUtils.useResourceCollectionType(ResourceCollection);\r\n    ResourceUtils.usePagedResourceCollectionType(PagedResourceCollection);\r\n    ResourceUtils.useEmbeddedResourceType(EmbeddedResource);\r\n  }\r\n\r\n  private static isCommonRouteConfig(config: HateoasConfiguration): boolean {\r\n    return 'rootUrl' in config.http && isString(config.http['rootUrl']);\r\n  }\r\n\r\n  /**\r\n   * Configure library with client params.\r\n   *\r\n   * @param config suitable client properties needed to properly library work\r\n   */\r\n  public configure(config: HateoasConfiguration): void {\r\n    if (NgxHateoasClientConfigurationService.isCommonRouteConfig(config)) {\r\n      config = {\r\n        ...config,\r\n        http: {\r\n          [DEFAULT_ROUTE_NAME]: {...config.http as ResourceRoute}\r\n        }\r\n      };\r\n    }\r\n    for (const [key, value] of Object.entries(config.http)) {\r\n      ValidationUtils.validateInputParams({config, routeName: key, baseApi: value.rootUrl});\r\n    }\r\n    LibConfig.setConfig(config);\r\n\r\n    ConsoleLogger.objectPrettyInfo('HateoasClient was configured with options', config);\r\n  }\r\n\r\n}\r\n","import { HttpExecutor } from '../http-executor';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, throwError as observableThrowError } from 'rxjs';\r\nimport { HttpMethod, PagedGetOption } from '../../model/declarations';\r\nimport { UrlUtils } from '../../util/url.utils';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { map } from 'rxjs/operators';\r\nimport { isPagedResourceCollection, isResource, isResourceCollection } from '../../model/resource-type';\r\nimport { ResourceUtils } from '../../util/resource.utils';\r\nimport { Stage } from '../../logger/stage.enum';\r\nimport { StageLogger } from '../../logger/stage-logger';\r\nimport { ValidationUtils } from '../../util/validation.utils';\r\nimport { ResourceCacheService } from './cache/resource-cache.service';\r\nimport { ResourceOption } from '../../config/hateoas-configuration.interface';\r\n\r\n/**\r\n * Service to perform HTTP requests to get any type of the {@link Resource}, {@link PagedResourceCollection}, {@link ResourceCollection}.\r\n */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class CommonResourceHttpService extends HttpExecutor {\r\n\r\n  constructor(httpClient: HttpClient,\r\n              cacheService: ResourceCacheService) {\r\n    super(httpClient, cacheService);\r\n  }\r\n\r\n  /**\r\n   * Perform custom HTTP request.\r\n   *\r\n   * Return type depends on result data it can be {@link Resource}, {@link ResourceCollection},\r\n   * {@link PagedResourceCollection} or any data.\r\n   *\r\n   * @param resourceName used to build root url to the resource\r\n   * @param resourceOptions additional resource options {@link ResourceOption}\r\n   * @param method HTTP method that will be perform {@link HttpMethod}\r\n   * @param query url path that applied to the result url at the end\r\n   * @param body (optional) request body\r\n   * @param options (optional) options that applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public customQuery(resourceName: string,\r\n                     resourceOptions: ResourceOption,\r\n                     method: HttpMethod,\r\n                     query: string,\r\n                     body?: any,\r\n                     options?: PagedGetOption): Observable<any> {\r\n    ValidationUtils.validateInputParams({resourceName, method, query});\r\n\r\n    const url = UrlUtils.generateResourceUrl(UrlUtils.getApiUrl(resourceOptions.routeName), resourceName, query);\r\n\r\n    StageLogger.stageLog(Stage.PREPARE_URL, {\r\n      result: url,\r\n      urlParts: `baseUrl: '${ UrlUtils.getApiUrl(resourceOptions.routeName) }', resource: '${ resourceName }', query: '${ query }'`,\r\n      options\r\n    });\r\n\r\n    const httpOptions = UrlUtils.convertToHttpOptions(options);\r\n\r\n    let result: Observable<any>;\r\n    switch (method) {\r\n      case HttpMethod.GET:\r\n        result = super.getHttp(url, httpOptions, false);\r\n        break;\r\n      case HttpMethod.POST:\r\n        result = super.postHttp(url, body, httpOptions);\r\n        break;\r\n      case HttpMethod.PUT:\r\n        result = super.putHttp(url, body, httpOptions);\r\n        break;\r\n      case HttpMethod.PATCH:\r\n        result = super.patchHttp(url, body, httpOptions);\r\n        break;\r\n      default:\r\n        const errMsg = `allowed ony GET/POST/PUT/PATCH http methods you pass ${ method }`;\r\n        StageLogger.stageErrorLog(Stage.HTTP_REQUEST, {error: errMsg, options});\r\n        return observableThrowError(new Error(errMsg));\r\n    }\r\n\r\n    return result.pipe(\r\n      map(data => {\r\n        const isProjection = httpOptions?.params?.has('projection');\r\n        if (isPagedResourceCollection(data)) {\r\n          return ResourceUtils.instantiatePagedResourceCollection(data, isProjection);\r\n        } else if (isResourceCollection(data)) {\r\n          return ResourceUtils.instantiateResourceCollection(data, isProjection);\r\n        } else if (isResource(data)) {\r\n          return ResourceUtils.instantiateResource(data, isProjection);\r\n        } else {\r\n          return data;\r\n        }\r\n      })\r\n    );\r\n  }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ResourceHttpService } from '../internal/resource-http.service';\r\nimport { PagedResourceCollectionHttpService } from '../internal/paged-resource-collection-http.service';\r\nimport { PagedResourceCollection } from '../../model/resource/paged-resource-collection';\r\nimport {\r\n  GetOption,\r\n  HttpMethod,\r\n  PagedGetOption,\r\n  RequestBody,\r\n  RequestOption,\r\n  RESOURCE_NAME_PROP,\r\n  RESOURCE_OPTIONS_PROP\r\n} from '../../model/declarations';\r\nimport { ResourceUtils } from '../../util/resource.utils';\r\nimport { ResourceCollection } from '../../model/resource/resource-collection';\r\nimport { ResourceCollectionHttpService } from '../internal/resource-collection-http.service';\r\nimport { CommonResourceHttpService } from '../internal/common-resource-http.service';\r\nimport { tap } from 'rxjs/operators';\r\nimport { Resource } from '../../model/resource/resource';\r\nimport { StageLogger } from '../../logger/stage-logger';\r\nimport { ValidationUtils } from '../../util/validation.utils';\r\nimport { HttpResponse } from '@angular/common/http';\r\nimport { ResourceCacheService } from '../internal/cache/resource-cache.service';\r\n\r\n/**\r\n * Service to operate with {@link Resource}.\r\n *\r\n * Can be injected as standalone service to work with {@link Resource}.\r\n */\r\n\r\n/* tslint:disable:no-string-literal */\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class HateoasResourceService {\r\n\r\n  constructor(private commonHttpService: CommonResourceHttpService,\r\n              private resourceHttpService: ResourceHttpService,\r\n              private resourceCollectionHttpService: ResourceCollectionHttpService,\r\n              private pagedResourceCollectionHttpService: PagedResourceCollectionHttpService,\r\n              private cacheService: ResourceCacheService) {\r\n  }\r\n\r\n  /**\r\n   * Get resource by id.\r\n   *\r\n   * @param resourceType resource for which will perform request\r\n   * @param id resource id\r\n   * @param options (optional) options that should be applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public getResource<T extends Resource>(resourceType: new () => T, id: number | string, options?: GetOption): Observable<T> {\r\n    ValidationUtils.validateInputParams({resourceType, id});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    options = ResourceUtils.fillProjectionNameFromResourceType(resourceType, options);\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService GET_RESOURCE', {id, options});\r\n\r\n    return this.resourceHttpService.getResource<T>(resourceName, resourceType[RESOURCE_OPTIONS_PROP], id, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService GET_RESOURCE',\r\n          {result: `get resource '${ resourceName }' was successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Get collection of the resource by id.\r\n   *\r\n   * @param resourceType resource for which will perform request\r\n   * @param options (optional) options that should be applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public getCollection<T extends Resource>(resourceType: new () => T, options?: GetOption): Observable<ResourceCollection<T>> {\r\n    ValidationUtils.validateInputParams({resourceType});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    options = ResourceUtils.fillProjectionNameFromResourceType(resourceType, options);\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService GET_COLLECTION', {options});\r\n\r\n    return this.resourceCollectionHttpService\r\n      .getResourceCollection<ResourceCollection<T>>(resourceName, resourceType[RESOURCE_OPTIONS_PROP], options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService GET_COLLECTION',\r\n          {result: `get all resources by '${ resourceName }' was successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Get paged collection of the resource by id.\r\n   *\r\n   * @param resourceType resource for which will perform request\r\n   * @param options (optional) options that should be applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public getPage<T extends Resource>(resourceType: new () => T, options?: PagedGetOption): Observable<PagedResourceCollection<T>> {\r\n    ValidationUtils.validateInputParams({resourceType});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    options = ResourceUtils.fillProjectionNameFromResourceType(resourceType, options);\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService GET_PAGE', {options});\r\n\r\n    return this.pagedResourceCollectionHttpService\r\n      .getResourcePage<PagedResourceCollection<T>>(resourceName, resourceType[RESOURCE_OPTIONS_PROP], options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService GET_PAGE',\r\n          {result: `get all page resources by '${ resourceName }' was successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Create resource.\r\n   *\r\n   * @param resourceType resource for which will perform request\r\n   * @param requestBody that contains the body directly and optional body values option {@link ValuesOption}\r\n   * @param options (optional) options that should be applied to the request {@link RequestOption}\r\n   * @throws error when required params are not valid\r\n   */\r\n  public createResource<T extends Resource>(resourceType: new () => T,\r\n                                            requestBody: RequestBody<T>,\r\n                                            options?: RequestOption): Observable<T | any> {\r\n    ValidationUtils.validateInputParams({resourceType, requestBody});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService CREATE_RESOURCE', {requestBody, options});\r\n\r\n    const body = ResourceUtils.resolveValues(requestBody);\r\n\r\n    return this.resourceHttpService.postResource(resourceName, resourceType[RESOURCE_OPTIONS_PROP], body, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService CREATE_RESOURCE',\r\n          {result: `resource '${ resourceName }' was created successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Updating all resource properties at the time to passed body properties. If some properties are not passed then will be used null value.\r\n   * If you need update some part resource properties, use {@link HateoasResourceService#patchResource} method.\r\n   *\r\n   * @param entity to update\r\n   * @param requestBody that contains the body directly and optional body values option {@link ValuesOption}\r\n   * @param options (optional) options that should be applied to the request {@link RequestOption}\r\n   * @throws error when required params are not valid\r\n   */\r\n  public updateResource<T extends Resource>(entity: T,\r\n                                            requestBody?: RequestBody<any>,\r\n                                            options?: RequestOption): Observable<T | any> {\r\n    ValidationUtils.validateInputParams({entity});\r\n    StageLogger.resourceBeginLog(entity, 'ResourceService UPDATE_RESOURCE', {\r\n      body: requestBody ? requestBody : entity,\r\n      options\r\n    });\r\n\r\n    const resource = ResourceUtils.initResource(entity) as Resource;\r\n    const body = ResourceUtils.resolveValues(requestBody ? requestBody : {body: entity});\r\n\r\n    return this.resourceHttpService.put(resource.getSelfLinkHref(), body, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(entity, 'ResourceService UPDATE_RESOURCE',\r\n          {result: `resource '${ resource[RESOURCE_NAME_PROP] }' was updated successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Update resource by id.\r\n   * Updating all resource properties at the time to passed body properties. If some properties are not passed then will be used null value.\r\n   * If you need update some part resource properties, use {@link HateoasResourceService#patchResource} method.\r\n   *\r\n   * @param resourceType resource for which will perform request\r\n   * @param id resource id\r\n   * @param requestBody that contains the body directly and optional body values option {@link ValuesOption}\r\n   * @param options (optional) options that should be applied to the request {@link RequestOption}\r\n   * @throws error when required params are not valid\r\n   */\r\n  public updateResourceById<T extends Resource>(resourceType: new () => T,\r\n                                                id: number | string,\r\n                                                requestBody: RequestBody<any>,\r\n                                                options?: RequestOption): Observable<T | any> {\r\n    ValidationUtils.validateInputParams({resourceType, id, requestBody});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService UPDATE_RESOURCE_BY_ID', {\r\n      id,\r\n      body: requestBody,\r\n      options\r\n    });\r\n\r\n    const body = ResourceUtils.resolveValues(requestBody);\r\n\r\n    return this.resourceHttpService.putResource(resourceName, resourceType[RESOURCE_OPTIONS_PROP], id, body, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService UPDATE_RESOURCE_BY_ID',\r\n          {result: `resource '${ resourceName }' with id ${ id } was updated successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Patch resource.\r\n   * Allows fine-grained update resource properties, it means that only passed properties in body will be changed,\r\n   * other properties stay as is.\r\n   *\r\n   * @param entity to patch\r\n   * @param requestBody (optional) contains the body that will be patched resource and optional body values option {@link ValuesOption}\r\n   *        if not passed then entity will be passed as body directly\r\n   * @param options (optional) options that should be applied to the request {@link RequestOption}\r\n   * @throws error when required params are not valid\r\n   */\r\n  public patchResource<T extends Resource>(entity: T,\r\n                                           requestBody?: RequestBody<any>,\r\n                                           options?: RequestOption): Observable<T | any> {\r\n    ValidationUtils.validateInputParams({entity});\r\n    StageLogger.resourceBeginLog(entity, 'ResourceService PATCH_RESOURCE', {\r\n      body: requestBody ? requestBody : entity,\r\n      options\r\n    });\r\n\r\n    const resource = ResourceUtils.initResource(entity) as Resource;\r\n    const body = ResourceUtils.resolveValues(requestBody ? requestBody : {body: entity});\r\n\r\n    return this.resourceHttpService.patch(resource.getSelfLinkHref(), body, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(entity, 'ResourceService PATCH_RESOURCE',\r\n          {result: `resource '${ entity[RESOURCE_NAME_PROP] }' was patched successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Patch resource by id.\r\n   * Allows fine-grained update resource properties, it means that only passed properties in body will be changed,\r\n   * other properties stay as is.\r\n   *\r\n   * @param resourceType resource for which will perform request\r\n   * @param id resource id\r\n   * @param requestBody that contains the body directly and optional body values option {@link ValuesOption}\r\n   * @param options (optional) options that should be applied to the request {@link RequestOption}\r\n   * @throws error when required params are not valid\r\n   */\r\n  public patchResourceById<T extends Resource>(resourceType: new () => T,\r\n                                               id: number | string,\r\n                                               requestBody: RequestBody<any>,\r\n                                               options?: RequestOption): Observable<T | any> {\r\n    ValidationUtils.validateInputParams({resourceType, id, requestBody});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService PATCH_RESOURCE_BY_ID', {\r\n      id,\r\n      body: requestBody,\r\n      options\r\n    });\r\n\r\n    const body = ResourceUtils.resolveValues(requestBody);\r\n\r\n    return this.resourceHttpService.patchResource(resourceName, resourceType[RESOURCE_OPTIONS_PROP], id, body, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService PATCH_RESOURCE_BY_ID',\r\n          {result: `resource '${ resourceName }' with id ${ id } was patched successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Delete resource.\r\n   *\r\n   * @param entity to delete\r\n   * @param options (optional) options that should be applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public deleteResource<T extends Resource>(entity: T, options?: RequestOption): Observable<HttpResponse<any> | any> {\r\n    ValidationUtils.validateInputParams({entity});\r\n    StageLogger.resourceBeginLog(entity, 'ResourceService DELETE_RESOURCE', {options});\r\n\r\n    const resource = ResourceUtils.initResource(entity) as Resource;\r\n\r\n    return this.resourceHttpService.delete(resource.getSelfLinkHref(), options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(entity, 'ResourceService DELETE_RESOURCE',\r\n          {result: `resource '${ resource[RESOURCE_NAME_PROP] }' was deleted successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * Delete resource by id.\r\n   *\r\n   * @param resourceType resource for which will perform request\r\n   * @param id resource id\r\n   * @param options (optional) options that should be applied to the request\r\n   * @throws error when required params are not valid\r\n   */\r\n  public deleteResourceById<T extends Resource>(resourceType: new () => T,\r\n                                                id: number | string,\r\n                                                options?: RequestOption): Observable<HttpResponse<any> | any> {\r\n    ValidationUtils.validateInputParams({resourceType, id});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService DELETE_RESOURCE_BY_ID', {id, options});\r\n\r\n    return this.resourceHttpService.deleteResource(resourceName, resourceType[RESOURCE_OPTIONS_PROP], id, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService DELETE_RESOURCE_BY_ID',\r\n          {result: `resource '${ resourceName }' with id ${ id } was deleted successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * {@see ResourceCollectionHttpService#search}\r\n   */\r\n  public searchCollection<T extends Resource>(resourceType: new () => T,\r\n                                              searchQuery: string,\r\n                                              options?: GetOption): Observable<ResourceCollection<T>> {\r\n    ValidationUtils.validateInputParams({resourceType, searchQuery});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    options = ResourceUtils.fillProjectionNameFromResourceType(resourceType, options);\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService SEARCH_COLLECTION', {query: searchQuery, options});\r\n\r\n    return this.resourceCollectionHttpService\r\n      .search<ResourceCollection<T>>(resourceName, resourceType[RESOURCE_OPTIONS_PROP], searchQuery, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService SEARCH_COLLECTION',\r\n          {result: `search collection by '${ resourceName }' was performed successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * {@see PagedResourceCollection#search}\r\n   */\r\n  public searchPage<T extends Resource>(resourceType: new () => T,\r\n                                        searchQuery: string,\r\n                                        options?: PagedGetOption): Observable<PagedResourceCollection<T>> {\r\n    ValidationUtils.validateInputParams({resourceType, searchQuery});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    options = ResourceUtils.fillProjectionNameFromResourceType(resourceType, options);\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService SEARCH_PAGE', {query: searchQuery, options});\r\n\r\n    return this.pagedResourceCollectionHttpService\r\n      .search<PagedResourceCollection<T>>(resourceName, resourceType[RESOURCE_OPTIONS_PROP], searchQuery, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService SEARCH_PAGE',\r\n          {result: `search page by '${ resourceName }' was performed successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * {@see ResourceHttpService#search}\r\n   */\r\n  public searchResource<T extends Resource>(resourceType: new () => T, searchQuery: string, options?: GetOption): Observable<T> {\r\n    ValidationUtils.validateInputParams({resourceType, searchQuery});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    options = ResourceUtils.fillProjectionNameFromResourceType(resourceType, options);\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService SEARCH_SINGLE', {query: searchQuery, options});\r\n\r\n    return this.resourceHttpService.search<T>(resourceName, resourceType[RESOURCE_OPTIONS_PROP], searchQuery, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService SEARCH_SINGLE',\r\n          {result: `search single by '${ resourceName }' was performed successful`});\r\n      }));\r\n  }\r\n\r\n  /**\r\n   * {@see CommonResourceHttpService#customQuery}\r\n   */\r\n  public customQuery<R>(resourceType: new () => Resource,\r\n                        method: HttpMethod,\r\n                        query: string,\r\n                        requestBody?: RequestBody<any>,\r\n                        options?: PagedGetOption): Observable<R> {\r\n    ValidationUtils.validateInputParams({resourceType, method, query});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    options = ResourceUtils.fillProjectionNameFromResourceType(resourceType, options);\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService CUSTOM_QUERY', {\r\n      method: HttpMethod,\r\n      query,\r\n      requestBody,\r\n      options\r\n    });\r\n\r\n    const body = ResourceUtils.resolveValues(requestBody);\r\n\r\n    return this.commonHttpService.customQuery(resourceName, resourceType[RESOURCE_OPTIONS_PROP], method, query, body, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService CUSTOM_QUERY',\r\n          {result: `custom query by '${ resourceName }' was performed successful`});\r\n      })) as Observable<R>;\r\n  }\r\n\r\n  /**\r\n   * Differences between {@link HateoasResourceService#customQuery} and this method\r\n   * that this one puts 'search' path to the result url automatically.\r\n   *\r\n   * {@see CommonResourceHttpService#customQuery}\r\n   */\r\n  public customSearchQuery<R>(resourceType: new () => Resource,\r\n                              method: HttpMethod,\r\n                              searchQuery: string,\r\n                              requestBody?: RequestBody<any>,\r\n                              options?: PagedGetOption): Observable<R> {\r\n    ValidationUtils.validateInputParams({resourceType, method, searchQuery});\r\n    const resourceName = resourceType[RESOURCE_NAME_PROP];\r\n    options = ResourceUtils.fillProjectionNameFromResourceType(resourceType, options);\r\n    StageLogger.resourceBeginLog(resourceName, 'ResourceService CUSTOM_SEARCH_QUERY', {\r\n      method: HttpMethod,\r\n      searchQuery,\r\n      requestBody,\r\n      options\r\n    });\r\n\r\n    const body = ResourceUtils.resolveValues(requestBody);\r\n    const query = `/search${ searchQuery.startsWith('/') ? searchQuery : '/' + searchQuery }`;\r\n    return this.commonHttpService.customQuery(resourceName, resourceType[RESOURCE_OPTIONS_PROP], method, query, body, options)\r\n      .pipe(tap(() => {\r\n        StageLogger.resourceEndLog(resourceName, 'ResourceService CUSTOM_SEARCH_QUERY',\r\n          {result: `custom search query by '${ resourceName }' was performed successful`});\r\n      })) as Observable<R>;\r\n  }\r\n\r\n  /**\r\n   * Evict all resources cache.\r\n   */\r\n  public evictResourcesCache(): void {\r\n    this.cacheService.evictAll();\r\n  }\r\n\r\n}\r\n","import { Observable } from 'rxjs';\r\nimport { DependencyInjector } from '../../util/dependency-injector';\r\nimport { HateoasResourceService } from './hateoas-resource.service';\r\nimport { GetOption, HttpMethod, PagedGetOption, RequestBody, RequestOption } from '../../model/declarations';\r\nimport { Resource } from '../../model/resource/resource';\r\nimport { PagedResourceCollection } from '../../model/resource/paged-resource-collection';\r\nimport { ResourceCollection } from '../../model/resource/resource-collection';\r\nimport { HttpResponse } from '@angular/common/http';\r\n\r\n/**\r\n * Main resource operation class.\r\n * Extend this class to create resource service.\r\n */\r\nexport class HateoasResourceOperation<T extends Resource> {\r\n\r\n  private readonly resourceType: new() => T;\r\n\r\n  private hateoasResourceService: HateoasResourceService;\r\n\r\n  constructor(resourceType: new() => T) {\r\n    this.resourceType = resourceType;\r\n    this.hateoasResourceService = DependencyInjector.get(HateoasResourceService);\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#getResource}.\r\n   */\r\n  public getResource(id: number | string, options?: GetOption): Observable<T> {\r\n    return this.hateoasResourceService.getResource(this.resourceType, id, options) as Observable<T>;\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#getCollection}.\r\n   */\r\n  public getCollection(options?: GetOption): Observable<ResourceCollection<T>> {\r\n    return this.hateoasResourceService.getCollection(this.resourceType, options);\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#getPage}.\r\n   */\r\n  public getPage(options?: PagedGetOption): Observable<PagedResourceCollection<T>> {\r\n    return this.hateoasResourceService.getPage(this.resourceType, options);\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#createResource}.\r\n   */\r\n  public createResource(requestBody: RequestBody<T>, options?: RequestOption): Observable<any> {\r\n    return this.hateoasResourceService.createResource(this.resourceType, requestBody, options);\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#updateResource}.\r\n   */\r\n  public updateResource(entity: T, requestBody?: RequestBody<any>, options?: RequestOption): Observable<T | any> {\r\n    return this.hateoasResourceService.updateResource(entity, requestBody, options);\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#updateResourceById}.\r\n   */\r\n  public updateResourceById(id: number | string, requestBody: RequestBody<any>, options?: RequestOption): Observable<T | any> {\r\n    return this.hateoasResourceService.updateResourceById(this.resourceType, id, requestBody, options);\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#patchResource}.\r\n   */\r\n  public patchResource(entity: T, requestBody?: RequestBody<any>, options?: RequestOption): Observable<T | any> {\r\n    return this.hateoasResourceService.patchResource(entity, requestBody, options);\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#patchResourceById}.\r\n   */\r\n  public patchResourceById(id: number | string, requestBody: RequestBody<any>, options?: RequestOption): Observable<T | any> {\r\n    return this.hateoasResourceService.patchResourceById(this.resourceType, id, requestBody, options);\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#deleteResource}.\r\n   */\r\n  public deleteResource(entity: T, options?: RequestOption): Observable<HttpResponse<any> | any> {\r\n    return this.hateoasResourceService.deleteResource(entity, options);\r\n  }\r\n\r\n  /**\r\n   * {@link HateoasResourceService#deleteResourceById}.\r\n   */\r\n  public deleteResourceById(id: number | string, options?: RequestOption): Observable<HttpResponse<any> | any> {\r\n    return this.hateoasResourceService.deleteResourceById(this.resourceType, id, options);\r\n  }\r\n\r\n  /**\r\n   * {@see ResourceCollectionHttpService#search}\r\n   */\r\n  public searchCollection(query: string, options?: GetOption): Observable<ResourceCollection<T>> {\r\n    return this.hateoasResourceService.searchCollection(this.resourceType, query, options);\r\n  }\r\n\r\n  /**\r\n   * {@see PagedResourceCollection#search}\r\n   */\r\n  public searchPage(query: string, options?: PagedGetOption): Observable<PagedResourceCollection<T>> {\r\n    return this.hateoasResourceService.searchPage(this.resourceType, query, options);\r\n  }\r\n\r\n  /**\r\n   * {@see ResourceHttpService#search}\r\n   */\r\n  public searchResource(query: string, options?: GetOption): Observable<T> {\r\n    return this.hateoasResourceService.searchResource(this.resourceType, query, options);\r\n  }\r\n\r\n  /**\r\n   * {@see ResourceHttpService#customQuery}\r\n   */\r\n  public customQuery<R>(method: HttpMethod,\r\n                        query: string,\r\n                        requestBody?: RequestBody<any>,\r\n                        options?: PagedGetOption): Observable<R> {\r\n    return this.hateoasResourceService.customQuery(this.resourceType, method, query, requestBody, options);\r\n  }\r\n\r\n  /**\r\n   * {@see ResourceHttpService#customSearchQuery}\r\n   */\r\n  public customSearchQuery<R>(method: HttpMethod,\r\n                              searchQuery: string,\r\n                              requestBody?: RequestBody<any>,\r\n                              options?: PagedGetOption): Observable<R> {\r\n    return this.hateoasResourceService.customSearchQuery(this.resourceType, method, searchQuery, requestBody, options);\r\n  }\r\n\r\n}\r\n","/* tslint:disable:no-string-literal */\r\nimport { ResourceUtils } from '../util/resource.utils';\r\nimport { isArray, isEmpty, isNull, isUndefined } from 'lodash-es';\r\nimport { Resource } from './resource/resource';\r\nimport { EmbeddedResource } from './resource/embedded-resource';\r\nimport { BaseResource } from './resource/base-resource';\r\nimport { DEFAULT_ROUTE_NAME, ResourceOption } from '../config/hateoas-configuration.interface';\r\nimport { RESOURCE_NAME_PROP, RESOURCE_OPTIONS_PROP } from './declarations';\r\n\r\n\r\n/**\r\n * Decorator used to classes that extend {@link Resource} class to register 'resourceName' and 'resourceType'\r\n * information about this resource.\r\n *\r\n * @param resourceName resource name which will be used to build a resource URL.\r\n * @param options additional resource options. See more {@link ResourceOption}.\r\n */\r\nexport function HateoasResource(resourceName: string, options: ResourceOption = {routeName: DEFAULT_ROUTE_NAME}) {\r\n  return <T extends new(...args: any[]) => any>(constructor: T) => {\r\n    if (isNull(resourceName) || isUndefined(resourceName) || !resourceName) {\r\n      throw new Error(`Init resource '${ constructor.name }' error. @HateoasResource decorator param resourceName can not be null/undefined/empty, please pass a valid resourceName.`);\r\n    }\r\n\r\n    if (!isInstanceOfParent(constructor, Resource)) {\r\n      throw new Error(`Init resource '${ constructor.name }' error. @HateoasResource decorator applied only to 'Resource' type, you used it with ${ Object.getPrototypeOf(constructor) } type.`);\r\n    }\r\n    constructor[RESOURCE_NAME_PROP] = resourceName;\r\n    ResourceUtils.RESOURCE_NAME_TYPE_MAP.set(resourceName.toLowerCase(), constructor);\r\n\r\n    if (!options?.routeName) {\r\n      options = {\r\n        routeName: DEFAULT_ROUTE_NAME\r\n      };\r\n    }\r\n    constructor[RESOURCE_OPTIONS_PROP] = options;\r\n\r\n    return constructor;\r\n  };\r\n}\r\n\r\n/**\r\n * Decorator used to classes that extend {@link EmbeddedResource} class to register 'relationNames' and 'resourceType'\r\n * information about this resource.\r\n *\r\n * @param relationNames names of the properties that using to hold this embedded resource in resource objects.\r\n */\r\nexport function HateoasEmbeddedResource(relationNames: Array<string>) {\r\n  return <T extends new(...args: any[]) => any>(constructor: T) => {\r\n    if (isNull(relationNames)\r\n      || isUndefined(relationNames)\r\n      || (isArray(relationNames) && isEmpty(relationNames))) {\r\n      throw new Error(`Init resource '${ constructor.name }' error. @HateoasEmbeddedResource decorator param relationNames can not be null/undefined/empty, please pass a valid relationNames.`);\r\n    }\r\n\r\n    if (!isInstanceOfParent(constructor, EmbeddedResource)) {\r\n      throw new Error(`Init resource '${ constructor.name }' error. @HateoasEmbeddedResource decorator applied only to 'EmbeddedResource' type, you used it with ${ Object.getPrototypeOf(constructor) } type.`);\r\n    }\r\n    relationNames.forEach(relationName => {\r\n      ResourceUtils.EMBEDDED_RESOURCE_TYPE_MAP.set(relationName, constructor);\r\n    });\r\n  };\r\n}\r\n\r\n/**\r\n * Decorator used to create a projection representation of {@link Resource} heirs.\r\n *\r\n * @param resourceType type of resource that using for projection.\r\n * @param projectionName name of projection, will be used as projection request param.\r\n */\r\nexport function HateoasProjection(resourceType: new() => Resource, projectionName: string) {\r\n  return <T extends new(...args: any[]) => any>(constructor: T) => {\r\n    if (isNull(resourceType) || isUndefined(resourceType)) {\r\n      throw new Error(`Init resource projection '${ constructor.name }' error. @HateoasProjection decorator param resourceType can not be null/undefined, please pass a valid resourceType.`);\r\n    }\r\n    if (isNull(projectionName) || isUndefined(projectionName) || !projectionName) {\r\n      throw new Error(`Init resource projection '${ constructor.name }' error. @HateoasProjection decorator param projectionName can not be null/undefined/empty, please pass a valid projectionName.`);\r\n    }\r\n\r\n    if (!isInstanceOfParent(constructor, Resource)) {\r\n      throw new Error(`Init resource projection '${ constructor.name }' error. @HateoasProjection decorator applied only to 'Resource' type, you used it with ${ Object.getPrototypeOf(constructor) } type.`);\r\n    }\r\n    constructor[RESOURCE_NAME_PROP] = resourceType[RESOURCE_NAME_PROP];\r\n    constructor[RESOURCE_OPTIONS_PROP] = resourceType[RESOURCE_OPTIONS_PROP];\r\n    constructor['__projectionName__'] = projectionName;\r\n    ResourceUtils.RESOURCE_NAME_PROJECTION_TYPE_MAP.set(resourceType[RESOURCE_NAME_PROP].toLowerCase(), constructor);\r\n\r\n    return constructor;\r\n  };\r\n}\r\n\r\n/**\r\n * Decorator used to mark projection class properties that are resources and specifying class type used to create this relation.\r\n * This decorator used with class marked as {@link HateoasProjection}.\r\n *\r\n * @param relationType resource relation type that will be used to create resource with this type when parsed server response.\r\n */\r\nexport function ProjectionRel(relationType: new() => BaseResource) {\r\n  return (target: object, propertyKey: string) => {\r\n    if (isNull(relationType) || isUndefined(relationType)) {\r\n      throw new Error(`Init resource projection '${ target.constructor.name }' relation type error. @ProjectionRel decorator param relationType can not be null/undefined, please pass a valid relationType.`);\r\n    }\r\n\r\n    ResourceUtils.RESOURCE_PROJECTION_REL_NAME_TYPE_MAP.set(propertyKey, relationType);\r\n  };\r\n}\r\n\r\n\r\nfunction isInstanceOfParent(constructor: new (...args: any[]) => any, parentClass: any) {\r\n  if (Object.getPrototypeOf(constructor).name === '') {\r\n    return false;\r\n  }\r\n  if (Object.getPrototypeOf(constructor) === parentClass) {\r\n    return true;\r\n  }\r\n\r\n  return isInstanceOfParent(Object.getPrototypeOf(constructor), parentClass);\r\n}\r\n","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { NgxHateoasClientConfigurationService } from './config/ngx-hateoas-client-configuration.service';\r\nimport { HateoasResourceService } from './service/external/hateoas-resource.service';\r\n\r\nexport { NgxHateoasClientConfigurationService } from './config/ngx-hateoas-client-configuration.service';\r\nexport { Resource } from './model/resource/resource';\r\nexport { EmbeddedResource } from './model/resource/embedded-resource';\r\nexport { ResourceCollection } from './model/resource/resource-collection';\r\nexport { PagedResourceCollection } from './model/resource/paged-resource-collection';\r\nexport {\r\n  Sort,\r\n  SortOrder,\r\n  Include,\r\n  HttpMethod,\r\n  ProjectionRelType,\r\n  GetOption,\r\n  PagedGetOption,\r\n  RequestOption,\r\n  RequestParam,\r\n  CacheMode\r\n} from './model/declarations';\r\nexport { HateoasResourceOperation } from './service/external/hateoas-resource-operation';\r\nexport { HateoasResourceService } from './service/external/hateoas-resource.service';\r\nexport { HateoasResource, HateoasEmbeddedResource, HateoasProjection, ProjectionRel } from './model/decorators';\r\n\r\n@NgModule()\r\nexport class NgxHateoasClientModule {\r\n  static forRoot(): ModuleWithProviders<NgxHateoasClientModule> {\r\n    return {\r\n      ngModule: NgxHateoasClientModule\r\n    };\r\n  }\r\n\r\n  constructor(config: NgxHateoasClientConfigurationService) {\r\n  }\r\n\r\n}\r\n","/*\r\n * Public API Surface of ngx-hateoas-client\r\n */\r\n\r\nexport * from './lib/ngx-hateoas-client.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["observableOf","observableThrowError","i2.ResourceCacheService","i1.CommonResourceHttpService","i2.ResourceHttpService","i3.ResourceCollectionHttpService","i4.PagedResourceCollectionHttpService","i5.ResourceCacheService","i1.NgxHateoasClientConfigurationService"],"mappings":"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"}