{"version":3,"file":"convert-query-params.mjs","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _, { cloneDeep, get, isEmpty, isObject, isString, toNumber } from 'lodash';\nimport {\n  constants,\n  hasDraftAndPublish,\n  isDynamicZoneAttribute,\n  isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n  getMeaningfulSortSegments,\n  hasSort,\n  type SortParams,\n  type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n  [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\nconst hasOwnProperty = (object: object, key: PropertyKey): boolean =>\n  Object.prototype.hasOwnProperty.call(object, key);\n\nconst setSortMapValue = (field: string, order: SortOrder): SortMap => {\n  const path = _.toPath(field);\n  const sortMap: SortMap = {};\n  let current: SortMap | SortMap[] = sortMap;\n\n  for (const [index, key] of path.entries()) {\n    const isLastSegment = index === path.length - 1;\n\n    if (key === 'prototype' || (key in current && !hasOwnProperty(current, key))) {\n      throw new ValidationError('Invalid sort query');\n    }\n\n    if (isLastSegment) {\n      Object.defineProperty(current, key, {\n        configurable: true,\n        enumerable: true,\n        value: order,\n        writable: true,\n      });\n      continue;\n    }\n\n    const nextValue = /^\\d+$/.test(path[index + 1]) ? [] : {};\n\n    Object.defineProperty(current, key, {\n      configurable: true,\n      enumerable: true,\n      value: nextValue,\n      writable: true,\n    });\n\n    current = nextValue;\n  }\n\n  return sortMap;\n};\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n  const keys = Object.keys(sortMap);\n\n  if (keys.length === 0) {\n    return true;\n  }\n\n  return keys.every((key) => {\n    const value = sortMap[key];\n\n    if (typeof value === 'string') {\n      return value.trim().length === 0;\n    }\n\n    if (isPlainObject(value)) {\n      return isEmptySortMap(value as SortMap);\n    }\n\n    return true;\n  });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n  if (Array.isArray(orderBy)) {\n    const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n    return filtered.length > 0 ? filtered : undefined;\n  }\n\n  return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n  [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n  sort?: SortParams;\n  fields?: FieldsParams;\n  filters?: FiltersParams;\n  populate?: string | string[] | PopulateAttributesParams;\n  on?: PopulateAttributesParams;\n  count?: boolean;\n  ordering?: unknown;\n  _q?: string;\n  limit?: number | string;\n  start?: number | string;\n  page?: number | string;\n  pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n  sort?: SortParams;\n  fields?: FieldsParams;\n  filters?: FiltersParams;\n  populate?: PopulateParams;\n  count?: boolean;\n  ordering?: unknown;\n  _q?: string;\n  limit?: number | string;\n  start?: number | string;\n  page?: number | string;\n  pageSize?: number | string;\n  status?: 'draft' | 'published';\n  publicationFilter?: PublicationFilterMode;\n  /**\n   * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n   * Retained for backward compatibility with existing REST and GraphQL clients.\n   */\n  hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n  [key: string]: any;\n}\n\ntype PopulateQuery =\n  | boolean\n  | string[]\n  | {\n      [key: string]: PopulateQuery;\n    };\n\nexport interface Query {\n  orderBy?: OrderByQuery;\n  select?: SelectQuery;\n  where?: WhereQuery;\n  // NOTE: those are internal DB filters do not modify\n  filters?: FiltersQuery;\n  populate?: PopulateQuery;\n  count?: boolean;\n  ordering?: unknown;\n  _q?: string;\n  limit?: number;\n  offset?: number;\n  page?: number;\n  pageSize?: number;\n}\n\nclass InvalidOrderError extends ValidationError {\n  constructor() {\n    super('Invalid order. order can only be one of asc|desc|ASC|DESC');\n  }\n}\n\nclass InvalidSortError extends ValidationError {\n  constructor() {\n    super(\n      'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects'\n    );\n  }\n}\n\nclass InvalidPopulateError extends ValidationError {\n  constructor() {\n    super('Invalid populate parameter. Expected a string, an array of strings, a populate object');\n  }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n  if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n    throw new InvalidOrderError();\n  }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n  return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n  return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n  Array.isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n  getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n  /**\n   * Sort query parser\n   */\n  const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n    if (typeof sortQuery === 'string') {\n      return convertStringSortQueryParam(sortQuery);\n    }\n\n    if (isStringArray(sortQuery)) {\n      return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n    }\n\n    if (Array.isArray(sortQuery)) {\n      return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n    }\n\n    if (isPlainObject(sortQuery)) {\n      return convertNestedSortQueryParam(sortQuery);\n    }\n\n    throw new InvalidSortError();\n  };\n\n  const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n    return getMeaningfulSortSegments(sortQuery).map((segment) =>\n      convertSingleSortQueryParam(segment)\n    );\n  };\n\n  const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n    const trimmed = sortQuery.trim();\n\n    if (!trimmed) {\n      return {};\n    }\n\n    if (!isString(trimmed)) {\n      throw new ValidationError('Invalid sort query');\n    }\n\n    // split field and order param with default order to ascending\n    const [rawField, order = 'asc'] = trimmed.split(':');\n    const field = rawField.trim();\n\n    if (field.length === 0) {\n      throw new ValidationError('Field cannot be empty');\n    }\n\n    validateOrder(order.trim());\n\n    // TODO: field should be a valid path on an object model\n\n    return setSortMapValue(field, order.trim() as SortOrder);\n  };\n\n  const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n    const transformedSort: SortMap = {};\n    for (const field of Object.keys(sortQuery)) {\n      const order = sortQuery[field];\n\n      // this is a deep sort\n      if (isPlainObject(order)) {\n        const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n        if (!isEmptySortMap(nested)) {\n          transformedSort[field] = nested;\n        }\n      } else if (typeof order === 'string') {\n        const trimmedOrder = order.trim();\n\n        if (trimmedOrder.length > 0) {\n          validateOrder(trimmedOrder);\n          transformedSort[field] = trimmedOrder;\n        }\n      } else {\n        throw new ValidationError(\n          `Invalid sort type expected object or string got ${typeof order}`\n        );\n      }\n    }\n\n    return transformedSort;\n  };\n\n  const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n    if (!hasSort(sortParam)) {\n      return;\n    }\n\n    const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n    if (orderBy !== undefined) {\n      query.orderBy = orderBy;\n    }\n  };\n\n  /**\n   * Start query parser\n   */\n  const convertStartQueryParams = (startQuery: unknown): number => {\n    const startAsANumber = toNumber(startQuery);\n\n    if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n      throw new ValidationError(\n        `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n      );\n    }\n\n    return startAsANumber;\n  };\n\n  /**\n   * Limit query parser\n   */\n  const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n    const limitAsANumber = toNumber(limitQuery);\n\n    if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n      throw new ValidationError(\n        `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n      );\n    }\n\n    if (limitAsANumber === -1) {\n      return undefined;\n    }\n\n    return limitAsANumber;\n  };\n\n  const convertPageQueryParams = (page: unknown): number => {\n    const pageVal = toNumber(page);\n\n    if (!Number.isInteger(pageVal) || pageVal <= 0) {\n      throw new PaginationError(\n        `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n      );\n    }\n\n    return pageVal;\n  };\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n    const pageSizeVal = toNumber(pageSize);\n\n    if (!Number.isInteger(pageSizeVal) || pageSizeVal <= 0) {\n      throw new PaginationError(\n        `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n      );\n    }\n\n    return pageSizeVal;\n  };\n\n  const validatePaginationParams = (\n    page: unknown,\n    pageSize: unknown,\n    start: unknown,\n    limit: unknown\n  ) => {\n    const isPagePagination = page != null || pageSize != null;\n    const isOffsetPagination = start != null || limit != null;\n\n    if (isPagePagination && isOffsetPagination) {\n      throw new PaginationError(\n        'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n      );\n    }\n  };\n\n  // NOTE: we could support foo.* or foo.bar.* etc later on\n  const convertPopulateQueryParams = (\n    populate: PopulateParams,\n    schema?: Model,\n    depth = 0\n  ): PopulateQuery => {\n    if (depth === 0 && populate === '*') {\n      return true;\n    }\n\n    if (typeof populate === 'string') {\n      return populate.split(',').map((value) => _.trim(value));\n    }\n\n    if (Array.isArray(populate)) {\n      // map convert\n      return _.uniq(\n        populate.flatMap((value) => {\n          if (typeof value !== 'string') {\n            throw new InvalidPopulateError();\n          }\n\n          return value.split(',').map((value) => _.trim(value));\n        })\n      );\n    }\n\n    if (_.isPlainObject(populate)) {\n      return convertPopulateObject(populate, schema);\n    }\n\n    throw new InvalidPopulateError();\n  };\n\n  const hasPopulateFragmentDefined = (\n    populate: PopulateObjectParams\n  ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n    return typeof populate === 'object' && 'on' in populate && populate.on != null;\n  };\n\n  const hasCountDefined = (\n    populate: PopulateObjectParams\n  ): populate is PopulateObjectParams & { count: boolean } => {\n    return (\n      typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n    );\n  };\n\n  const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n    if (!schema) {\n      return {};\n    }\n\n    const { attributes } = schema;\n    return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n      // Try converting strings to regular booleans if possible\n      if (_.isString(subPopulate)) {\n        try {\n          const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n          // Only true is accepted as a boolean populate value\n          return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n        } catch {\n          // ignore\n        }\n      }\n\n      if (_.isBoolean(subPopulate)) {\n        // Only true is accepted as a boolean populate value\n        return subPopulate === true ? { ...acc, [key]: true } : acc;\n      }\n\n      const attribute = attributes[key];\n\n      if (!attribute) {\n        return acc;\n      }\n\n      // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n      const isMorphLikeRelationalAttribute =\n        isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n      if (isMorphLikeRelationalAttribute) {\n        const hasInvalidProperties = Object.keys(subPopulate).some(\n          (key) => !['populate', 'on', 'count'].includes(key)\n        );\n\n        if (hasInvalidProperties) {\n          throw new ValidationError(\n            `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n          );\n        }\n\n        /**\n         * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n         *\n         * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n         */\n        if (\n          'populate' in subPopulate &&\n          subPopulate.populate != null &&\n          subPopulate.populate !== '*'\n        ) {\n          throw new ValidationError(\n            `Invalid nested population query detected. When using 'populate' within polymorphic structures, ` +\n              `its value must be '*' to indicate all second level links. Specific field targeting is not supported here. ` +\n              `Consider using the fragment API for more granular population control.`\n          );\n        }\n\n        // TODO: Remove the possibility to have multiple properties at the same time (on/count/populate)\n        const newSubPopulate = {};\n\n        // case: { populate: '*' }\n        if ('populate' in subPopulate && subPopulate.populate === '*') {\n          Object.assign(newSubPopulate, { populate: true });\n        }\n\n        // case: { on: { <clauses> } }\n        if (hasPopulateFragmentDefined(subPopulate)) {\n          // If the fragment API is used, it applies the transformation to every\n          // sub-populate, then assign the result to the new sub-populate\n          Object.assign(newSubPopulate, {\n            on: Object.entries(subPopulate.on).reduce(\n              (acc, [type, typeSubPopulate]) => ({\n                ...acc,\n                [type]: convertNestedPopulate(typeSubPopulate, getModel(type)),\n              }),\n              {}\n            ),\n          });\n        }\n\n        // case: { count: true | false }\n        if (hasCountDefined(subPopulate)) {\n          Object.assign(newSubPopulate, { count: subPopulate.count });\n        }\n\n        return { ...acc, [key]: newSubPopulate };\n      }\n\n      // Edge case when trying to use the fragment ('on') on a non-morph like attribute\n      if (!isMorphLikeRelationalAttribute && hasPopulateFragmentDefined(subPopulate)) {\n        throw new ValidationError(\n          `Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`\n        );\n      }\n\n      // NOTE: Retrieve the target schema UID.\n      // Only handles basic relations, medias and component since it's not possible\n      // to populate with options for a dynamic zone or a polymorphic relation\n      let targetSchemaUID;\n\n      if (attribute.type === 'relation') {\n        targetSchemaUID = attribute.target;\n      } else if (attribute.type === 'component') {\n        targetSchemaUID = attribute.component;\n      } else if (attribute.type === 'media') {\n        targetSchemaUID = 'plugin::upload.file';\n      } else {\n        return acc;\n      }\n\n      const targetSchema = getModel(targetSchemaUID!);\n\n      // ignore the sub-populate for the current key if there is no schema associated\n      if (!targetSchema) {\n        return acc;\n      }\n\n      const populateObject = convertNestedPopulate(subPopulate, targetSchema);\n\n      if (!populateObject) {\n        return acc;\n      }\n\n      return {\n        ...acc,\n        [key]: populateObject,\n      };\n    }, {});\n  };\n\n  const convertNestedPopulate = (subPopulate: boolean | PopulateObjectParams, schema?: Model) => {\n    if (_.isString(subPopulate)) {\n      return parseType({ type: 'boolean', value: subPopulate, forceCast: true });\n    }\n\n    if (_.isBoolean(subPopulate)) {\n      return subPopulate;\n    }\n\n    if (!isPlainObject(subPopulate)) {\n      throw new ValidationError(`Invalid nested populate. Expected '*' or an object`);\n    }\n\n    const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } =\n      subPopulate as PopulateObjectParams;\n\n    const query: Query = {};\n\n    applySortToQuery(query, sort);\n\n    if (filters) {\n      query.where = convertFiltersQueryParams(filters, schema);\n    }\n\n    if (fields) {\n      query.select = convertFieldsQueryParams(fields, schema);\n    }\n\n    if (populate) {\n      query.populate = convertPopulateQueryParams(populate, schema);\n    }\n\n    if (count) {\n      query.count = convertCountQueryParams(count);\n    }\n\n    if (ordering) {\n      query.ordering = convertOrderingQueryParams(ordering);\n    }\n\n    validatePaginationParams(page, pageSize, start, limit);\n\n    if (page != null) {\n      query.page = convertPageQueryParams(page);\n    }\n\n    if (pageSize != null) {\n      query.pageSize = convertPageSizeQueryParams(pageSize, page);\n    }\n\n    if (start != null) {\n      query.offset = convertStartQueryParams(start);\n    }\n\n    if (limit != null) {\n      query.limit = convertLimitQueryParams(limit);\n    }\n\n    return query;\n  };\n\n  // TODO: ensure field is valid in content types (will probably have to check strapi.contentTypes since it can be a string.path)\n  const convertFieldsQueryParams = (\n    fields: FieldsParams,\n    schema?: Model,\n    depth = 0\n  ): SelectQuery | undefined => {\n    if (depth === 0 && fields === '*') {\n      return undefined;\n    }\n\n    if (typeof fields === 'string') {\n      const fieldsValues = fields.split(',').map((value) => _.trim(value));\n\n      // NOTE: Only include the doc id if it's a content type\n      if (schema?.modelType === 'contentType') {\n        return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n      }\n      return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n    }\n\n    if (isStringArray(fields)) {\n      // map convert\n      const fieldsValues = fields\n        .flatMap((value) => convertFieldsQueryParams(value, schema, depth + 1))\n        .filter((v) => v != null) as string[];\n\n      // NOTE: Only include the doc id if it's a content type\n      if (schema?.modelType === 'contentType') {\n        return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n      }\n      return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n    }\n\n    throw new ValidationError('Invalid fields parameter. Expected a string or an array of strings');\n  };\n\n  const isValidSchemaAttribute = (key: string, schema?: Model) => {\n    if ([DOC_ID_ATTRIBUTE, ID_ATTRIBUTE].includes(key)) {\n      return true;\n    }\n\n    if (!schema) {\n      return false;\n    }\n\n    return Object.keys(schema.attributes).includes(key);\n  };\n\n  const convertFiltersQueryParams = (filters: FiltersParams, schema?: Model): WhereQuery => {\n    // Filters need to be either an array or an object\n    // Here we're only checking for 'object' type since typeof [] => object and typeof {} => object\n    if (!isObject(filters)) {\n      throw new ValidationError('The filters parameter must be an object or an array');\n    }\n\n    // Don't mutate the original object\n    const filtersCopy = cloneDeep(filters);\n\n    return convertAndSanitizeFilters(filtersCopy, schema);\n  };\n\n  const convertAndSanitizeFilters = (filters: FiltersParams, schema?: Model): WhereQuery => {\n    if (Array.isArray(filters)) {\n      return (\n        filters\n          // Sanitize each filter\n          .map((filter) => convertAndSanitizeFilters(filter, schema))\n          // Filter out empty filters\n          .filter((filter) => !isPlainObject(filter) || !isEmpty(filter))\n      );\n    }\n\n    if (!isPlainObject(filters)) {\n      return filters as WhereQuery;\n    }\n\n    const removeOperator = (operator: string) => delete filters[operator];\n\n    // Here, `key` can either be an operator or an attribute name\n    for (const [key, value] of Object.entries(filters)) {\n      const attribute = get(schema?.attributes, key);\n      const validKey = isOperator(key) || isValidSchemaAttribute(key, schema);\n\n      if (!validKey) {\n        removeOperator(key);\n      }\n      // Handle attributes\n      else if (attribute) {\n        // Relations\n        if (attribute.type === 'relation') {\n          filters[key] = convertAndSanitizeFilters(value, getModel(attribute.target!));\n        }\n\n        // Components\n        else if (attribute.type === 'component') {\n          filters[key] = convertAndSanitizeFilters(value, getModel(attribute.component));\n        }\n\n        // Media\n        else if (attribute.type === 'media') {\n          filters[key] = convertAndSanitizeFilters(value, getModel('plugin::upload.file'));\n        }\n\n        // Dynamic Zones\n        else if (attribute.type === 'dynamiczone') {\n          removeOperator(key);\n        }\n\n        // Password attributes\n        else if (attribute.type === 'password') {\n          // Always remove password attributes from filters object\n          removeOperator(key);\n        }\n\n        // Scalar attributes\n        else {\n          filters[key] = convertAndSanitizeFilters(value, schema);\n        }\n      }\n\n      // Handle operators\n      else if (['$null', '$notNull'].includes(key)) {\n        filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true });\n      } else if (isObject(value)) {\n        filters[key] = convertAndSanitizeFilters(value, schema);\n      }\n\n      // Remove empty objects & arrays\n      if (isPlainObject(filters[key]) && isEmpty(filters[key])) {\n        removeOperator(key);\n      }\n    }\n\n    return filters;\n  };\n\n  const convertStatusParams = (status?: 'draft' | 'published', query: Query = {}) => {\n    // NOTE: this is the query layer filters not the document/entity service filters\n    query.filters = ({ meta }: { meta: Model }) => {\n      const contentType = getModel(meta.uid);\n\n      // Ignore if target model has disabled DP, as it doesn't make sense to filter by its status\n      if (!contentType || !hasDraftAndPublish(contentType)) {\n        return {};\n      }\n\n      return { [PUBLISHED_AT_ATTRIBUTE]: { $null: status === 'draft' } };\n    };\n  };\n\n  const transformQueryParams = (uid: string, params: Params): Query => {\n    // NOTE: can be a CT, a Compo or nothing in the case of polymorphism (DZ & morph relations)\n    const schema = getModel(uid);\n\n    const query: Query = {};\n\n    const {\n      _q: searchQuery,\n      sort,\n      filters,\n      fields,\n      populate,\n      page,\n      pageSize,\n      start,\n      limit,\n      status,\n      ...rest\n    } = params;\n\n    if (status != null) {\n      convertStatusParams(status, query);\n    }\n\n    if (searchQuery != null) {\n      query._q = searchQuery;\n    }\n\n    applySortToQuery(query, sort);\n\n    if (filters != null) {\n      query.where = convertFiltersQueryParams(filters, schema);\n    }\n\n    if (fields != null) {\n      query.select = convertFieldsQueryParams(fields, schema);\n    }\n\n    if (populate != null) {\n      query.populate = convertPopulateQueryParams(populate, schema);\n    }\n\n    validatePaginationParams(page, pageSize, start, limit);\n\n    if (page != null) {\n      query.page = convertPageQueryParams(page);\n    }\n\n    if (pageSize != null) {\n      query.pageSize = convertPageSizeQueryParams(pageSize, page);\n    }\n\n    if (start != null) {\n      query.offset = convertStartQueryParams(start);\n    }\n\n    if (limit != null) {\n      query.limit = convertLimitQueryParams(limit);\n    }\n\n    return {\n      ...rest,\n      ...query,\n    };\n  };\n\n  return {\n    private_convertSortQueryParams: convertSortQueryParams,\n    private_convertStartQueryParams: convertStartQueryParams,\n    private_convertLimitQueryParams: convertLimitQueryParams,\n    private_convertPopulateQueryParams: convertPopulateQueryParams,\n    private_convertFiltersQueryParams: convertFiltersQueryParams,\n    private_convertFieldsQueryParams: convertFieldsQueryParams,\n    transformQueryParams,\n  };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","hasOwnProperty","object","key","Object","prototype","call","setSortMapValue","field","order","path","toPath","sortMap","current","index","entries","isLastSegment","length","ValidationError","defineProperty","configurable","enumerable","writable","nextValue","test","isEmptySortMap","keys","every","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","InvalidSortError","InvalidPopulateError","validateOrder","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","rawField","split","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","Number","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isOffsetPagination","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","searchQuery","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}