{"version":3,"file":"index.cjs","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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"}