{"version":3,"file":"index.mjs","sources":["../src/ErrorFactory.ts","../src/Mapping.ts","../src/Mapping/Attribute.ts","../src/utils/repositoryGenerator.ts","../src/client/headerUtils.ts","../src/client/AbstractClient.ts","../src/Mapping/ClassMetadata.ts","../src/Mapping/Relation.ts","../src/isImmutable.ts","../src/UnitOfWork.ts","../src/serializer/Serializer.ts","../src/serializer/JsSerializer.ts","../src/utils/levenshtein.ts","../src/utils/logging.ts","../src/RestClientSdk.ts","../src/TokenGenerator/AbstractTokenGenerator.ts","../src/TokenGenerator/AuthorizationCodeFlowTokenGenerator.ts","../src/decorator.ts","../src/TokenGenerator/ClientCredentialsGenerator.ts","../src/TokenGenerator/PasswordGenerator.ts","../src/TokenGenerator/ProvidedTokenGenerator.ts","../src/TokenStorage.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file, no-use-before-define */\n/**\n * It's a bit tricky to extends native errors\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\n */\n\nimport { ErrorBody, Token, TokenBody } from './TokenGenerator/types';\n\nclass HttpError extends Error {\n  public baseResponse: Response;\n\n  constructor(message: null | string, baseResponse: Response) {\n    super(message || 'Http errort');\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, OauthError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, OauthError);\n    }\n\n    this.name = 'HttpError';\n    this.baseResponse = baseResponse;\n  }\n\n  /**\n   * Get the JSON of the baseResponse directly, if possible\n   */\n  public responseJson(): Promise<Record<string, unknown>> {\n    return this.baseResponse.json();\n  }\n}\n\nclass OauthError extends Error {\n  public previousError: HttpError | undefined;\n\n  constructor(message: null | string, previousError?: HttpError) {\n    super(message || 'Oauth error');\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, OauthError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, OauthError);\n    }\n\n    this.name = 'OauthError';\n    this.previousError = previousError;\n  }\n}\n\nclass InvalidGrantError extends OauthError {\n  public previousError: HttpError | undefined;\n\n  constructor(message: null | string, previousError?: HttpError) {\n    super(message || 'Invalid grant error', previousError);\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, InvalidGrantError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, InvalidGrantError);\n    }\n\n    this.name = 'InvalidGrantError';\n    this.previousError = previousError;\n  }\n}\n\nclass InvalidScopeError extends OauthError {\n  public previousError: HttpError | undefined;\n\n  constructor(message: null | string, previousError?: HttpError) {\n    super(message || 'Invalid scope error', previousError);\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, InvalidScopeError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, InvalidScopeError);\n    }\n\n    this.name = 'InvalidScopeError';\n    this.previousError = previousError;\n  }\n}\n\n// 400\nclass BadRequestError extends HttpError {\n  public baseResponse: Response;\n\n  constructor(message: null | string, baseResponse: Response) {\n    super(message || 'Bad request', baseResponse);\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, BadRequestError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, BadRequestError);\n    }\n\n    this.name = 'BadRequestError';\n    this.baseResponse = baseResponse;\n  }\n}\n\n// 401\nclass UnauthorizedError extends BadRequestError {\n  public baseResponse: Response;\n\n  constructor(message: null | string, baseResponse: Response) {\n    super(message || 'Unauthorized', baseResponse);\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, UnauthorizedError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, UnauthorizedError);\n    }\n\n    this.name = 'UnauthorizedError';\n    this.baseResponse = baseResponse;\n  }\n}\n\n// 403\nclass ForbiddenError extends BadRequestError {\n  public baseResponse: Response;\n\n  constructor(message: null | string, baseResponse: Response) {\n    super(message || 'Forbidden', baseResponse);\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, ForbiddenError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, ForbiddenError);\n    }\n\n    this.name = 'ForbiddenError';\n    this.baseResponse = baseResponse;\n  }\n}\n\n// 404\nclass ResourceNotFoundError extends BadRequestError {\n  public baseResponse: Response;\n\n  constructor(message: null | string, baseResponse: Response) {\n    super(message || 'Resource is not found', baseResponse);\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, ResourceNotFoundError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, ResourceNotFoundError);\n    }\n\n    this.name = 'ResourceNotFoundError';\n    this.baseResponse = baseResponse;\n  }\n}\n\n// 409\nclass ConflictError extends BadRequestError {\n  public baseResponse: Response;\n\n  constructor(message: null | string, baseResponse: Response) {\n    super(message || 'Conflict detected', baseResponse);\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, ConflictError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, ConflictError);\n    }\n\n    this.name = 'ConflictError';\n    this.baseResponse = baseResponse;\n  }\n}\n\n// 500\nclass InternalServerError extends HttpError {\n  public baseResponse: Response;\n\n  constructor(message: null | string, baseResponse: Response) {\n    super(message || 'Internal server error', baseResponse);\n\n    // Set the prototype explicitly.\n    Object.setPrototypeOf(this, InternalServerError.prototype);\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, InternalServerError);\n    }\n\n    this.name = 'InternalServerError';\n    this.baseResponse = baseResponse;\n  }\n}\n\n/**\n * @returns {HttpError}\n */\nfunction getHttpErrorFromResponse(originalResponse: Response): HttpError {\n  const response = originalResponse.clone();\n  switch (true) {\n    case response.status === 401:\n      return new UnauthorizedError(null, response);\n\n    case response.status === 403:\n      return new ForbiddenError(null, response);\n\n    case response.status === 404:\n      return new ResourceNotFoundError(null, response);\n\n    case response.status === 409:\n      return new ConflictError(null, response);\n\n    case response.status >= 400 && response.status < 500:\n      return new BadRequestError(null, response);\n\n    case response.status >= 500 && response.status < 600:\n      return new InternalServerError(null, response);\n\n    default:\n      return new HttpError(null, response);\n  }\n}\n\nfunction isOauthError(body: TokenBody<Token>): body is ErrorBody {\n  return typeof (body as ErrorBody)?.error === 'string';\n}\n\nexport {\n  UnauthorizedError,\n  BadRequestError,\n  ConflictError,\n  ForbiddenError,\n  HttpError,\n  InternalServerError,\n  ResourceNotFoundError,\n  getHttpErrorFromResponse,\n  OauthError,\n  InvalidGrantError,\n  InvalidScopeError,\n  isOauthError,\n};\n","import ClassMetadata from './Mapping/ClassMetadata';\n\nconst DEFAULT_CONFIG = {\n  collectionKey: 'hydra:member',\n};\n\nclass Mapping {\n  readonly idPrefix: string;\n\n  #config!: Record<string, unknown>;\n\n  #classMetadataList: ClassMetadata[];\n\n  constructor(idPrefix = '', config = {}) {\n    this.idPrefix = idPrefix;\n\n    this.#classMetadataList = [];\n\n    this.setConfig(config);\n  }\n\n  getConfig(): Record<string, unknown> {\n    return this.#config;\n  }\n\n  setConfig(config: Record<string, unknown>): void {\n    this.#config = { ...DEFAULT_CONFIG, ...config };\n  }\n\n  setMapping(classMetadataList: ClassMetadata[] = []): void {\n    this.#classMetadataList = classMetadataList;\n  }\n\n  getMappingKeys(): string[] {\n    return this.#classMetadataList.map((classMetadata) => classMetadata.key);\n  }\n\n  getClassMetadataByKey(key: string): null | ClassMetadata {\n    const filterList = this.#classMetadataList.filter(\n      (classMetadata) => classMetadata.key === key\n    );\n\n    return filterList.length > 0 ? filterList[0] : null;\n  }\n\n  isMappingValid(): boolean {\n    return !this.#classMetadataList.some((classMetadata) => {\n      // check that the relations exists\n      const errorList = Object.values(classMetadata.getAttributeList()).map(\n        (attribute) => {\n          const relation = classMetadata.getRelation(attribute.serializedKey);\n\n          if (!relation) {\n            // attribute can not be \"invalid\" (for now ?)\n            return false;\n          }\n\n          const relationMetadata = this.getClassMetadataByKey(\n            relation.targetMetadataKey\n          );\n\n          // relation name seems weird\n          if (\n            relation.isRelationToOne() &&\n            attribute.attributeName.endsWith('List')\n          ) {\n            return `\"${classMetadata.key}.${attribute.serializedKey} is defined as a MANY_TO_ONE relation, but the attribute name ends with \"List\".`;\n          }\n\n          if (relation.isRelationToMany()) {\n            const message = `\"${classMetadata.key}.${attribute.serializedKey} is defined as a ${relation.type} relation, but the attribute name is nor plural not ends with \"List\".`;\n\n            const endsWithList = attribute.attributeName.endsWith('List');\n\n            try {\n              // eslint-disable-next-line global-require, import/no-extraneous-dependencies, @typescript-eslint/no-var-requires\n              const pluralize = require('pluralize');\n              if (\n                !endsWithList &&\n                !pluralize.isPlural(attribute.attributeName)\n              ) {\n                return message;\n              }\n            } catch (e) {\n              if (!endsWithList) {\n                return `${message}.\\nIf your keys does not ends with \"List\", then you should install the \"pluralize\" package.`;\n              }\n            }\n          }\n\n          // no error if there is metadata linked\n          if (!relationMetadata) {\n            return `\"${classMetadata.key}.${attribute.serializedKey}\" defined a relation to the metadata named \"${relation.targetMetadataKey}\" but this metadata is not knowned by the mapping`;\n          }\n\n          return false;\n        }\n      );\n\n      if (!classMetadata.hasIdentifierAttribute()) {\n        errorList.push(\n          `\"${classMetadata.key}\" has no identifier attribute set`\n        );\n      }\n\n      const nbError = errorList.filter((error) => {\n        if (error) {\n          // eslint-disable-next-line no-console\n          console.warn(error);\n        }\n\n        return error;\n      });\n\n      return nbError.length > 0;\n    });\n  }\n}\n\nexport default Mapping;\n","class Attribute {\n  readonly serializedKey: string;\n\n  readonly attributeName: string;\n\n  readonly type: string;\n\n  readonly isIdentifier: boolean;\n\n  /**\n   * @param {string} serializedKey the key returned from your API\n   * @param {null|string} attributeName the name in your entity, default to the `serializedKey` attribute\n   * @param {string} type type of the attribute\n   * @param {boolean} isIdentifier is this attribute the entity identifier\n   */\n  constructor(\n    serializedKey: string,\n    attributeName: null | string = null,\n    type = 'string',\n    isIdentifier = false\n  ) {\n    if (!serializedKey) {\n      throw new TypeError('`serializedKey` must not be empty');\n    }\n\n    this.serializedKey = serializedKey;\n    this.attributeName = attributeName || this.serializedKey;\n    this.type = type;\n    this.isIdentifier = isIdentifier;\n  }\n}\n\nexport default Attribute;\n","/* eslint-disable import/prefer-default-export */\nimport type ClassMetadata from '../Mapping/ClassMetadata';\n// eslint-disable-next-line import/no-duplicates\nimport type RestClientSdk from '../RestClientSdk';\n// eslint-disable-next-line import/no-duplicates\nimport type { MetadataDefinition, SdkMetadata } from '../RestClientSdk';\nimport type AbstractClient from '../client/AbstractClient';\n\nexport function generateRepository<D extends MetadataDefinition>(\n  sdk: RestClientSdk<SdkMetadata>,\n  metadata: ClassMetadata,\n  isUnitOfWorkEnabled = true\n): AbstractClient<D> {\n  // eslint-disable-next-line new-cap\n  return new metadata.repositoryClass(sdk, metadata, isUnitOfWorkEnabled);\n}\n","/* eslint-disable consistent-return */\nexport function removeAuthorization(\n  headers: undefined | HeadersInit\n): undefined | HeadersInit {\n  if (!headers) {\n    return;\n  }\n\n  if (headers instanceof Headers) {\n    headers.delete('Authorization');\n    return headers;\n  }\n\n  const filterAuthorization = (entries: string[][]): string[][] =>\n    entries.filter((header) => header[0] !== 'Authorization');\n\n  if (Array.isArray(headers)) {\n    return filterAuthorization(headers);\n  }\n\n  return Object.fromEntries(filterAuthorization(Object.entries(headers)));\n}\n\n/**\n * remove undefined key, usefull to remove Content-Type for example.\n * Does not apply on \"Headers\" instance as values are string in there.\n */\nexport function removeUndefinedHeaders(headers: HeadersInit): HeadersInit {\n  if (headers instanceof Headers) {\n    return headers;\n  }\n\n  const filterEntries = (entries: string[][]): string[][] =>\n    entries.filter((header) => header[1] !== undefined);\n\n  if (Array.isArray(headers)) {\n    return filterEntries(headers);\n  }\n\n  return Object.fromEntries(filterEntries(Object.entries(headers)));\n}\n\nexport function convertToRecord(headers: HeadersInit): Record<string, string> {\n  if (headers instanceof Headers) {\n    return Object.fromEntries(headers.entries());\n  }\n\n  if (Array.isArray(headers)) {\n    return Object.fromEntries(headers);\n  }\n\n  return headers;\n}\n","import URI from 'urijs';\nimport { OauthError, getHttpErrorFromResponse } from '../ErrorFactory';\nimport type ClassMetadata from '../Mapping/ClassMetadata';\n// eslint-disable-next-line import/no-duplicates\nimport type RestClientSdk from '../RestClientSdk';\n// eslint-disable-next-line import/no-duplicates\nimport type { MetadataDefinition, SdkMetadata } from '../RestClientSdk';\nimport { Token } from '../TokenGenerator/types';\nimport TokenStorageInterface from '../TokenStorageInterface';\nimport type SerializerInterface from '../serializer/SerializerInterface';\nimport { generateRepository } from '../utils/repositoryGenerator';\nimport { removeAuthorization, removeUndefinedHeaders } from './headerUtils';\n\nconst EXPIRE_LIMIT_SECONDS = 300; // = 5 minutes\n\nclass AbstractClient<D extends MetadataDefinition> {\n  sdk: RestClientSdk<SdkMetadata>;\n\n  #tokenStorage: TokenStorageInterface<Token>;\n\n  serializer: SerializerInterface;\n\n  metadata: ClassMetadata;\n\n  #isUnitOfWorkEnabled: boolean;\n\n  constructor(\n    sdk: RestClientSdk<SdkMetadata>,\n    metadata: ClassMetadata,\n    isUnitOfWorkEnabled = true\n  ) {\n    this.sdk = sdk;\n    this.#tokenStorage = sdk.tokenStorage;\n    this.serializer = sdk.serializer;\n    this.metadata = metadata;\n    this.#isUnitOfWorkEnabled = isUnitOfWorkEnabled;\n  }\n\n  withUnitOfWork(enabled: boolean): AbstractClient<D> {\n    // eslint-disable-next-line new-cap\n    return generateRepository<D>(this.sdk, this.metadata, enabled);\n  }\n\n  getDefaultParameters(): Record<string, unknown> {\n    return {};\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  getPathBase(pathParameters: Record<string, unknown>): string {\n    return `/${this.metadata.pathRoot}`;\n  }\n\n  getEntityURI(entity: D['entity']): string {\n    let idValue = this._getEntityIdentifier(entity);\n\n    if (idValue === null) {\n      throw new Error('Cannot call `getEntityURI for entity without id.`');\n    }\n\n    if (typeof idValue === 'number') {\n      if (Number.isFinite(idValue)) {\n        idValue = idValue.toString();\n      } else {\n        throw new Error('Unable to handle non-finite number');\n      }\n    }\n\n    const pathBase = this.getPathBase({});\n    if (idValue.indexOf(pathBase) > -1) {\n      return idValue;\n    }\n    return `${pathBase}/${idValue}`;\n  }\n\n  /**\n   * get an entity by its id\n   *\n   * @param {string|number} id the entity identifier\n   * @param {Record<string, unknown>} queryParam query parameters that will be added to the request\n   * @param {Record<string, unknown>} pathParameters path parameters, will be pass to the `getPathBase` method\n   * @param {Record<string, unknown>} requestParams parameters that will be send as second parameter to the `fetch` call\n   */\n  find(\n    id: string | number,\n    queryParam: Record<string, unknown> = {},\n    pathParameters: Record<string, unknown> = {},\n    requestParams: Record<string, unknown> = {}\n  ): Promise<D['entity']> {\n    const url = this._generateUrlFromParams(queryParam, pathParameters, id);\n\n    return this.deserializeResponse(\n      this.authorizedFetch(url, requestParams),\n      'item'\n    );\n  }\n\n  /**\n   * get a list of entities by some parameters\n   *\n   * @param {Record<string, unknown>} queryParam query parameters that will be added to the request\n   * @param {Record<string, unknown>} pathParameters path parameters, will be pass to the `getPathBase` method\n   * @param {Record<string, unknown>} requestParams parameters that will be send as second parameter to the `fetch` call\n   */\n  findBy(\n    queryParam: Record<string, unknown>,\n    pathParameters: Record<string, unknown> = {},\n    requestParams: Record<string, unknown> = {}\n  ): Promise<D['list']> {\n    const url = this._generateUrlFromParams(queryParam, pathParameters);\n\n    return this.deserializeResponse(\n      this.authorizedFetch(url, requestParams),\n      'list'\n    );\n  }\n\n  /**\n   * get a list of all entities\n   *\n   * @param {Record<string, unknown>} queryParam query parameters that will be added to the request\n   * @param {Record<string, unknown>} pathParameters path parameters, will be pass to the `getPathBase` method\n   * @param {Record<string, unknown>} requestParams parameters that will be send as second parameter to the `fetch` call\n   */\n  findAll(\n    queryParam: Record<string, unknown> = {},\n    pathParameters: Record<string, unknown> = {},\n    requestParams: Record<string, unknown> = {}\n  ): Promise<D['list']> {\n    return this.findBy(queryParam, pathParameters, requestParams);\n  }\n\n  /**\n   * create an entity\n   *\n   * @param {Record<string, unknown>} entity the entity to persist\n   * @param {Record<string, unknown>} queryParam query parameters that will be added to the request\n   * @param {Record<string, unknown>} pathParameters path parameters, will be pass to the `getPathBase` method\n   * @param {Record<string, unknown>} requestParams parameters that will be send as second parameter to the `fetch` call\n   */\n  create(\n    entity: D['entity'],\n    queryParam: Record<string, unknown> = {},\n    pathParameters: Record<string, unknown> = {},\n    requestParams: Record<string, unknown> = {}\n  ): Promise<D['entity']> {\n    const url = new URI(this.getPathBase(pathParameters));\n    url.addSearch(queryParam);\n\n    const oldSerializedModel = this.metadata.getDefaultSerializedModel();\n    const newSerializedModel = this.serializer.normalizeItem(\n      entity,\n      this.metadata\n    );\n\n    const diff = this.sdk.unitOfWork.getDirtyData(\n      newSerializedModel,\n      oldSerializedModel,\n      this.metadata\n    );\n\n    return this.deserializeResponse(\n      this.authorizedFetch(url, {\n        method: 'POST',\n        body: this.serializer.encodeItem(diff, this.metadata),\n        ...requestParams,\n      }),\n      'item'\n    );\n  }\n\n  /**\n   * update an entity\n   *\n   * @param {Record<string, unknown>} entity the entity to update\n   * @param {Record<string, unknown>} queryParam query parameters that will be added to the request\n   * @param {Record<string, unknown>} requestParams parameters that will be send as second parameter to the `fetch` call\n   */\n  update(\n    entity: D['entity'],\n    queryParam: Record<string, unknown> = {},\n    requestParams: Record<string, unknown> = {}\n  ): Promise<D['entity']> {\n    const url = new URI(this.getEntityURI(entity));\n    url.addSearch(queryParam);\n\n    let newSerializedModel = this.serializer.normalizeItem(\n      entity,\n      this.metadata\n    );\n\n    const identifier = this._getEntityIdentifier(newSerializedModel);\n    let oldModel;\n    if (identifier !== null) {\n      oldModel = this.sdk.unitOfWork.getDirtyEntity(identifier);\n    }\n\n    if (oldModel) {\n      newSerializedModel = this.sdk.unitOfWork.getDirtyData(\n        newSerializedModel,\n        oldModel,\n        this.metadata\n      );\n    }\n\n    return this.deserializeResponse(\n      this.authorizedFetch(url, {\n        method: 'PUT',\n        body: this.serializer.encodeItem(newSerializedModel, this.metadata),\n        ...requestParams,\n      }),\n      'item'\n    );\n  }\n\n  /**\n   * delete an entity\n   *\n   * @param {Record<string, unknown>} the entity to delete\n   * @param {Record<string, unknown>} requestParams parameters that will be send as second parameter to the `fetch` call\n   */\n  delete(entity: D['entity'], requestParams = {}): Promise<Response> {\n    const url = this.getEntityURI(entity);\n    const identifier = this._getEntityIdentifier(entity);\n\n    return this.authorizedFetch(url, {\n      method: 'DELETE',\n      ...requestParams,\n    }).then((response) => {\n      if (identifier !== null) {\n        this.sdk.unitOfWork.clear(identifier);\n      }\n\n      return response;\n    });\n  }\n\n  deserializeResponse(\n    requestPromise: Promise<Response>,\n    listOrItem: 'list'\n  ): Promise<D['list']>;\n\n  deserializeResponse(\n    requestPromise: Promise<Response>,\n    listOrItem: 'item'\n  ): Promise<D['entity']>;\n\n  deserializeResponse<LOR extends 'list' | 'item'>(\n    requestPromise: Promise<Response>,\n    listOrItem: LOR\n  ): Promise<D['entity'] | D['list']> {\n    return requestPromise\n      .then((response) => response.text().then((text) => ({ response, text })))\n      .then(({ response, text }) => {\n        if (listOrItem === 'list') {\n          // for list, we need to deserialize the result to get an object\n          const itemList = this.serializer.deserializeList(\n            text,\n            this.metadata,\n            response\n          ) as D['list'];\n\n          if (this.#isUnitOfWorkEnabled) {\n            // eslint-disable-next-line no-restricted-syntax\n            for (const decodedItem of itemList) {\n              const identifier = this._getEntityIdentifier(decodedItem);\n              const normalizedItem = this.serializer.normalizeItem(\n                decodedItem,\n                this.metadata\n              );\n\n              // then we register the re-normalized item\n              if (identifier !== null) {\n                this.sdk.unitOfWork.registerClean(identifier, normalizedItem);\n              }\n            }\n          }\n\n          return itemList as D['list'];\n        }\n\n        // for items, we can just decode the item (ie. transform it to JS object)\n        const decodedItem = this.serializer.decodeItem(\n          text,\n          this.metadata,\n          response\n        );\n\n        // and register it directy without deserializing + renormalizing\n        const identifier = this._getEntityIdentifier(decodedItem);\n\n        // and finally return the denormalized item\n        const item = this.serializer.denormalizeItem(\n          decodedItem,\n          this.metadata,\n          response\n        ) as D['entity'];\n\n        if (this.#isUnitOfWorkEnabled && identifier !== null) {\n          this.sdk.unitOfWork.registerClean(\n            identifier,\n            this.serializer.normalizeItem(item, this.metadata)\n          );\n        }\n\n        return item as D['entity'];\n      });\n  }\n\n  makeUri(input: string | URI): URI {\n    const url = input instanceof URI ? input : new URI(input);\n    url.host(this.sdk.config.path).scheme(this.sdk.config.scheme);\n\n    if (this.sdk.config.port) {\n      url.port(String(this.sdk.config.port));\n    }\n\n    if (this.sdk.mapping.idPrefix) {\n      const segments = url.segment();\n\n      if (!url.pathname().startsWith(this.sdk.mapping.idPrefix)) {\n        segments.unshift(this.sdk.mapping.idPrefix);\n        url.segment(segments);\n      }\n    }\n\n    return url;\n  }\n\n  authorizedFetch(input: string | URI, requestParams = {}): Promise<Response> {\n    const url = this.makeUri(input);\n\n    return this._fetchWithToken(url.toString(), requestParams);\n  }\n\n  private _generateUrlFromParams(\n    queryParam: Record<string, unknown>,\n    pathParameters: Record<string, unknown> = {},\n    id: null | string | number = null\n  ): URI {\n    const params = queryParam;\n    if (this.sdk.config.useDefaultParameters) {\n      Object.assign(params, this.getDefaultParameters());\n    }\n\n    const pathBase = this.getPathBase(pathParameters);\n\n    let url = null;\n    if (id) {\n      const testPathBase = this.sdk.mapping.idPrefix\n        ? `${this.sdk.mapping.idPrefix}${pathBase}`\n        : pathBase;\n\n      if (typeof id === 'string' && id.startsWith(testPathBase)) {\n        url = new URI(id);\n      } else {\n        url = new URI(`${pathBase}/${id}`);\n      }\n    } else {\n      url = new URI(pathBase);\n    }\n\n    if (params) {\n      url.addSearch(params);\n    }\n\n    return url;\n  }\n\n  private _fetchWithToken(\n    input: string,\n    requestParams = {}\n  ): Promise<Response> {\n    if (!input) {\n      throw new Error('input is empty');\n    }\n\n    if (this.#tokenStorage) {\n      return this.#tokenStorage\n        .getCurrentTokenExpiresIn()\n        .then((accessTokenExpiresIn) => {\n          if (\n            accessTokenExpiresIn !== null &&\n            accessTokenExpiresIn <= EXPIRE_LIMIT_SECONDS\n          ) {\n            return this.#tokenStorage\n              .refreshToken()\n              .then(\n                (refreshedTokenObject) => refreshedTokenObject.access_token\n              ).catch((e) => {\n                this._handleRefreshTokenFailure(e);\n\n                throw e;\n              });\n          }\n\n          return this.#tokenStorage.getAccessToken();\n        })\n        .then((token) => this._doFetch(token, input, requestParams));\n    }\n\n    return this._doFetch(null, input, requestParams);\n  }\n\n  private _refreshTokenAndRefetch(\n    input: string,\n    requestParams: RequestInit = {}\n  ): Promise<Response> {\n    return this.#tokenStorage\n      .refreshToken()\n      .then(() => {\n        // eslint-disable-next-line prefer-const\n        let { headers, ...rest } = requestParams;\n\n        const updatedRequestParams: RequestInit = {\n          ...rest,\n          headers: removeAuthorization(headers),\n        };\n\n        return this._fetchWithToken(input, updatedRequestParams);\n      })\n      .catch((e) => {\n        this._handleRefreshTokenFailure(e);\n\n        throw e;\n      });\n  }\n\n  private _manageUnauthorized(\n    response: Response,\n    input: string,\n    requestParams = {}\n  ): Promise<Response> {\n    const error = getHttpErrorFromResponse(response);\n\n    // https://tools.ietf.org/html/rfc2617#section-1.2\n    const authorizationHeader = response.headers.get('www-authenticate');\n    if (authorizationHeader) {\n      const invalidGrant =\n        authorizationHeader.indexOf('error=\"invalid_grant\"') > -1;\n\n      if (invalidGrant && this.#tokenStorage) {\n        return this._refreshTokenAndRefetch(input, requestParams);\n      }\n\n      throw error;\n    } else {\n      // if www-authenticate header is missing, try and read json response\n      return response\n        .json()\n        .then((body) => {\n          if (\n            this.#tokenStorage &&\n            (body.error === 'invalid_scope' || body.error === 'access_denied')\n          ) {\n            return this._refreshTokenAndRefetch(input, requestParams);\n          }\n          throw error;\n        })\n        .catch((err) => {\n          if (err instanceof OauthError) {\n            throw err;\n          }\n          throw error;\n        });\n    }\n  }\n\n  private _doFetch(\n    accessToken: null | string,\n    input: string,\n    requestParams: RequestInit\n  ): Promise<Response> {\n    let params = requestParams;\n    let baseHeaders: HeadersInit = {};\n\n    if (params.method !== 'GET' || (params.method !== 'GET' && params.method !== 'DELETE')) {\n      baseHeaders = {\n        'Content-Type': 'application/json',\n      };\n    }\n\n    if (accessToken) {\n      baseHeaders.Authorization = `${this.sdk.config.authorizationType} ${accessToken}`;\n    }\n\n    if (params) {\n      if (!params.headers) {\n        params.headers = {};\n      }\n\n      params.headers = Object.assign(baseHeaders, params.headers);\n    } else {\n      params = { headers: baseHeaders };\n    }\n\n    if (params.headers) {\n      params.headers = removeUndefinedHeaders(params.headers);\n    }\n\n    let logId: undefined | string;\n    if (this.sdk.logger) {\n      logId = this.sdk.logger.logRequest({ url: input, ...params });\n    }\n\n    // eslint-disable-next-line consistent-return\n    return fetch(input, params).then((response) => {\n      if (this.sdk.logger) {\n        this.sdk.logger.logResponse(response, logId);\n      }\n\n      if (response.status < 400) {\n        return response;\n      }\n\n      if (response.status === 401) {\n        return this._manageUnauthorized(response, input, params);\n      }\n\n      const httpError = getHttpErrorFromResponse(response);\n      throw httpError;\n    });\n  }\n\n  private _getEntityIdentifier(\n    object: Record<string, unknown>\n  ): null | string | number {\n    const idKey = this.metadata.getIdentifierAttribute().serializedKey;\n\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    return object[idKey];\n  }\n\n  private _handleRefreshTokenFailure(error: Error): void {\n    if (error instanceof OauthError) {\n      this.#tokenStorage.logout().then(() => {\n        if (this.sdk.config.onRefreshTokenFailure) {\n          this.sdk.config.onRefreshTokenFailure(error);\n        }\n      });\n    }\n  }\n}\n\nexport default AbstractClient;\n","import AbstractClient from '../client/AbstractClient';\nimport Attribute from './Attribute';\nimport Relation from './Relation';\n\ntype AttributeListType = { [key: string]: Attribute };\ntype RelationListType = { [key: string]: Relation };\nexport type DefaultSerializedModelType = {\n  [key: string]: null | null[];\n};\n\nclass ClassMetadata {\n  readonly key: string;\n\n  readonly pathRoot: string;\n\n  repositoryClass: typeof AbstractClient;\n\n  #attributeList: AttributeListType;\n\n  #relationList: RelationListType;\n\n  #identifierAttribute?: Attribute;\n\n  /**\n   * @param {string} key mandatory, will be passed in your serializer\n   * @param {string|null} pathRoot the endpoint of your API: will be added to the mapping prefix ('/v1' here)\n   * @param {typeof AbstractClient} repositoryClass [Overriding repository]{@link https://github.com/mapado/rest-client-js-sdk#overriding-repository} for more detail\n   */\n  constructor(\n    key: string,\n    pathRoot: string | null = null,\n    //  modelName,\n    repositoryClass: typeof AbstractClient = AbstractClient\n  ) {\n    if (!key) {\n      throw new TypeError('key attribute are required');\n    }\n\n    this.key = key;\n    this.pathRoot = pathRoot || key;\n    // this.modelName = modelName;\n    this.repositoryClass = repositoryClass;\n\n    this.#attributeList = {};\n    this.#relationList = {};\n  }\n\n  getAttribute(name: string): Attribute {\n    return this.#attributeList[name];\n  }\n\n  hasIdentifierAttribute(): boolean {\n    return !!this.#identifierAttribute;\n  }\n\n  getIdentifierAttribute(): Attribute {\n    if (!this.#identifierAttribute) {\n      throw new TypeError(\n        `\"${this.key}\" has no identifier attribute set. Did you call \"setAttributeList\" first ?`\n      );\n    }\n\n    return this.#identifierAttribute;\n  }\n\n  getAttributeList(): AttributeListType {\n    return this.#attributeList;\n  }\n\n  setAttributeList(attributeList: Attribute[]): void {\n    this.#attributeList = {};\n    this.#identifierAttribute = undefined;\n\n    attributeList.forEach((attribute) => {\n      this.#attributeList[attribute.serializedKey] = attribute;\n\n      if (attribute.isIdentifier) {\n        this.#identifierAttribute = attribute;\n      }\n    });\n\n    if (!this.#identifierAttribute) {\n      throw new TypeError(\n        `\"${this.key}\" has no identifier attribute set. You must set all your attributes in one time and send an attribute with \"isIdentifier=true\"`\n      );\n    }\n  }\n\n  setRelationList(relationList: Relation[]): void {\n    this.#relationList = {};\n\n    relationList.forEach((relation) => {\n      this.#relationList[relation.serializedKey] = relation;\n      this.#attributeList[relation.serializedKey] = new Attribute(\n        relation.serializedKey,\n        relation.serializedKey,\n        relation.isRelationToMany() ? 'array' : 'object'\n      );\n    });\n  }\n\n  getRelation(key: string): Relation {\n    return this.#relationList[key];\n  }\n\n  getDefaultSerializedModel(): DefaultSerializedModelType {\n    const out: DefaultSerializedModelType = {};\n\n    Object.keys(this.#attributeList).forEach((serializedKey) => {\n      out[serializedKey] = null;\n    });\n\n    Object.keys(this.#relationList).forEach((serializedKey) => {\n      const relation = this.#relationList[serializedKey];\n\n      if (relation.isRelationToMany()) {\n        out[serializedKey] = [];\n      }\n    });\n\n    return out;\n  }\n}\n\nexport default ClassMetadata;\n","enum RelationTypes {\n  ONE_TO_ONE = 'ONE_TO_ONE',\n  ONE_TO_MANY = 'ONE_TO_MANY',\n  MANY_TO_MANY = 'MANY_TO_MANY',\n  MANY_TO_ONE = 'MANY_TO_ONE',\n}\n\nclass Relation {\n  public static ONE_TO_ONE = RelationTypes.ONE_TO_ONE;\n\n  public static ONE_TO_MANY = RelationTypes.ONE_TO_MANY;\n\n  public static MANY_TO_ONE = RelationTypes.MANY_TO_ONE;\n\n  public static MANY_TO_MANY = RelationTypes.MANY_TO_MANY;\n\n  type: RelationTypes;\n\n  readonly targetMetadataKey: string;\n\n  readonly serializedKey: string;\n\n  readonly attributeName: string;\n\n  /**\n   * @param {RelationTypes} type the type of relation\n   * @param {string} targetMetadataKey must match the first argument of `ClassMetadata` constructor of the target entity\n   * @param {string} serializedKey the key returned from your API\n   * @param {string|null} attributeName the name in your entity, default to the `serializedKey` attribute\n   */\n  constructor(\n    type: RelationTypes,\n    targetMetadataKey: string,\n    serializedKey: string,\n    attributeName: string | null = null\n  ) {\n    this.type = type;\n    this.targetMetadataKey = targetMetadataKey;\n    this.serializedKey = serializedKey;\n    this.attributeName = attributeName || this.serializedKey;\n  }\n\n  isOneToOne(): boolean {\n    return this.type === Relation.ONE_TO_ONE;\n  }\n\n  isOneToMany(): boolean {\n    return this.type === Relation.ONE_TO_MANY;\n  }\n\n  isManyToOne(): boolean {\n    return this.type === Relation.MANY_TO_ONE;\n  }\n\n  isManyToMany(): boolean {\n    return this.type === Relation.MANY_TO_MANY;\n  }\n\n  isRelationToMany(): boolean {\n    return this.isManyToMany() || this.isOneToMany();\n  }\n\n  isRelationToOne(): boolean {\n    return this.isManyToOne() || this.isOneToOne();\n  }\n}\n\nexport default Relation;\n","/* eslint-disable */\n// \"fork\" of https://github.com/facebook/immutable-js/blob/v4.0.0-rc.9/src/Predicates.js\n// because tree-shaking does not seems to work as expected\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nexport const IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';\nexport const IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';\nexport const IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@';\nexport const IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';\nexport const IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@';\n\nexport function isImmutable(maybeImmutable: unknown): boolean {\n  return isCollection(maybeImmutable) || isRecord(maybeImmutable);\n}\n\nexport function isCollection(maybeCollection: any): boolean {\n  return !!(maybeCollection && maybeCollection[IS_ITERABLE_SENTINEL]);\n}\n\nexport function isKeyed(maybeKeyed: any): boolean {\n  return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL]);\n}\n\nexport function isIndexed(maybeIndexed: any): boolean {\n  return !!(maybeIndexed && maybeIndexed[IS_INDEXED_SENTINEL]);\n}\n\nexport function isAssociative(maybeAssociative: any): boolean {\n  return isKeyed(maybeAssociative) || isIndexed(maybeAssociative);\n}\n\nexport function isOrdered(maybeOrdered: any): boolean {\n  return !!(maybeOrdered && maybeOrdered[IS_ORDERED_SENTINEL]);\n}\n\nexport function isRecord(maybeRecord: any): boolean {\n  return !!(maybeRecord && maybeRecord[IS_RECORD_SENTINEL]);\n}\n\nexport function isValueObject(maybeValue: any): boolean {\n  return !!(\n    maybeValue &&\n    typeof maybeValue.equals === 'function' &&\n    typeof maybeValue.hashCode === 'function'\n  );\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport diff from 'deep-diff';\nimport Mapping from './Mapping';\nimport Attribute from './Mapping/Attribute';\nimport ClassMetadata, {\n  DefaultSerializedModelType,\n} from './Mapping/ClassMetadata';\nimport { isImmutable } from './isImmutable';\n\ntype Id = string | number;\ntype StringKeyObject = Record<string, any>;\n\n/**\n * deep comparaison between objects\n */\nfunction objectDiffers(\n  left: Record<string, unknown>,\n  right: Record<string, unknown>\n): boolean {\n  const result = diff(left, right);\n\n  return result ? result.length > 0 : false;\n}\n\n/**\n * get the id of an entity or return itself if string\n */\nfunction getEntityId(\n  stringOrEntity: string | Record<string, unknown>,\n  idSerializedKey: string\n): Id {\n  if (typeof stringOrEntity !== 'object') {\n    return stringOrEntity;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  return stringOrEntity[idSerializedKey] as Id;\n}\n\n/**\n * find old relation value from the new relation id\n * if not found, returs the default serilazed model\n */\nfunction findOldRelation(\n  newRelationValue: any[],\n  oldRelationValue: any[],\n  classMetadata: ClassMetadata\n): DefaultSerializedModelType {\n  const idSerializedKey = classMetadata.getIdentifierAttribute().serializedKey;\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  const relationValueId = getEntityId(newRelationValue, idSerializedKey);\n\n  const foundValue =\n    oldRelationValue &&\n    oldRelationValue.find((innerOldRelationValue) => {\n      const oldRelationValueId = getEntityId(\n        innerOldRelationValue,\n        idSerializedKey\n      );\n\n      return relationValueId === oldRelationValueId;\n    });\n\n  if (foundValue) {\n    return foundValue;\n  }\n\n  return classMetadata.getDefaultSerializedModel();\n}\n\n/**\n * add all identifier from one to many relation list\n */\nfunction getIdentifierForList(\n  newValue: any[],\n  idSerializedKey: string\n): StringKeyObject | string {\n  return newValue.map((value) => {\n    if (Object.keys(value).includes(idSerializedKey)) {\n      return {\n        [idSerializedKey]: value[idSerializedKey],\n      };\n    }\n\n    if (typeof value === 'string') {\n      return value;\n    }\n\n    throw new TypeError(\n      'new value should include a list of string or objects containing the serialized key'\n    );\n  });\n}\n\nclass UnitOfWork {\n  mapping: Mapping;\n\n  #storage: { [key in Id]: Record<string, unknown> };\n\n  #enabled: boolean;\n\n  constructor(mapping: Mapping, enabled = false) {\n    this.mapping = mapping;\n\n    this.#enabled = enabled;\n    this.#storage = {};\n  }\n\n  registerClean(id: Id, entity: Record<string, unknown>): void {\n    if (!this.#enabled) {\n      return;\n    }\n    if (isImmutable(entity)) {\n      this.#storage[id] = entity;\n    } else {\n      this.#storage[id] = { ...entity };\n    }\n  }\n\n  getDirtyEntity(id: Id): Record<string, unknown> {\n    return this.#storage[id];\n  }\n\n  clear(id: Id): void {\n    delete this.#storage[id];\n  }\n\n  getDirtyData(\n    newSerializedModel: Record<string, unknown>,\n    oldSerializedModel: Record<string, unknown>,\n    classMetadata: ClassMetadata\n  ): StringKeyObject {\n    return this._getDirtyFields(\n      newSerializedModel,\n      oldSerializedModel,\n      classMetadata\n    );\n  }\n\n  private _getDirtyFieldsForAttribute(\n    dirtyFieldsParam: StringKeyObject,\n    key: string,\n    attribute: Attribute,\n    oldValue: Record<string, unknown>,\n    newValue: Record<string, unknown>\n  ): StringKeyObject {\n    const dirtyFields = dirtyFieldsParam;\n\n    if (attribute.type === 'object') {\n      if (oldValue === undefined || objectDiffers(oldValue, newValue)) {\n        dirtyFields[key] = newValue;\n      }\n    } else if (oldValue !== newValue) {\n      dirtyFields[key] = newValue;\n    }\n\n    return dirtyFields;\n  }\n\n  private _getDirtyFieldsForManyToOne(\n    dirtyFieldsParam: StringKeyObject,\n    key: string,\n    oldValue: Record<string, unknown>,\n    newValue: Record<string, unknown>,\n    relationMetadata: ClassMetadata,\n    idSerializedKey: string\n  ): StringKeyObject {\n    const dirtyFields = dirtyFieldsParam;\n    if (oldValue !== newValue) {\n      if (newValue === null) {\n        dirtyFields[key] = null;\n\n        return dirtyFields;\n      }\n\n      if (typeof oldValue === 'string' || typeof newValue === 'string') {\n        dirtyFields[key] = newValue;\n      }\n\n      const recursiveDiff = this._getDirtyFields(\n        newValue,\n        oldValue,\n        relationMetadata\n      );\n\n      if (Object.keys(recursiveDiff).length > 0) {\n        recursiveDiff[idSerializedKey] = getEntityId(newValue, idSerializedKey);\n        dirtyFields[key] = recursiveDiff;\n      }\n    }\n\n    return dirtyFields;\n  }\n\n  private _getDirtyFieldsForOneToMany(\n    dirtyFieldsParam: StringKeyObject,\n    key: string,\n    idSerializedKey: string,\n    relationMetadata: ClassMetadata,\n    oldValue: any[],\n    newValue: any[]\n  ): StringKeyObject {\n    const dirtyFields = dirtyFieldsParam;\n    const newValueLength = newValue ? newValue.length : 0;\n    const oldValueLength = oldValue ? oldValue.length : 0;\n\n    // number of items changed\n    if (newValueLength !== oldValueLength) {\n      dirtyFields[key] = getIdentifierForList(newValue, idSerializedKey);\n    }\n\n    if (newValue && newValue.length > 0) {\n      if (dirtyFields[key] === undefined) {\n        dirtyFields[key] = [];\n      }\n\n      const relationList = newValue;\n\n      relationList.forEach((newRelationValue, relationAttributeName) => {\n        const oldRelationValue = findOldRelation(\n          newRelationValue,\n          oldValue,\n          relationMetadata\n        );\n\n        if (newRelationValue !== oldRelationValue) {\n          if (\n            typeof newRelationValue === 'string' ||\n            typeof oldRelationValue === 'string'\n          ) {\n            dirtyFields[key][relationAttributeName] = newRelationValue;\n\n            return;\n          }\n\n          const recursiveDiff = this._getDirtyFields(\n            newRelationValue,\n            oldRelationValue,\n            relationMetadata\n          );\n\n          if (Object.keys(recursiveDiff).length > 0) {\n            const entityId = getEntityId(newRelationValue, idSerializedKey);\n\n            if (entityId !== null) {\n              recursiveDiff[idSerializedKey] = entityId;\n            }\n\n            if (dirtyFields[key][relationAttributeName]) {\n              Object.assign(\n                dirtyFields[key][relationAttributeName],\n                recursiveDiff\n              );\n            } else {\n              dirtyFields[key][relationAttributeName] = recursiveDiff;\n            }\n          }\n        }\n      });\n\n      if (dirtyFields[key].length > 0) {\n        // add identifier because one or more object linked has been updated\n        // see test: 'get dirty data many to one update item'\n        dirtyFields[key] = Object.assign(\n          getIdentifierForList(newValue, idSerializedKey),\n          dirtyFields[key]\n        );\n      } else {\n        // no changes, no need to send the key with an empty array as value\n        delete dirtyFields[key];\n      }\n    }\n\n    return dirtyFields;\n  }\n\n  private _getDirtyFields(\n    newSerializedModel: StringKeyObject,\n    oldSerializedModel: StringKeyObject,\n    classMetadata: ClassMetadata\n  ): StringKeyObject {\n    let dirtyFields = {};\n\n    Object.values(classMetadata.getAttributeList()).forEach((attribute) => {\n      const key = attribute.attributeName;\n      const newValue = newSerializedModel[key];\n      const oldValue = oldSerializedModel ? oldSerializedModel[key] : null;\n\n      const currentRelation = classMetadata.getRelation(\n        attribute.serializedKey\n      );\n\n      if (newValue === undefined) {\n        return;\n      }\n\n      // not a relation\n      if (!currentRelation) {\n        dirtyFields = this._getDirtyFieldsForAttribute(\n          dirtyFields,\n          key,\n          attribute,\n          oldValue,\n          newValue\n        );\n\n        return;\n      }\n\n      const relationMetadata = this.mapping.getClassMetadataByKey(\n        currentRelation.targetMetadataKey\n      );\n\n      if (!relationMetadata) {\n        throw new TypeError(\n          `relation metadata is not set for relation ${classMetadata.key}.${currentRelation.targetMetadataKey}`\n        );\n      }\n\n      const idSerializedKey = relationMetadata.getIdentifierAttribute()\n        .serializedKey;\n\n      // MANY_TO_ONE relation\n      if (currentRelation.isRelationToOne()) {\n        dirtyFields = this._getDirtyFieldsForManyToOne(\n          dirtyFields,\n          key,\n          oldValue,\n          newValue,\n          relationMetadata,\n          idSerializedKey\n        );\n\n        return;\n      }\n\n      // *_TO_MANY relation\n      dirtyFields = this._getDirtyFieldsForOneToMany(\n        dirtyFields,\n        key,\n        idSerializedKey,\n        relationMetadata,\n        oldValue,\n        newValue\n      );\n    });\n\n    return dirtyFields;\n  }\n}\n\nexport default UnitOfWork;\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport ClassMetadata from '../Mapping/ClassMetadata';\nimport SerializerInterface, {\n  Entity,\n  NormalizedObject,\n  NormalizedList,\n  EntityList,\n} from './SerializerInterface';\n\nclass Serializer implements SerializerInterface {\n  /**\n   * convert an entity to a plain javascript object\n   * @param {object} entity - The entity to convert\n   * @param {ClassMetadata} classMetadata - the class metadata\n   * @return {object} the object to serialize\n   */\n  normalizeItem(\n    entity: Entity,\n    classMetadata: ClassMetadata\n  ): NormalizedObject {\n    return entity;\n  }\n\n  /**\n   * convert a plain javascript object to string\n   * @param {object} object - The object to convert to convert\n   * @param {ClassMetadata} classMetadata - the class metadata\n   * @return {string} the content of the request\n   */\n  encodeItem(object: NormalizedObject, classMetadata: ClassMetadata): string {\n    throw new TypeError('`encodeItem` method must be implemented');\n  }\n\n  /**\n   * convert an entity to string that will be sent as the request content\n   * @param {any} entity - The entity to convert\n   * @param {ClassMetadata} classMetadata - the class metadata\n   * @return {string} the content of the request\n   */\n  serializeItem(object: Entity, classMetadata: ClassMetadata): string {\n    const noralizedData = this.normalizeItem(object, classMetadata);\n    return this.encodeItem(noralizedData, classMetadata);\n  }\n\n  /**\n   * convert a plain object to an entity\n   * @param {object} object - The plain javascript object\n   * @param {ClassMetadata} classMetadata - the class metadata\n   * @param {Record<string, unknown>} response - the HTTP response\n   * @return {object} an entity\n   */\n  denormalizeItem(\n    object: NormalizedObject,\n    classMetadata: ClassMetadata,\n    response: Response\n  ): Entity {\n    return object;\n  }\n\n  /**\n   * convert a string containing an object to a plain javascript object\n   * @param {string} rawData - The string fetched from the response\n   * @param {ClassMetadata} classMetadata - the class metadata\n   * @param {Record<string, unknown>} response - the HTTP response\n   * @return {object} the normalized object\n   */\n  decodeItem(\n    rawData: string,\n    classMetadata: ClassMetadata,\n    response: Response\n  ): NormalizedObject {\n    throw new TypeError('`decodeItem` method must be implemented');\n  }\n\n  /**\n   * convert a string containing an object to an entity\n   * @param {string} rawData - The string fetched from the response\n   * @param {ClassMetadata} classMetadata - the class metadata\n   * @param {Record<string, unknown>} response - the HTTP response\n   * @return {object} the entity\n   */\n  deserializeItem(\n    rawData: string,\n    classMetadata: ClassMetadata,\n    response: Response\n  ): Entity {\n    const object = this.decodeItem(rawData, classMetadata, response);\n    return this.denormalizeItem(object, classMetadata, response);\n  }\n\n  /**\n   * convert a plain object list to an entity list\n   * @param {Iterable<object>} objectList - The plain javascript object list (or an iterable object)\n   * @param {ClassMetadata} classMetadata - the class metadata\n   * @param {Record<string, unknown>} response - the HTTP response\n   * @return {Iterable<object>} a list of entities\n   */\n  denormalizeList(\n    objectList: NormalizedList,\n    classMetadata: ClassMetadata,\n    response: Response\n  ): EntityList {\n    return objectList; // weird conversion as the declaration of list type is fuzzy\n  }\n\n  /**\n   * convert a string containing a list of objects to a list of plain javascript objects\n   * @param {string} rawListData - The string fetched from the response\n   * @param {ClassMetadata} classMetadata - the class metadata\n   * @param {Record<string, unknown>} response - the HTTP response\n   * @return {Iterable<object>} a list of normalized objects\n   */\n  decodeList(\n    rawListData: string,\n    classMetadata: ClassMetadata,\n    response: Response\n  ): NormalizedList {\n    throw new TypeError('`deserializeList` method must be implemented');\n  }\n\n  /**\n   * convert a string containing a list of objects to a list of entities\n   * @param {string} rawListData - The string fetched from the response\n   * @param {ClassMetadata} classMetadata - the class metadata\n   * @param {Record<string, unknown>} response - the HTTP response\n   * @return {Iterable<object>} a list of entities\n   */\n  deserializeList(\n    rawListData: string,\n    classMetadata: ClassMetadata,\n    response: Response\n  ): EntityList {\n    const objectList = this.decodeList(rawListData, classMetadata, response);\n    return this.denormalizeList(objectList, classMetadata, response);\n  }\n}\n\nexport default Serializer;\n","/* eslint-disable @typescript-eslint/no-unused-vars */\nimport ClassMetadata from '../Mapping/ClassMetadata';\nimport Serializer from './Serializer';\n\nclass JsSerializer extends Serializer {\n  encodeItem(\n    object: Record<string, unknown>,\n    classMetadata: ClassMetadata\n  ): string {\n    return JSON.stringify(object);\n  }\n\n  decodeItem(\n    rawData: string,\n    classMetadata: ClassMetadata,\n    response: Response\n  ): Record<string, unknown> {\n    return JSON.parse(rawData);\n  }\n\n  decodeList(\n    rawListData: string,\n    classMetadata: ClassMetadata,\n    response: Response\n  ): Iterable<Record<string, unknown>> {\n    return JSON.parse(rawListData);\n  }\n}\n\nexport default JsSerializer;\n","function levenshteinDistance(a: string, b: string): number {\n  const matrix: number[][] = [];\n\n  // Increment along the first column of each row\n  for (let i = 0; i <= b.length; i += 1) {\n    matrix[i] = [i];\n  }\n\n  // Increment each column in the first row\n  for (let j = 0; j <= a.length; j += 1) {\n    matrix[0][j] = j;\n  }\n\n  // Fill in the rest of the matrix\n  for (let i = 1; i <= b.length; i += 1) {\n    for (let j = 1; j <= a.length; j += 1) {\n      if (b.charAt(i - 1) === a.charAt(j - 1)) {\n        matrix[i][j] = matrix[i - 1][j - 1];\n      } else {\n        matrix[i][j] = Math.min(\n          matrix[i - 1][j - 1] + 1, // substitution\n          matrix[i][j - 1] + 1, // insertion\n          matrix[i - 1][j] + 1 // deletion\n        );\n      }\n    }\n  }\n\n  return matrix[b.length][a.length];\n}\n\n// eslint-disable-next-line import/prefer-default-export\nexport function findClosestWord(\n  word: string,\n  list: string[],\n  maxDistance = Infinity\n): string | null {\n  let closestWord: string | null = null;\n  let minDistance = Infinity;\n\n  // eslint-disable-next-line no-plusplus\n  for (let i = 0; i < list.length; i += 1) {\n    const candidate = list[i];\n    const distance = levenshteinDistance(word, candidate);\n\n    if (distance < minDistance && distance <= maxDistance) {\n      minDistance = distance;\n      closestWord = candidate;\n    }\n  }\n\n  return closestWord;\n}\n","import { convertToRecord } from '../client/headerUtils';\n\ntype SdkRequest = RequestInit & { url: string };\n\n// type SdkResponse = Partial<Response>;\ntype SdkResponse = {\n  status: number;\n  headers: Record<string, string>;\n};\n\nconst generateId = () =>\n  `rest-client-sdk|${Date.now()}-${\n    Math.floor(Math.random() * (9e12 - 1)) + 1e12\n  }`;\n\nexport type SerializableRequest = {\n  url: string;\n  method?: string;\n  headers?: Record<string, string>;\n  body?: string;\n};\n\nexport type Log = {\n  id: string;\n  request?: SerializableRequest;\n  response?: SdkResponse;\n  logTimes: {\n    request?: number;\n    response?: number;\n  };\n};\n\nexport type LoggerHistory = Array<Log>;\n\nfunction serializeRequest(req: SdkRequest): SerializableRequest {\n  const request = { ...req }; // Make a clone, useful for doing destructive things\n  return {\n    method: request.method, // The Request Method, e.g. GET, POST, DELETE\n    url: request.url, // The URL\n    headers: request.headers ? convertToRecord(request.headers) : undefined,\n    body: typeof request.body === 'string' ? request.body : undefined,\n  };\n}\n\n// eslint-disable-next-line import/prefer-default-export\nexport class Logger {\n  #history: LoggerHistory;\n\n  get history(): LoggerHistory {\n    return this.#history;\n  }\n\n  constructor() {\n    this.#history = [];\n  }\n\n  logRequest(params: SdkRequest): string {\n    const log: Log = {\n      id: generateId(),\n      request: serializeRequest(params),\n      logTimes: { request: Date.now() },\n    };\n\n    this.#history.push(log);\n\n    return log.id;\n  }\n\n  logResponse(response: Response, requestId?: undefined | string): string {\n    const id = requestId || generateId();\n\n    // console.log('clone');\n    // const clonedResponse = response.clone(); // THIS IS THE LINE THAT CAUSES THE PROBLEM\n    // console.log('after clone', clonedResponse.status);\n\n    const logContent: SdkResponse = {\n      status: response.status, // clonedResponse.status,\n      headers: Object.fromEntries(response.headers),\n    };\n\n    const foundLogIndex = this.#history.findIndex((log) => log.id === id);\n\n    if (foundLogIndex > -1) {\n      this.#history[foundLogIndex].response = logContent;\n      this.#history[foundLogIndex].logTimes.response = Date.now();\n    } else {\n      this.#history.push({\n        id,\n        response: logContent,\n        logTimes: { response: Date.now() },\n      });\n    }\n\n    return id;\n  }\n}\n","import Mapping from './Mapping';\n// eslint-disable-next-line import/no-duplicates\nimport type RestClientSdkInterface from './RestClientSdkInterface';\n// eslint-disable-next-line import/no-duplicates\nimport type { Config } from './RestClientSdkInterface';\nimport { Token } from './TokenGenerator/types';\nimport TokenStorageInterface from './TokenStorageInterface';\nimport UnitOfWork from './UnitOfWork';\nimport AbstractClient from './client/AbstractClient';\nimport JsSerializer from './serializer/JsSerializer';\nimport SerializerInterface from './serializer/SerializerInterface';\nimport { findClosestWord } from './utils/levenshtein';\nimport { Logger } from './utils/logging';\nimport { generateRepository } from './utils/repositoryGenerator';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Entity = any;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// export type SdkMetadata = Record<string, [any, Iterable<any>, undefined | any]>;\nexport type MetadataDefinition = {\n  entity: Entity;\n  list: Iterable<Entity>;\n  // repository?: typeof AbstractClient;\n};\n\nexport type SdkMetadata = Record<string, MetadataDefinition>;\n\nclass RestClientSdk<M extends SdkMetadata>\n  implements RestClientSdkInterface<M> {\n  config: Config;\n\n  public tokenStorage: TokenStorageInterface<Token>;\n\n  public serializer: SerializerInterface;\n\n  public mapping: Mapping;\n\n  public unitOfWork: UnitOfWork;\n\n  #repositoryList: Partial<Record<keyof M, AbstractClient<M[keyof M]>>>;\n\n  public readonly logger?: Logger;\n\n  constructor(\n    tokenStorage: TokenStorageInterface<Token>,\n    config: Config,\n    mapping: Mapping,\n    serializer: SerializerInterface = new JsSerializer()\n  ) {\n    this.checkConfigValidity(config);\n\n    if (!(mapping instanceof Mapping)) {\n      throw new TypeError('mapping should be an instance of `Mapping`');\n    }\n\n    this.config = this._mergeWithBaseConfig(config);\n    this.tokenStorage = tokenStorage;\n    this.serializer = serializer;\n    this.mapping = mapping;\n\n    this.unitOfWork = new UnitOfWork(\n      this.mapping,\n      this.config.unitOfWorkEnabled\n    );\n\n    if (config.loggerEnabled) {\n      this.logger = new Logger();\n    }\n\n    this.#repositoryList = {};\n  }\n\n  /**\n   * get a repository by it's metadata \"key\" attribute\n   *\n   * @param {string} key the repository \"key\" (the first argument of `new ClassMetadata`)\n   */\n  getRepository<K extends keyof M & string>(key: K): AbstractClient<M[K]> {\n    if (!this.#repositoryList[key]) {\n      const metadata = this.mapping.getClassMetadataByKey(key);\n\n      if (!metadata) {\n        const closeKey = findClosestWord(key, this.mapping.getMappingKeys(), 5);\n\n        const suggestions = closeKey ? ` Did you mean \"${closeKey}\"?` : '';\n\n        throw new Error(\n          `Unable to get metadata for repository \"${key}\".${suggestions}`\n        );\n      }\n\n      // eslint-disable-next-line new-cap\n      this.#repositoryList[key] = generateRepository<M[K]>(\n        this,\n        metadata,\n        this.config.unitOfWorkEnabled\n      );\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    return (this.#repositoryList[key]! as unknown) as AbstractClient<M[K]>;\n  }\n\n  private _mergeWithBaseConfig(config: Config): Config {\n    const newConfig = config;\n    newConfig.useDefaultParameters =\n      config.useDefaultParameters === undefined\n        ? true\n        : config.useDefaultParameters;\n\n    newConfig.authorizationType = config.authorizationType || 'Bearer';\n\n    return newConfig;\n  }\n\n  private checkConfigValidity(config: Config): void {\n    if (!(config && config.path && config.scheme)) {\n      throw new RangeError(\n        `SDK config is not valid, it should contain a \"path\", a \"scheme\" parameter,\n        and may contain a \"port\" and a \"useDefaultParameters\" parameter`\n      );\n    }\n  }\n}\n\nexport default RestClientSdk;\n","/* eslint no-unused-vars: 0 */\nimport URI from 'urijs';\nimport {\n  getHttpErrorFromResponse,\n  InvalidGrantError,\n  InvalidScopeError,\n  OauthError,\n} from '../ErrorFactory';\nimport { Logger } from '../utils/logging';\nimport TokenGeneratorInterface, {\n  TokenBodyReturn,\n} from './TokenGeneratorInterface';\nimport { ErrorBody, Token, TokenResponse } from './types';\n\ninterface UrlConfig {\n  scheme: string;\n  path: string;\n  port?: string;\n}\nabstract class AbstractTokenGenerator<T extends Token, C>\n  implements TokenGeneratorInterface<T> {\n  readonly tokenGeneratorConfig: C;\n\n  protected logger?: Logger;\n\n  constructor(tokenGeneratorConfig: C, logger?: Logger) {\n    if (logger) {\n      this.logger = logger;\n    }\n    this.tokenGeneratorConfig = tokenGeneratorConfig;\n    if (typeof this.checkTokenGeneratorConfig === 'function') {\n      this.checkTokenGeneratorConfig(this.tokenGeneratorConfig);\n    }\n  }\n\n  abstract generateToken(\n    parameters: unknown\n  ): Promise<TokenBodyReturn<T> | TokenResponse<T>>;\n\n  abstract refreshToken(\n    accessToken: null | T\n  ): Promise<TokenBodyReturn<T> | TokenResponse<T>>;\n\n  abstract checkTokenGeneratorConfig(config: C): void;\n\n  /** @deprecated */\n  protected _manageOauthError(response: Response): Promise<never> {\n    return response\n      .clone()\n      .json()\n      .then((body: ErrorBody) => {\n        if (body.error === 'invalid_grant') {\n          throw new InvalidGrantError(\n            body.error,\n            getHttpErrorFromResponse(response)\n          );\n        }\n        if (body.error === 'invalid_scope') {\n          throw new InvalidScopeError(\n            body.error,\n            getHttpErrorFromResponse(response)\n          );\n        }\n        throw new OauthError(body.error, getHttpErrorFromResponse(response));\n      })\n      .catch((err) => {\n        if (!(err instanceof OauthError)) {\n          throw new OauthError(err.type, getHttpErrorFromResponse(response));\n        }\n\n        throw err;\n      });\n  }\n\n  protected generateUrlFromConfig(config: UrlConfig): string {\n    const uri = new URI(`${config.scheme}://${config.path}`);\n\n    if (config.port) {\n      uri.port(config.port);\n    }\n\n    return uri.toString();\n  }\n}\n\nexport default AbstractTokenGenerator;\n","/* eslint-disable camelcase */\nimport AbstractTokenGenerator from './AbstractTokenGenerator';\nimport { Token, TokenResponse } from './types';\n\ntype AuthorizationCodeFlowTokenGeneratorConfig = {\n  clientId: string;\n  clientSecret: string;\n  path: string;\n  scheme: string;\n  redirectUri: string;\n  port?: string;\n  scope?: string;\n};\n\ntype GenerateTokenParameters = {\n  code: string;\n  state?: string;\n};\n\ninterface AuthorizationCodeToken extends Token {\n  access_token: string;\n  token_type: string;\n  refresh_token: string;\n  expires_in?: number;\n  scope?: string;\n}\n\ntype AuthorizationCodeFlowResponse = TokenResponse<AuthorizationCodeToken>;\n\n/**\n * This generator take cares of the second part of the authorization code flow : the part where you have a \"code\"\n * and you have validated the \"state\"\n * @See {@link https://oauth2.thephpleague.com/authorization-server/auth-code-grant/|the great article of the PHP League} about authorization code flow.\n */\nclass AuthorizationCodeFlowTokenGenerator extends AbstractTokenGenerator<\n  AuthorizationCodeToken,\n  AuthorizationCodeFlowTokenGeneratorConfig\n> {\n  /**\n   * This function needs no generate an access token\n   */\n  generateToken(\n    parameters: GenerateTokenParameters\n  ): Promise<AuthorizationCodeFlowResponse> {\n    this._checkGenerateParameters(parameters);\n\n    const url = this.generateUrlFromConfig(this.tokenGeneratorConfig);\n\n    const params = {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      body: new URLSearchParams({\n        grant_type: 'authorization_code',\n        client_id: this.tokenGeneratorConfig.clientId,\n        client_secret: this.tokenGeneratorConfig.clientSecret, // TODO : secure this ?\n        redirect_uri: this.tokenGeneratorConfig.redirectUri,\n        code: parameters.code,\n      }).toString(),\n    };\n\n    if (this.logger) {\n      this.logger.logRequest({ url, ...params });\n    }\n\n    return fetch(url, params);\n  }\n\n  /**\n   * This function needs to refresh the current possibly expired access token\n   * and return a Promise that will be resolved with a fresh access token\n   */\n  refreshToken(\n    oldAccessToken: null | AuthorizationCodeToken\n  ): Promise<AuthorizationCodeFlowResponse> {\n    if (!oldAccessToken) {\n      throw new Error(\n        'refresh_token is not set. Did you called `generateToken` before ?'\n      );\n    }\n\n    if (!oldAccessToken?.refresh_token) {\n      throw new Error('Unable to refreshToken as there are no refresh_token');\n    }\n\n    const url = this.generateUrlFromConfig(this.tokenGeneratorConfig);\n\n    const params = {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      body: new URLSearchParams({\n        grant_type: 'refresh_token',\n        client_id: this.tokenGeneratorConfig.clientId,\n        client_secret: this.tokenGeneratorConfig.clientSecret,\n        refresh_token: oldAccessToken.refresh_token,\n      }).toString(),\n    };\n\n    if (this.logger) {\n      this.logger.logRequest({ url, ...params });\n    }\n\n    return fetch(url, params);\n  }\n\n  checkTokenGeneratorConfig(\n    config: AuthorizationCodeFlowTokenGeneratorConfig\n  ): void {\n    if (!config || Object.keys(config).length === 0) {\n      throw new RangeError('TokenGenerator config must be set');\n    }\n\n    if (!(config.path && config.scheme)) {\n      throw new RangeError(\n        'TokenGenerator config is not valid, it should contain a \"path\", a \"scheme\" parameter'\n      );\n    }\n\n    if (!(config.clientId && config.clientSecret)) {\n      throw new RangeError(\n        'TokenGenerator config is not valid, it should contain a \"clientId\", a \"clientSecret\" parameter'\n      );\n    }\n\n    if (!config.redirectUri) {\n      throw new RangeError(\n        'TokenGenerator config is not valid, it should contain a \"redirectUri\" parameter'\n      );\n    }\n  }\n\n  private _checkGenerateParameters(parameters: GenerateTokenParameters): void {\n    if (!(parameters && Object.keys(parameters).length > 0)) {\n      throw new RangeError('parameters must be set');\n    }\n\n    if (!parameters.code) {\n      throw new RangeError('\"code\" must be passed as parameter');\n    }\n  }\n}\n\nexport default AuthorizationCodeFlowTokenGenerator;\n","/* eslint-disable import/prefer-default-export */\n\n// memoize promise returning function so that it returns\n// the same promise if called again before resolve / reject\n\ninterface MemoizableFunction<P, R> {\n  (...params: P[]): Promise<R> | false;\n}\n\ntype FalsableCallbackReturn<R> = false | Promise<R>;\n\nexport function memoizePromise<P, R>(\n  callback: MemoizableFunction<P, R>\n): () => Promise<R> {\n  const cache: { [key: string]: FalsableCallbackReturn<R> } = {};\n\n  function memoized(this: unknown, ...parameters: P[]): Promise<R> {\n    const cacheKey = JSON.stringify(parameters);\n    const cacheValue = cache[cacheKey];\n\n    if (cacheValue) {\n      return cacheValue;\n    }\n\n    // Get and add the value to the cache\n    const value = callback.apply(this, parameters);\n    cache[cacheKey] = value;\n\n    if (!value || typeof value.then !== 'function') {\n      throw new Error(\n        'Memoization Error, Async function returned non-promise value'\n      );\n    }\n\n    // Delete the value regardless of whether it resolves or rejects\n    return value.then(\n      (internalValue: R) => {\n        cache[cacheKey] = false;\n\n        return internalValue;\n      },\n      (err: Error) => {\n        cache[cacheKey] = false;\n\n        throw err;\n      }\n    );\n  }\n\n  memoized.cache = cache;\n\n  return memoized;\n}\n","/* eslint-disable camelcase */\nimport { memoizePromise } from '../decorator';\nimport AbstractTokenGenerator from './AbstractTokenGenerator';\nimport { Token, TokenResponse } from './types';\n\nconst ERROR_CONFIG_EMPTY = 'TokenGenerator config must be set';\nconst ERROR_CONFIG_PATH_SCHEME =\n  'TokenGenerator config is not valid, it should contain a \"path\", a \"scheme\" parameter';\nconst ERROR_CONFIG_CLIENT_INFORMATIONS =\n  'TokenGenerator config is not valid, it should contain a \"clientId\", a \"clientSecret\" parameter';\n\ntype Config = {\n  clientId: string;\n  clientSecret: string;\n  path: string;\n  scheme: string;\n  port?: string;\n  scope?: string;\n};\n\ntype BaseParameters = {\n  scope?: string;\n};\n\ninterface ClientCredentialToken extends Token {\n  access_token: string;\n  token_type: string;\n  refresh_token: never;\n  expires_in?: number;\n  scope?: string;\n}\n\ntype ClientCredentialResponse = TokenResponse<ClientCredentialToken>;\n\nclass ClientCredentialsGenerator extends AbstractTokenGenerator<\n  ClientCredentialToken,\n  Config\n> {\n  constructor(tokenGeneratorConfig: Config) {\n    super(tokenGeneratorConfig);\n    this.generateToken = memoizePromise(this.generateToken);\n  }\n\n  generateToken(\n    baseParameters: BaseParameters = {}\n  ): Promise<ClientCredentialResponse> {\n    const body = new URLSearchParams({\n      grant_type: 'client_credentials',\n      client_id: this.tokenGeneratorConfig.clientId,\n      client_secret: this.tokenGeneratorConfig.clientSecret,\n    });\n    if (baseParameters.scope) {\n      body.append('scope', baseParameters.scope);\n    } else if (this.tokenGeneratorConfig.scope) {\n      body.append('scope', this.tokenGeneratorConfig.scope);\n    }\n\n    const params = {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      body: body.toString(),\n    };\n\n    const url = this.generateUrlFromConfig(this.tokenGeneratorConfig);\n\n    if (this.logger) {\n      this.logger.logRequest({ url, ...params });\n    }\n\n    return fetch(url, params);\n  }\n\n  refreshToken(\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    accessToken: null | ClientCredentialToken\n  ): Promise<ClientCredentialResponse> {\n    return this.generateToken({});\n  }\n\n  checkTokenGeneratorConfig(config: Config): void {\n    if (!config || Object.keys(config).length === 0) {\n      throw new RangeError(ERROR_CONFIG_EMPTY);\n    }\n\n    if (!(config.path && config.scheme)) {\n      throw new RangeError(ERROR_CONFIG_PATH_SCHEME);\n    }\n\n    if (!(config.clientId && config.clientSecret)) {\n      throw new RangeError(ERROR_CONFIG_CLIENT_INFORMATIONS);\n    }\n  }\n}\n\nexport default ClientCredentialsGenerator;\n","/* eslint-disable camelcase */\nimport AbstractTokenGenerator from './AbstractTokenGenerator';\nimport { Token, TokenResponse } from './types';\n\nconst ERROR_CONFIG_EMPTY = 'TokenGenerator config must be set';\nconst ERROR_CONFIG_PATH_SCHEME =\n  'TokenGenerator config is not valid, it should contain a \"path\", a \"scheme\" parameter';\nconst ERROR_CONFIG_CLIENT_INFORMATIONS =\n  'TokenGenerator config is not valid, it should contain a \"clientId\", a \"clientSecret\" parameter';\n\nconst ERROR_TOKEN_EMPTY = 'parameters must be set';\nconst ERROR_TOKEN_USERNAME_PASSWORD =\n  'username and password must be passed as parameters';\n\ntype Config = {\n  clientId: string;\n  clientSecret: string;\n  path: string;\n  scheme: string;\n  port?: string;\n  scope?: string;\n};\n\ntype GenerateTokenParameters = {\n  username: string;\n  password: string;\n  scope?: string;\n};\n\ninterface PasswordToken extends Token {\n  access_token: string;\n  token_type: string;\n  refresh_token?: string;\n  expires_in?: number;\n  scope?: string;\n}\n\ntype PasswordTokenResponse = TokenResponse<PasswordToken>;\n\nclass PasswordGenerator extends AbstractTokenGenerator<PasswordToken, Config> {\n  generateToken(\n    baseParameters: GenerateTokenParameters\n  ): Promise<PasswordTokenResponse> {\n    this._checkGenerateParameters(baseParameters);\n\n    const body = new URLSearchParams({\n      grant_type: 'password',\n      username: baseParameters.username,\n      password: baseParameters.password,\n      client_id: this.tokenGeneratorConfig.clientId,\n      client_secret: this.tokenGeneratorConfig.clientSecret,\n    });\n\n    if (baseParameters.scope) {\n      body.append('scope', baseParameters.scope);\n    } else if (this.tokenGeneratorConfig.scope) {\n      body.append('scope', this.tokenGeneratorConfig.scope);\n    }\n\n    const url = this.generateUrlFromConfig(this.tokenGeneratorConfig);\n\n    const params = {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      body: body.toString(),\n    };\n\n    if (this.logger) {\n      this.logger.logRequest({ url, ...params });\n    }\n\n    return fetch(url, params);\n  }\n\n  refreshToken(\n    accessToken: null | PasswordToken\n  ): Promise<PasswordTokenResponse> {\n    const refreshToken = accessToken?.refresh_token;\n    if (!refreshToken) {\n      throw new Error(\n        'refresh_token is not set. Did you called `generateToken` before ?'\n      );\n    }\n\n    const body = new URLSearchParams({\n      grant_type: 'refresh_token',\n      client_id: this.tokenGeneratorConfig.clientId,\n      client_secret: this.tokenGeneratorConfig.clientSecret,\n      refresh_token: refreshToken,\n    });\n\n    if (this.tokenGeneratorConfig.scope) {\n      body.append('scope', this.tokenGeneratorConfig.scope);\n    }\n\n    const url = this.generateUrlFromConfig(this.tokenGeneratorConfig);\n\n    const params = {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n      body: body.toString(),\n    };\n\n    if (this.logger) {\n      this.logger.logRequest({ url, ...params });\n    }\n\n    return fetch(url, params);\n  }\n\n  checkTokenGeneratorConfig(config: Config): void {\n    if (!config || Object.keys(config).length === 0) {\n      throw new RangeError(ERROR_CONFIG_EMPTY);\n    }\n\n    if (!(config.path && config.scheme)) {\n      throw new RangeError(ERROR_CONFIG_PATH_SCHEME);\n    }\n\n    if (!(config.clientId && config.clientSecret)) {\n      throw new RangeError(ERROR_CONFIG_CLIENT_INFORMATIONS);\n    }\n  }\n\n  _checkGenerateParameters(parameters: GenerateTokenParameters): void {\n    if (!(parameters && Object.keys(parameters).length > 0)) {\n      throw new RangeError(ERROR_TOKEN_EMPTY);\n    }\n\n    if (!(parameters.username && parameters.password)) {\n      throw new RangeError(ERROR_TOKEN_USERNAME_PASSWORD);\n    }\n  }\n}\n\nexport default PasswordGenerator;\n","/* eslint-disable camelcase */\nimport TokenGeneratorInterface from './TokenGeneratorInterface';\nimport { Token } from './types';\n\ntype RefreshTokenFunc = (oldAccessToken: null | Token) => Promise<Token>;\n\n/**\n * @deprecated ProvidedTokenGenerator is not an Oauth valid generator.\n * You should use one of the official generator or implement your own custom generator.\n */\nclass ProvidedTokenGenerator implements TokenGeneratorInterface<Token> {\n  #token: Token;\n\n  #refreshTokenFunc: null | RefreshTokenFunc;\n\n  constructor(token: Token, refreshTokenFunc: null | RefreshTokenFunc = null) {\n    this.#token = token;\n    this.#refreshTokenFunc = refreshTokenFunc;\n  }\n\n  set token(token: Token) {\n    this.#token = token;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  generateToken(): Promise<Token> {\n    return Promise.resolve(this.#token);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  refreshToken(accessToken: null | Token): Promise<Token> {\n    if (typeof this.#refreshTokenFunc === 'function') {\n      return this.#refreshTokenFunc(accessToken);\n    }\n\n    return this.generateToken();\n  }\n\n  autoGenerateToken(): Promise<Token> {\n    return this.generateToken();\n  }\n}\n\nexport default ProvidedTokenGenerator;\n","/* eslint-disable camelcase */\nimport AsyncStorageInterface from './AsyncStorageInterface';\nimport {\n  getHttpErrorFromResponse,\n  InvalidGrantError,\n  InvalidScopeError,\n  isOauthError,\n  OauthError,\n} from './ErrorFactory';\nimport TokenGeneratorInterface, {\n  TokenBodyReturn,\n} from './TokenGenerator/TokenGeneratorInterface';\nimport { ErrorBody, Token, TokenResponse } from './TokenGenerator/types';\n// eslint-disable-next-line import/no-duplicates\nimport type TokenStorageInterface from './TokenStorageInterface';\n// eslint-disable-next-line import/no-duplicates\nimport type { HasExpiresAt } from './TokenStorageInterface';\nimport { memoizePromise } from './decorator';\nimport { Logger } from './utils/logging';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isResponse(response: any): response is Response {\n  return typeof response?.json === 'function';\n}\n\nfunction manageOauthError(body: ErrorBody, response?: Response): never {\n  let error;\n  if (response) {\n    error = getHttpErrorFromResponse(response);\n  }\n\n  if (body.error === 'invalid_grant') {\n    throw new InvalidGrantError(body.error, error);\n  }\n  if (body.error === 'invalid_scope') {\n    throw new InvalidScopeError(body.error, error);\n  }\n\n  throw new OauthError(body.error, error);\n}\n\nclass TokenStorage<T extends Token> implements TokenStorageInterface<T> {\n  #tokenGenerator: TokenGeneratorInterface<T>;\n\n  #hasATokenBeenGenerated: boolean;\n\n  accessTokenKey: string;\n\n  #asyncStorage!: AsyncStorageInterface;\n\n  #logger?: Logger;\n\n  constructor(\n    tokenGenerator: TokenGeneratorInterface<T>,\n    asyncStorage: AsyncStorageInterface,\n    accessTokenKey = 'rest_client_sdk.api.access_token',\n    logger?: Logger\n  ) {\n    if (logger) {\n      this.#logger = logger;\n    }\n    this.#tokenGenerator = tokenGenerator;\n    this.#hasATokenBeenGenerated = false;\n    this.setAsyncStorage(asyncStorage);\n    this.accessTokenKey = accessTokenKey;\n\n    this.handleTokenResponse = this.handleTokenResponse.bind(this);\n\n    this.generateToken = memoizePromise(this.generateToken);\n    this.refreshToken = memoizePromise(this.refreshToken);\n  }\n\n  setAsyncStorage(asyncStorage: AsyncStorageInterface): void {\n    this.#asyncStorage = asyncStorage;\n  }\n\n  hasAccessToken(): Promise<boolean> {\n    return this.#asyncStorage\n      .getItem(this.accessTokenKey)\n      .then((accessToken) => !!accessToken);\n  }\n\n  getAccessToken(): Promise<null | string> {\n    return this.getAccessTokenObject().then(\n      (token) => token && token.access_token\n    );\n  }\n\n  getAccessTokenObject(): Promise<null | (T & HasExpiresAt)> {\n    return this.#asyncStorage.getItem(this.accessTokenKey).then((token) => {\n      if (token) {\n        const tokenObject = JSON.parse(token);\n\n        if (typeof tokenObject !== 'object') {\n          return null;\n        }\n\n        return tokenObject;\n      }\n\n      if (this.#hasATokenBeenGenerated) {\n        return null;\n      }\n\n      if (typeof this.#tokenGenerator.autoGenerateToken === 'function') {\n        return this.#tokenGenerator.autoGenerateToken();\n      }\n\n      throw new Error('No token has been generated yet.');\n    });\n  }\n\n  logout(): Promise<void> {\n    return this.#asyncStorage.removeItem(this.accessTokenKey);\n  }\n\n  private _addExpiresAtToResponseData(\n    responseData: T,\n    callTimestamp: number\n  ): T & HasExpiresAt {\n    if (!responseData) {\n      return responseData;\n    }\n\n    const updatedResponseData: T & HasExpiresAt = {\n      ...responseData,\n      expires_at: null,\n    };\n\n    if (\n      typeof updatedResponseData.expires_in !== 'undefined' &&\n      updatedResponseData.expires_in !== null\n      // && updatedResponseData.expires_in >= 0\n    ) {\n      updatedResponseData.expires_at =\n        Math.round(callTimestamp / 1000) + updatedResponseData.expires_in;\n    }\n\n    return updatedResponseData;\n  }\n\n  generateToken(parameters: unknown): Promise<T & HasExpiresAt> {\n    const callTimestamp = Date.now();\n\n    return this.#tokenGenerator\n      .generateToken(parameters)\n      .then(this.handleTokenResponse)\n      .then((body) => {\n        const updatedResponseData = this._addExpiresAtToResponseData(\n          body,\n          callTimestamp\n        );\n\n        return this._storeAccessToken(updatedResponseData).then(() => {\n          this.#hasATokenBeenGenerated = true;\n          return updatedResponseData;\n        });\n      });\n  }\n\n  refreshToken(): Promise<T & HasExpiresAt> {\n    return this.#asyncStorage.getItem(this.accessTokenKey).then((token) => {\n      const callTimestamp = Date.now();\n      return this.#tokenGenerator\n        .refreshToken(token ? JSON.parse(token) : null)\n        .then(this.handleTokenResponse)\n        .then((body) => {\n          const updatedResponseData = this._addExpiresAtToResponseData(\n            body,\n            callTimestamp\n          );\n\n          return this._storeAccessToken(updatedResponseData).then(\n            () => updatedResponseData\n          );\n        });\n    });\n  }\n\n  private handleTokenResponse(\n    responseOrBody: TokenBodyReturn<T> | TokenResponse<T>\n  ): Promise<T> {\n    if (isResponse(responseOrBody)) {\n      const response = responseOrBody;\n      const originalResponse = response.clone();\n\n      if (this.#logger) {\n        this.#logger.logResponse(response);\n      }\n\n      return response\n        .json()\n        .then((body) => {\n          if (isOauthError(body)) {\n            // throw error if response body is an oauth error\n            manageOauthError(body, originalResponse);\n          } else if (response.status >= 400) {\n            // throw an error if response status code is an \"error\" status code\n            throw getHttpErrorFromResponse(originalResponse);\n          }\n\n          return body;\n        })\n        .catch((err) => {\n          if (!(err instanceof OauthError)) {\n            throw new OauthError(\n              err.type,\n              getHttpErrorFromResponse(originalResponse)\n            );\n          }\n\n          throw err;\n        });\n    }\n\n    const body = responseOrBody;\n\n    if (isOauthError(body)) {\n      // throw error if response body is an oauth error\n      manageOauthError(body);\n    }\n\n    return Promise.resolve(body);\n  }\n\n  /**\n   * Return the number of second when the token will expire\n   * return value can be negative if the token is already expired\n   */\n  getCurrentTokenExpiresIn(): Promise<number | null> {\n    return this.getAccessTokenObject().then((accessTokenObject) => {\n      if (accessTokenObject === null) {\n        throw new Error('No token has been stored.');\n      }\n\n      if (\n        typeof accessTokenObject.expires_at === 'undefined' ||\n        accessTokenObject.expires_at === null\n      ) {\n        return null;\n      }\n\n      const now = Math.round(Date.now() / 1000);\n      return accessTokenObject.expires_at - now;\n    });\n  }\n\n  private _storeAccessToken(responseData: T): Promise<unknown> {\n    return this.#asyncStorage.setItem(\n      this.accessTokenKey,\n      JSON.stringify(responseData)\n    );\n  }\n}\n\nexport default TokenStorage;\n"],"names":["HttpError","message","baseResponse","Object","setPrototypeOf","OauthError","prototype","Error","captureStackTrace","name","json","previousError","InvalidGrantError","InvalidScopeError","BadRequestError","UnauthorizedError","ForbiddenError","ResourceNotFoundError","ConflictError","InternalServerError","getHttpErrorFromResponse","originalResponse","response","clone","status","isOauthError","body","error","DEFAULT_CONFIG","collectionKey","Mapping","idPrefix","config","setConfig","classMetadataList","map","classMetadata","key","filterList","filter","length","some","errorList","values","getAttributeList","attribute","relation","getRelation","serializedKey","relationMetadata","getClassMetadataByKey","targetMetadataKey","isRelationToOne","attributeName","endsWith","isRelationToMany","type","endsWithList","pluralize","require","isPlural","e","hasIdentifierAttribute","push","nbError","console","warn","Attribute","isIdentifier","TypeError","generateRepository","sdk","metadata","isUnitOfWorkEnabled","repositoryClass","removeAuthorization","headers","Headers","filterAuthorization","entries","header","Array","isArray","fromEntries","removeUndefinedHeaders","filterEntries","undefined","convertToRecord","EXPIRE_LIMIT_SECONDS","AbstractClient","tokenStorage","serializer","enabled","pathParameters","pathRoot","entity","idValue","_getEntityIdentifier","Number","isFinite","toString","pathBase","getPathBase","indexOf","id","queryParam","requestParams","url","_generateUrlFromParams","deserializeResponse","authorizedFetch","findBy","URI","addSearch","oldSerializedModel","getDefaultSerializedModel","newSerializedModel","normalizeItem","diff","unitOfWork","getDirtyData","method","encodeItem","getEntityURI","identifier","oldModel","getDirtyEntity","then","clear","requestPromise","listOrItem","text","itemList","deserializeList","decodedItem","normalizedItem","registerClean","decodeItem","item","denormalizeItem","input","host","path","scheme","port","String","mapping","segments","segment","pathname","startsWith","unshift","makeUri","_fetchWithToken","params","useDefaultParameters","assign","getDefaultParameters","testPathBase","getCurrentTokenExpiresIn","accessTokenExpiresIn","refreshToken","refreshedTokenObject","access_token","_handleRefreshTokenFailure","getAccessToken","token","_doFetch","rest","updatedRequestParams","authorizationHeader","get","invalidGrant","_refreshTokenAndRefetch","err","accessToken","baseHeaders","Authorization","authorizationType","logId","logger","logRequest","fetch","logResponse","_manageUnauthorized","httpError","object","idKey","getIdentifierAttribute","logout","onRefreshTokenFailure","ClassMetadata","attributeList","forEach","relationList","out","keys","RelationTypes","Relation","ONE_TO_ONE","ONE_TO_MANY","MANY_TO_ONE","MANY_TO_MANY","isManyToMany","isOneToMany","isManyToOne","isOneToOne","IS_ITERABLE_SENTINEL","IS_RECORD_SENTINEL","isImmutable","maybeImmutable","isCollection","isRecord","maybeCollection","maybeRecord","objectDiffers","left","right","result","getEntityId","stringOrEntity","idSerializedKey","findOldRelation","newRelationValue","oldRelationValue","relationValueId","foundValue","find","innerOldRelationValue","oldRelationValueId","getIdentifierForList","newValue","value","includes","UnitOfWork","_getDirtyFields","dirtyFieldsParam","oldValue","dirtyFields","recursiveDiff","newValueLength","oldValueLength","relationAttributeName","entityId","currentRelation","_getDirtyFieldsForAttribute","_getDirtyFieldsForManyToOne","_getDirtyFieldsForOneToMany","Serializer","noralizedData","rawData","objectList","rawListData","decodeList","denormalizeList","JsSerializer","JSON","stringify","parse","levenshteinDistance","a","b","matrix","i","j","charAt","Math","min","findClosestWord","word","list","maxDistance","Infinity","closestWord","minDistance","candidate","distance","generateId","Date","now","floor","random","serializeRequest","req","request","Logger","log","logTimes","requestId","logContent","foundLogIndex","findIndex","RestClientSdk","checkConfigValidity","_mergeWithBaseConfig","unitOfWorkEnabled","loggerEnabled","closeKey","getMappingKeys","suggestions","newConfig","RangeError","AbstractTokenGenerator","tokenGeneratorConfig","checkTokenGeneratorConfig","uri","AuthorizationCodeFlowTokenGenerator","parameters","_checkGenerateParameters","generateUrlFromConfig","URLSearchParams","grant_type","client_id","clientId","client_secret","clientSecret","redirect_uri","redirectUri","code","oldAccessToken","refresh_token","memoizePromise","callback","cache","memoized","cacheKey","cacheValue","apply","internalValue","ERROR_CONFIG_EMPTY","ERROR_CONFIG_PATH_SCHEME","ERROR_CONFIG_CLIENT_INFORMATIONS","ClientCredentialsGenerator","generateToken","baseParameters","scope","append","ERROR_TOKEN_EMPTY","ERROR_TOKEN_USERNAME_PASSWORD","PasswordGenerator","username","password","ProvidedTokenGenerator","refreshTokenFunc","Promise","resolve","isResponse","manageOauthError","TokenStorage","tokenGenerator","asyncStorage","accessTokenKey","setAsyncStorage","handleTokenResponse","bind","getItem","getAccessTokenObject","tokenObject","autoGenerateToken","removeItem","responseData","callTimestamp","updatedResponseData","expires_at","expires_in","round","_addExpiresAtToResponseData","_storeAccessToken","responseOrBody","accessTokenObject","setItem"],"mappings":"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"}