{"version":3,"sources":["../src/transformRequest.ts","../src/filterUtils.ts","../src/utils.ts","../src/filters.ts","../src/sorting.ts","../src/highlightUtils.ts","../src/transformResponse.ts","../src/Transporter.ts","../src/queryRules.ts","../src/index.ts"],"sourcesContent":["import {\n  QueryDslQueryContainer,\n  RankContainer,\n  RrfRank\n} from '@elastic/elasticsearch/lib/api/types'\nimport deepmerge from 'deepmerge'\nimport {\n  transformBaseFilters,\n  transformFacetFilters,\n  transformGeoFilters,\n  transformNumericFilters\n} from './filters'\nimport { QueryRuleActions } from './queryRules'\nimport { getSorting } from './sorting'\nimport {\n  FacetAttribute,\n  KnnSearchQuery,\n  RequestOptions,\n  SearchAttribute,\n  SearchSettingsConfig\n} from './types'\nimport { AlgoliaMultipleQueriesQuery, ElasticsearchSearchRequest } from './types'\nimport { getFacet, isNestedFacet } from './utils'\n\nexport const createRegexQuery = (queryString: string) => {\n  let query = queryString.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&')\n  query = query\n    .split('')\n    .map((char) => {\n      if (/[a-z]/.test(char)) {\n        return `[${char}${char.toUpperCase()}]`\n      }\n      return char\n    })\n    .join('')\n  query = `${query}.*`\n  if (queryString.length > 2) {\n    query = `([a-zA-Z]+ )+?${query}`\n  }\n  return query\n}\n\nconst TermAggregation = (field: string, size: number, search: string) => {\n  const searchInclude = search && search.length > 0 ? { include: createRegexQuery(search) } : {}\n  return {\n    terms: {\n      field,\n      size,\n      ...searchInclude\n    }\n  }\n}\n\nconst getTermAggregation = (facet: FacetAttribute, size: number, search: string) => {\n  let aggEntries = {}\n  const AggregationFn =\n    typeof facet !== 'string' && 'facetQuery' in facet ? facet.facetQuery : TermAggregation\n\n  const getInnerAggs = (facetName: string, field: string): any => {\n    if (typeof facet === 'string' || facet.type === 'string') {\n      aggEntries = {\n        [facetName]: AggregationFn(field, size, search)\n      }\n    } else if (facet.type === 'numeric') {\n      aggEntries = {\n        [facetName + '$_stats']: {\n          stats: {\n            field: field\n          }\n        },\n        [facetName + '$_entries']: AggregationFn(field, size, search)\n      }\n    }\n    return aggEntries\n  }\n\n  if (typeof facet === 'string') {\n    return getInnerAggs(facet, facet)\n  } else if (isNestedFacet(facet)) {\n    return {\n      [`${facet.nestedPath}.`]: {\n        nested: {\n          path: facet.nestedPath\n        },\n        aggs: getInnerAggs(facet.attribute, `${facet.nestedPath}.${facet.field}`)\n      }\n    }\n  } else {\n    return getInnerAggs(facet.attribute, facet.field)\n  }\n}\n\nexport const getAggs = (\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig,\n  queryRuleActions: QueryRuleActions\n) => {\n  const { params = {}, type } = request\n  // @ts-ignore\n  const { facets, maxValuesPerFacet, facetName, facetQuery } = params\n  const maxFacetSize = maxValuesPerFacet || 10\n  const facetAttributes = config.facet_attributes || []\n\n  if (facetName) {\n    const facet = getFacet(facetAttributes, facetName)\n    if (!facet) return null\n    return getTermAggregation(facet, maxFacetSize, facetQuery)\n  } else if (Array.isArray(facets)) {\n    let facetAttibutes = config.facet_attributes || []\n\n    if (queryRuleActions.facetAttributesOrder) {\n      facetAttibutes = queryRuleActions.facetAttributesOrder\n        .map((attribute) => {\n          return getFacet(config.facet_attributes || [], attribute)\n        })\n        .filter((x): x is FacetAttribute => x !== null)\n    }\n\n    const facetAttributes: FacetAttribute[] =\n      facets[0] === '*'\n        ? facetAttibutes\n        : facets\n            .map((facetAttribute) => {\n              return getFacet(config.facet_attributes || [], facetAttribute)\n            })\n            .filter((x): x is FacetAttribute => x !== null)\n\n    return (\n      facetAttributes.reduce((sum, facet) => {\n        return deepmerge(sum, getTermAggregation(facet, maxFacetSize, ''))\n      }, {}) || {}\n    )\n  } else if (typeof facets === 'string') {\n    const field = getFacet(config.facet_attributes || [], facets)\n    if (!field) return {}\n    return getTermAggregation(field, maxFacetSize, '')\n  }\n}\n\nfunction queryRulesWrapper(organicQuery: any, queryRuleActions: QueryRuleActions) {\n  if (queryRuleActions.touched) {\n    return {\n      function_score: {\n        query: {\n          pinned: {\n            ids: queryRuleActions.pinnedDocs,\n            organic: organicQuery\n          }\n        },\n        functions: queryRuleActions.boostFunctions\n      }\n    }\n  }\n  return organicQuery\n}\n\nexport function RelevanceQueryMatch(query: string, search_attributes: SearchAttribute[], fuzziness: string = 'AUTO:4,8') {\n  const getFieldsMap = (boostMultiplier: number) => {\n    return search_attributes.map((attribute) => {\n      return typeof attribute === 'string'\n        ? attribute\n        : `${attribute.field}^${(attribute.weight || 1) * boostMultiplier}`\n    })\n  }\n\n  return {\n    bool: {\n      should: [\n        {\n          bool: {\n            should: [\n              {\n                multi_match: {\n                  query: query,\n                  fields: getFieldsMap(1),\n                  fuzziness: fuzziness\n                }\n              },\n              {\n                multi_match: {\n                  query: query,\n                  fields: getFieldsMap(0.5),\n                  type: 'bool_prefix'\n                }\n              }\n            ]\n          }\n        },\n        {\n          multi_match: {\n            query: query,\n            type: 'phrase',\n            fields: getFieldsMap(2)\n          }\n        }\n      ]\n    }\n  }\n}\n\nconst getQuery = (\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig,\n  queryRuleActions: QueryRuleActions,\n  requestOptions?: RequestOptions\n): { query?: QueryDslQueryContainer; knn?: KnnSearchQuery; rank?: RankContainer } => {\n  const query = queryRuleActions.query\n\n  const searchAttributes = config.search_attributes\n  const fuzziness = config.fuzziness ?? 'AUTO:4,8'\n\n  const filters = [\n    ...transformFacetFilters(request, config),\n    ...transformNumericFilters(request, config),\n    ...transformBaseFilters(request, config),\n    ...transformGeoFilters(request, config),\n    ...(requestOptions?.getBaseFilters?.() || []),\n    ...queryRuleActions.baseFilters\n  ]\n\n  let organicQuery =\n    typeof query === 'string' && query !== ''\n      ? requestOptions?.getQuery\n        ? requestOptions.getQuery(query, searchAttributes, config)\n        : RelevanceQueryMatch(query, searchAttributes, fuzziness)\n      : {\n          match_all: {}\n        }\n\n  const hasKnn = typeof requestOptions?.getKnnQuery === 'function'\n  const hasNoQuery = requestOptions?.getQuery?.(query, searchAttributes, config) === false\n\n  if (hasNoQuery || (hasKnn && query === '')) {\n    organicQuery = {\n      match_all: {}\n    }\n  }\n\n  const queryDsl = {\n    bool: {\n      filter: filters,\n      must: queryRuleActions.touched\n        ? queryRulesWrapper(organicQuery, queryRuleActions)\n        : organicQuery\n    }\n  }\n\n  let knnQueryDsl: KnnSearchQuery | null = null\n\n  if (hasKnn && query !== '') {\n    knnQueryDsl = {\n      filter: filters,\n      ...(requestOptions?.getKnnQuery?.(query, searchAttributes, config) || {})\n    } as KnnSearchQuery\n  }\n\n  if (query !== '' && hasNoQuery && hasKnn && knnQueryDsl) {\n    return {\n      knn: knnQueryDsl\n    }\n  }\n\n  const size = getHitsPerPage(request)\n\n  return {\n    query: queryDsl,\n    knn: knnQueryDsl ? knnQueryDsl : undefined,\n    // in hybrid mode (knn + keyword query), is displaying results and query is not empty\n    rank:\n      hasKnn && !hasNoQuery && size > 0 && query !== '' ? { rrf: { window_size: size } } : undefined\n  }\n}\n\nconst getHitsPerPage = (request: AlgoliaMultipleQueriesQuery) => {\n  const { params = {} } = request\n  return params.hitsPerPage == null ? 20 : params.hitsPerPage\n}\n\nconst getResultsSize = (request: AlgoliaMultipleQueriesQuery, config: SearchSettingsConfig) => {\n  const { params = {} } = request\n  const hitsPerPage = getHitsPerPage(request)\n\n  return {\n    size: hitsPerPage,\n    from: (params.page || 0) * hitsPerPage\n  }\n}\n\nexport const getHitFields = (\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig\n) => {\n  const { params = {} } = request\n  const { attributesToRetrieve } = params\n  // ignoring attributesToRetrieve for now\n\n  const sourceFields = new Set([\n    ...(config.result_attributes || []),\n    ...(config.highlight_attributes || []),\n    ...(config.geo_attribute ? [config.geo_attribute] : [])\n  ])\n\n  const runtimeFields = Object.keys(config.runtime_mappings || {})\n  const fields = runtimeFields.reduce<string[]>((sum, field) => {\n    if (config.result_attributes?.includes(field)) {\n      return [field, ...sum]\n    }\n    return sum\n  }, [])\n\n  return {\n    _source: {\n      includes: Array.from(sourceFields)\n    },\n    ...(fields.length > 0 ? { fields } : {})\n  }\n}\n\nexport const getSnippetFieldLength = (attribute: string) => {\n  const defaultMatch = {\n    attribute,\n    length: 100\n  }\n  if (!attribute.includes(':')) {\n    return defaultMatch\n  }\n  const match = attribute.match(/(.+)\\:(\\d+)/)\n  if (!match) return defaultMatch\n  return {\n    attribute: match[1],\n    length: parseInt(match[2])\n  }\n}\n\nexport const getHighlightFields = (\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig\n) => {\n  const { params = {} } = request\n  const { attributesToHighlight } = params\n  // ignoring attributesToHighlight for now\n\n  const highlightFields =\n    config.highlight_attributes?.reduce(\n      (sum, field) => ({\n        ...sum,\n        [field]: {\n          number_of_fragments: 0\n        }\n      }),\n      {}\n    ) || {}\n\n  const snippetFields =\n    config.snippet_attributes?.reduce(\n      (sum, attribute) => ({\n        ...sum,\n        [getSnippetFieldLength(attribute).attribute]: {\n          number_of_fragments: 5,\n          fragment_size: getSnippetFieldLength(attribute).length\n        }\n      }),\n      {}\n    ) || {}\n\n  if (Object.keys(highlightFields).length === 0 && Object.keys(snippetFields).length === 0) {\n    return {}\n  }\n\n  return {\n    highlight: {\n      pre_tags: ['<em>'],\n      post_tags: ['</em>'],\n      fields: {\n        ...highlightFields,\n        ...snippetFields\n      }\n    }\n  }\n}\n\nconst getRuntimeMappings = (request: AlgoliaMultipleQueriesQuery, config: SearchSettingsConfig) => {\n  if (!config.runtime_mappings) {\n    return {}\n  }\n\n  return {\n    runtime_mappings: config.runtime_mappings\n  }\n}\n\nexport function transformRequest(\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig,\n  queryRuleActions: QueryRuleActions,\n  requestOptions?: RequestOptions\n): ElasticsearchSearchRequest {\n  const body: ElasticsearchSearchRequest = {\n    aggs: getAggs(request, config, queryRuleActions),\n    ...getQuery(request, config, queryRuleActions, requestOptions),\n    ...getResultsSize(request, config),\n    ...getHitFields(request, config),\n    ...getHighlightFields(request, config),\n    ...getSorting(request, config),\n    ...getRuntimeMappings(request, config)\n  }\n\n  return body\n}\n","export const TermFilter = (field: string, value: string) => {\n  return { term: { [field]: value } }\n}\n\nexport const MatchFilter = (field: string, value: string) => {\n  return { match: { [field]: value } }\n}\n","import { CustomFacetConfig, FacetAttribute, FacetFieldConfig, SearchRequest } from './types'\n\nexport const createRegexQuery = (queryString: string) => {\n  let query = queryString.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&')\n  query = query\n    .split('')\n    .map((char) => {\n      if (/[a-z]/.test(char)) {\n        return `[${char}${char.toUpperCase()}]`\n      }\n      return char\n    })\n    .join('')\n  query = `${query}.*`\n  if (queryString.length > 2) {\n    query = `([a-zA-Z]+ )+?${query}`\n  }\n  return query\n}\n\nexport const getFacet = (\n  facet_attributes: FacetAttribute[],\n  attributeName: string\n): FacetAttribute | null => {\n  const f = facet_attributes.find((a) => {\n    if (typeof a === 'string') {\n      return a === attributeName\n    }\n    return a.attribute === attributeName\n  })\n  return f || null\n}\n\nexport const isNestedFacet = (facet: FacetAttribute): boolean => {\n  return typeof facet !== 'string' && !!facet.nestedPath\n}\n\nexport const getFacetField = (\n  facet_attributes: FacetAttribute[],\n  attribute: FacetAttribute\n): string => {\n  const attributeKey = typeof attribute === 'string' ? attribute : attribute.attribute\n\n  if (facet_attributes.includes(attributeKey)) {\n    return attributeKey\n  }\n  return (\n    facet_attributes\n      // @ts-ignore: object is possibly null\n      .find((a) => a.attribute === attributeKey)?.field || attributeKey\n  )\n}\n\nexport const getFacetByAttribute = (\n  facet_attributes: FacetAttribute[],\n  attribute: FacetAttribute\n): string => {\n  const attributeKey = getFacetAttribute(attribute)\n\n  if (facet_attributes.includes(attributeKey)) {\n    return attributeKey\n  }\n  return (\n    facet_attributes\n      // @ts-ignore: object is possibly null\n      .find((a) => a.attribute === attributeKey)?.attribute || attributeKey\n  )\n}\n\nexport const getFacetAttribute = (facetAttribute: FacetAttribute): string => {\n  return typeof facetAttribute === 'string' ? facetAttribute : facetAttribute.attribute\n}\n\nexport const getFacetFieldType = (\n  facet_attributes: FacetAttribute[],\n  attribute: FacetAttribute\n): FacetFieldConfig['type'] => {\n  const attributeKey = typeof attribute === 'string' ? attribute : attribute.attribute\n\n  if (facet_attributes.includes(attributeKey)) {\n    return 'string'\n  }\n  return (\n    facet_attributes\n      // @ts-ignore: object is possibly null\n      .find((a) => a?.attribute === attributeKey)?.type || 'string'\n  )\n}\n\nexport const getFacetFieldConfig = (\n  facet_attributes: FacetAttribute[],\n  attribute: FacetAttribute\n): FacetFieldConfig | CustomFacetConfig | undefined => {\n  return facet_attributes.find((a) => {\n    if (typeof a === 'string') {\n      return false\n    }\n    return a.attribute === attribute\n  }) as FacetFieldConfig | CustomFacetConfig | undefined\n}\n\nexport const createElasticsearchQueryFromRequest = (requests: SearchRequest[]) => {\n  return requests\n    .reduce<string[]>(\n      (sum, request) => [\n        ...sum,\n        JSON.stringify({ index: request.indexName }),\n        '\\n',\n        JSON.stringify(request.body),\n        '\\n'\n      ],\n      []\n    )\n    .join('')\n}\n","import { MatchFilter, TermFilter } from './filterUtils'\nimport type {\n  AlgoliaMultipleQueriesQuery,\n  FacetAttribute,\n  SearchSettingsConfig,\n  ElasticsearchQuery,\n  FilterAttribute,\n  FacetFieldConfig\n} from './types'\nimport { getFacet, getFacetAttribute, isNestedFacet } from './utils'\n\nexport const transformNumericFilters = (\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig\n): ElasticsearchQuery[] => {\n  const { params = {} } = request\n  const { numericFilters } = params\n\n  if (!Array.isArray(numericFilters)) {\n    return []\n  }\n\n  return numericFilters.reduce((sum, filter: string) => {\n    let match,\n      field,\n      operator,\n      value,\n      maxValue = ''\n    let groups = filter.match(\n      /([\\w\\.\\_\\-]+)\\s*(\\=|\\!\\=|\\>|\\>\\=|\\<|\\<\\=)\\s*(-?(?:\\d+(?:\\.\\d*)?|\\.\\d+))/\n    )\n\n    if (groups) {\n      ;[match, field, operator, value] = groups\n    } else {\n      // Alternative syntax: 'attribute:lower_value TO higher_value'\n      groups = filter.match(\n        /([\\w\\.\\_\\-]+):\\s*(-?(?:\\d+(?:\\.\\d*)?|\\.\\d+))\\s*([Tt][Oo])\\s*(-?(?:\\d+(?:\\.\\d*)?|\\.\\d+))/\n      )\n\n      if (!groups) {\n        throw new Error(\n          `Numeric filter \"${filter}\" could not be parsed. It should either be in the format \"attributeName operator operand\" or \"attributeName: lowerBound TO upperBound\"`\n        )\n      }\n\n      ;[match, field, value, operator, maxValue] = groups\n    }\n\n    const facetFilterMap = getFacetFilterMap(\n      config.facet_attributes || [],\n      config.filter_attributes || []\n    )\n    const facetFilterConfig = facetFilterMap[field]\n\n    const getFilter = (field: string, operator: string, value: string) => {\n      if (operator === '=') {\n        return {\n          term: {\n            [field]: value\n          }\n        }\n      } else if (operator === '!=') {\n        return {\n          bool: {\n            must_not: {\n              term: {\n                [field]: value\n              }\n            }\n          }\n        }\n      } else if (operator === '>') {\n        return {\n          range: {\n            [field]: {\n              gt: value\n            }\n          }\n        }\n      } else if (operator === '>=') {\n        return {\n          range: {\n            [field]: {\n              gte: value\n            }\n          }\n        }\n      } else if (operator === '<') {\n        return {\n          range: {\n            [field]: {\n              lt: value\n            }\n          }\n        }\n      } else if (operator === '<=') {\n        return {\n          range: {\n            [field]: {\n              lte: value\n            }\n          }\n        }\n      } else if (operator.toUpperCase() === 'TO') {\n        return {\n          range: {\n            [field]: {\n              gte: value,\n              lte: maxValue\n            }\n          }\n        }\n      }\n    }\n\n    const esFilter = []\n\n    if (facetFilterConfig.nestedPath) {\n      const nestedPathPresent = sum.find((filter: any) => {\n        return filter.nested.path === facetFilterConfig.nestedPath\n      })\n\n      if (nestedPathPresent) {\n        nestedPathPresent.nested.query.bool.filter.push(\n          getFilter(facetFilterConfig.nestedPath + '.' + facetFilterConfig.field, operator, value)\n        )\n      } else {\n        esFilter.push({\n          nested: {\n            path: facetFilterConfig.nestedPath,\n            inner_hits: {},\n            query: {\n              bool: {\n                filter: [\n                  getFilter(\n                    facetFilterConfig.nestedPath + '.' + facetFilterConfig.field,\n                    operator,\n                    value\n                  )\n                ]\n              }\n            }\n          }\n        })\n      }\n    } else {\n      esFilter.push(getFilter(facetFilterConfig.field, operator, value))\n    }\n\n    return [...sum, ...esFilter]\n  }, [])\n}\n\nconst getFacetFilterMap = (facets: FacetAttribute[], filters: FilterAttribute[]) => {\n  return [...filters, ...facets].reduce<Record<string, FacetFieldConfig | FilterAttribute>>(\n    (sum, filter) => {\n      let f: FacetFieldConfig | FilterAttribute =\n        typeof filter === 'string' ? { attribute: filter, field: filter, type: 'string' } : filter\n\n      return {\n        ...sum,\n        [f.attribute]: f\n      }\n    },\n    {}\n  )\n}\n\nexport const transformFacetFilters = (\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig\n): ElasticsearchQuery[] => {\n  const { params = {} } = request\n  const { facetFilters } = params\n\n  if (!Array.isArray(facetFilters)) {\n    return []\n  }\n\n  const facetFilterMap = getFacetFilterMap(\n    config.facet_attributes || [],\n    config.filter_attributes || []\n  )\n\n  return facetFilters.reduce((sum, filter) => {\n    if (Array.isArray(filter)) {\n      return [\n        ...sum,\n        {\n          bool: {\n            should: filter.reduce((sum, filter) => {\n              const [facet, value] = filter.split(/:(.*)/)\n              const facetFilterConfig = facetFilterMap[facet]\n              if (!facetFilterConfig)\n                throw new Error(\n                  `Facet \"${facet}\" not found in configuration. Add configuration to either facet_attributes or filter_attributes.`\n                )\n              const field = facetFilterConfig.field\n              const filterClauseFn =\n                'filterQuery' in facetFilterConfig && facetFilterConfig.filterQuery\n                  ? facetFilterConfig.filterQuery\n                  : TermFilter\n\n              if (isNestedFacet(facetFilterConfig)) {\n                // detect if there is a nested filter in sum\n                // if one doesn't exist, add one\n                // if one does exist, add to it\n                const nestedFilter = sum.find((filter: any) => {\n                  return filter.nested && filter.nested.path === facetFilterConfig.nestedPath\n                })\n\n                if (nestedFilter) {\n                  nestedFilter.nested.query.bool.should.push(\n                    filterClauseFn(\n                      `${facetFilterConfig.nestedPath}.${facetFilterConfig.field}`,\n                      value\n                    )\n                  )\n                  return sum\n                } else {\n                  return [\n                    ...sum,\n                    {\n                      nested: {\n                        inner_hits: {},\n                        path: facetFilterConfig.nestedPath,\n                        query: {\n                          bool: {\n                            should: [\n                              filterClauseFn(\n                                `${facetFilterConfig.nestedPath}.${facetFilterConfig.field}`,\n                                value\n                              )\n                            ]\n                          }\n                        }\n                      }\n                    }\n                  ]\n                }\n              }\n              return [...sum, filterClauseFn(field, value)]\n            }, [])\n          }\n        }\n      ]\n    } else if (typeof filter === 'string') {\n      const [facet, value] = filter.split(/:(.*)/)\n\n      const facetFilterConfig = facetFilterMap[facet]\n      if (!facetFilterConfig)\n        throw new Error(\n          `Facet \"${facet}\" not found in configuration. Add configuration to either facet_attributes or filter_attributes.`\n        )\n\n      const filterClauseFn =\n        'filterQuery' in facetFilterConfig && facetFilterConfig.filterQuery\n          ? facetFilterConfig.filterQuery\n          : TermFilter\n\n      if (isNestedFacet(facetFilterConfig) && facetFilterConfig.nestedPath) {\n        // detect if there is a nested filter in sum\n        // if one doesn't exist, add one\n        // if one does exist, add to it\n        const nestedFilter = sum.find((filter: any) => {\n          return filter.nested && filter.nested.path === facetFilterConfig.nestedPath + '.'\n        })\n\n        if (nestedFilter) {\n          nestedFilter.nested.query.bool.should.push(\n            filterClauseFn(`${facetFilterConfig.nestedPath}.${facetFilterConfig.field}`, value)\n          )\n          return sum\n        } else {\n          return [\n            ...sum,\n            {\n              nested: {\n                inner_hits: {},\n                path: facetFilterConfig.nestedPath,\n                query: {\n                  bool: {\n                    should: [\n                      filterClauseFn(\n                        `${facetFilterConfig.nestedPath}.${facetFilterConfig.field}`,\n                        value\n                      )\n                    ]\n                  }\n                }\n              }\n            }\n          ]\n        }\n      }\n      return [...sum, filterClauseFn(facetFilterConfig.field, value)]\n    }\n  }, [])\n}\n\nexport const transformQueryString = (\n  facets: FacetAttribute[] = [],\n  filters: FilterAttribute[] = [],\n  queryString: string\n) => {\n  const regex = /([\\w\\.\\-]+)\\:/gi\n  const filterMap = getFacetFilterMap(facets, filters)\n  return queryString.replace(regex, (match: string, word: string) => {\n    if (!filterMap[word]) {\n      throw new Error(\n        `Attribute \"${word}\" is not defined as an attribute in the facet or filter search settings`\n      )\n    }\n\n    if (!!filterMap[word].nestedPath) {\n      throw new Error(\n        `Attribute \"${word}\" is a nested field and cannot be used as a filter. Nested fields are supported in facetFilers or numericFilters.`\n      )\n    }\n\n    return filterMap[word].field + ':'\n  })\n}\n\nexport const transformBaseFilters = (\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig\n) => {\n  const { params = {} } = request\n  const { filters } = params\n\n  if (!filters || filters === '') {\n    return []\n  }\n\n  const queryString = transformQueryString(\n    config.facet_attributes,\n    config.filter_attributes,\n    filters\n  )\n\n  return [\n    {\n      query_string: {\n        query: queryString\n      }\n    }\n  ]\n}\n\nexport const transformGeoFilters = (\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig\n) => {\n  if (!config.geo_attribute) {\n    return []\n  }\n  const { params = {} } = request\n  const { aroundLatLng, aroundRadius, insideBoundingBox } = params\n\n  if (insideBoundingBox) {\n    return [insideBoundingBoxFilter(insideBoundingBox, config.geo_attribute)]\n  }\n\n  if (aroundLatLng) {\n    const geoPoint = aroundLatLng.split(',')\n\n    return [\n      {\n        geo_distance: {\n          distance: aroundRadius || '1000m',\n          [config.geo_attribute]: {\n            lat: geoPoint[0],\n            lon: geoPoint[1]\n          }\n        }\n      }\n    ]\n  }\n\n  return []\n}\n\nfunction insideBoundingBoxFilter(\n  insideBoundingBox: string | readonly (readonly number[])[],\n  field: string\n) {\n  const geoBoundingboxFilter = (top: number, left: number, bottom: number, right: number) => {\n    return {\n      geo_bounding_box: {\n        [field]: {\n          top_right: {\n            lat: top,\n            lon: left\n          },\n          bottom_left: {\n            lat: bottom,\n            lon: right\n          }\n        }\n      }\n    }\n  }\n\n  if (typeof insideBoundingBox === 'string') {\n    const [top, left, bottom, right] = insideBoundingBox.split(',')\n    return geoBoundingboxFilter(\n      parseFloat(top),\n      parseFloat(left),\n      parseFloat(bottom),\n      parseFloat(right)\n    )\n  } else if (Array.isArray(insideBoundingBox)) {\n    const geoBoundingboxes = insideBoundingBox.map((boundingBox) => {\n      const [top, left, bottom, right] = boundingBox\n      return geoBoundingboxFilter(\n        parseFloat(top),\n        parseFloat(left),\n        parseFloat(bottom),\n        parseFloat(right)\n      )\n    })\n\n    return {\n      bool: {\n        should: geoBoundingboxes\n      }\n    }\n  }\n}\n","import { SearchSettingsConfig } from './types'\nimport { AlgoliaMultipleQueriesQuery } from './types'\n\nexport function getSorting(request: AlgoliaMultipleQueriesQuery, config: SearchSettingsConfig) {\n  if (config.sorting && Object.keys(config.sorting).length > 0) {\n    const selectedSorting = Object.keys(config.sorting).find((key) => {\n      if (request.indexName.endsWith(key)) {\n        return true\n      }\n    })\n\n    if (!selectedSorting && !config.sorting.default) return {}\n\n    const sortOption = selectedSorting ? config.sorting[selectedSorting] : config.sorting.default\n\n    const buildSortField = (sorting: any) => {\n      const fieldPath = sorting.nestedPath\n        ? `${sorting.nestedPath}.${sorting.field}`\n        : sorting.field\n\n      if (sorting.nestedPath) {\n        const sortConfig: any = {\n          order: sorting.order,\n          nested: {\n            path: sorting.nestedPath\n          }\n        }\n        \n        // Add mode if specified\n        if (sorting.mode) {\n          sortConfig.mode = sorting.mode\n        }\n        \n        return {\n          [fieldPath]: sortConfig\n        }\n      }\n\n      const sortConfig: any = sorting.order\n      \n      // For non-nested fields, if mode is specified, create an object instead of just the order string\n      if (sorting.mode) {\n        return {\n          [fieldPath]: {\n            order: sorting.order,\n            mode: sorting.mode\n          }\n        }\n      }\n\n      return {\n        [fieldPath]: sortConfig\n      }\n    }\n\n    return {\n      sort: Array.isArray(sortOption) ? sortOption.map(buildSortField) : buildSortField(sortOption)\n    }\n  }\n  return {}\n}\n\nexport function getIndexName(indexName: string, config: SearchSettingsConfig) {\n  if (config.sorting && Object.keys(config.sorting).length > 0) {\n    const selectedSorting = Object.keys(config.sorting).find((key) => {\n      if (indexName.endsWith(key)) {\n        return true\n      }\n    })\n\n    if (selectedSorting) {\n      return indexName.replace(selectedSorting, '')\n    }\n  }\n  return indexName\n}\n","import { getSnippetFieldLength } from './transformRequest'\nimport type { ElasticsearchHit, SearchSettingsConfig } from './types'\n\nexport function highlightTerm(value: string, query: string): string {\n  const regex = new RegExp(query, 'gi')\n  return value.replace(regex, (match) => `<em>${match}</em>`)\n}\n\nexport function isAllowableHighlightField(fieldKey: string, highlightFields: string[]) {\n  return (\n    highlightFields.findIndex((highlightField) => {\n      if (highlightField.indexOf('*') < 0) {\n        return highlightField === fieldKey\n      }\n\n      const safeHighlightField = highlightField.replace(/[.+?^$|\\{\\}\\(\\)\\[\\]\\\\]/g, '\\\\$&')\n      const regex = new RegExp(`^${safeHighlightField.replace(/\\*/g, '.*')}$`)\n      return regex.test(fieldKey)\n    }) >= 0\n  )\n}\n\nfunction transformObject(input: Record<string, string>): Record<string, any> {\n  const result: Record<string, any> = {}\n\n  for (const key in input) {\n    const keys = key.split('.')\n    let currentObj = result\n\n    for (let i = 0; i < keys.length - 1; i++) {\n      const currentKey = keys[i]\n\n      if (!currentObj[currentKey]) {\n        currentObj[currentKey] = {}\n      }\n\n      currentObj = currentObj[currentKey]\n    }\n\n    currentObj[keys[keys.length - 1]] = input[key]\n  }\n\n  return result\n}\n\n/**\n * Retrieves a nested field value from an object using a dot-notation path.\n * If any part of the path points to an array, it maps over the array to extract the values.\n * This function ensures that a property exists, even if its value is `undefined`.\n *\n * @param {object} obj - The object to retrieve the nested value from.\n * @param {string} path - The dot-notation path to the desired value (e.g., 'messages.text').\n * @returns {any} - The value at the specified path, or undefined if the path or property does not exist.\n *                  If the path involves an array, an array of values will be returned.\n */\nexport function getFieldValue(obj: any, path: string): any {\n  return path.split('.').reduce((acc, key) => {\n    if (Array.isArray(acc)) {\n      // Map over the array and extract the value\n      return acc.map(item => item[key])\n    }\n\n    // Check if the property exists before accessing it\n    return acc && Object.prototype.hasOwnProperty.call(acc, key)\n      ? acc[key]\n      : undefined\n  }, obj)\n}\n\nexport function getHighlightFields(\n  hit: ElasticsearchHit,\n  preTag: string = '<ais-highlight-0000000000>',\n  postTag: string = '<ais-highlight-0000000000/>',\n  fields: SearchSettingsConfig['snippet_attributes'] = []\n) {\n  const { _source = {}, highlight = {} } = hit\n\n  const combinedKeys = {\n    ..._source,\n    ...highlight\n  }\n\n  const highlightFields = fields.map((field) => getSnippetFieldLength(field).attribute)\n\n  const hitHighlights = Object.keys(combinedKeys).reduce<Record<string, any>>((sum, fieldKey) => {\n    const fieldValue: any = getFieldValue(_source, fieldKey)\n    const highlightedMatch = highlight[fieldKey] || null\n\n    if (!isAllowableHighlightField(fieldKey, highlightFields)) {\n      return sum\n    }\n    // no matches, specified as a highlight and value is an array\n    if (Array.isArray(fieldValue) && !highlightedMatch) {\n      return {\n        ...sum,\n        [fieldKey]: fieldValue.map((value) => ({\n          matchLevel: 'none',\n          matchedWords: [],\n          value: value.toString()\n        }))\n      }\n      // field array and has multiple highlighted matches\n    } else if (Array.isArray(fieldValue) && highlightedMatch && Array.isArray(highlightedMatch)) {\n      return {\n        ...sum,\n        [fieldKey]: highlightedMatch.map((highlightedMatch) => {\n          const matchWords = Array.from(highlightedMatch.matchAll(/\\<em\\>(.*?)\\<\\/em\\>/g)).map(\n            (match) => match[1]\n          )\n          return {\n            fullyHighlighted: false,\n            matchLevel: 'full',\n            matchedWords: matchWords,\n            value: highlightedMatch\n              .toString()\n              .replace(/\\<em\\>/g, preTag)\n              .replace(/\\<\\/em\\>/g, postTag)\n          }\n        })\n      }\n    } else if (\n      (!Array.isArray(fieldValue) && highlightedMatch && Array.isArray(highlightedMatch)) ||\n      (!fieldValue && Array.isArray(highlightedMatch) && highlightedMatch.length > 0)\n    ) {\n      const singleMatch = highlightedMatch[0]\n\n      const matchWords = Array.from(singleMatch.matchAll(/\\<em\\>(.*?)\\<\\/em\\>/g)).map(\n        (match) => match[1]\n      )\n      const x = {\n        fullyHighlighted: false,\n        matchLevel: 'full',\n        matchedWords: matchWords,\n        value: singleMatch\n          .toString()\n          .replace(/\\<em\\>/g, preTag)\n          .replace(/\\<\\/em\\>/g, postTag)\n      }\n\n      return {\n        ...sum,\n        [fieldKey]: x\n      }\n    }\n\n    return {\n      ...sum,\n      [fieldKey]: {\n        matchLevel: 'none',\n        matchedWords: [],\n        value: fieldValue != undefined ? fieldValue.toString() : ''\n      }\n    }\n  }, {})\n\n  return transformObject(hitHighlights)\n}\n","import { FacetStringResponse, SearchSettingsConfig } from './types'\nimport { getHighlightFields, highlightTerm } from './highlightUtils'\nimport { AlgoliaMultipleQueriesQuery, ElasticsearchResponseBody } from './types'\nimport { getFacetFieldConfig, getFacetFieldType } from './utils'\nimport { QueryRuleActions } from './queryRules'\nimport type {\n  AggregationsStatsAggregate,\n  AggregationsStringTermsAggregate,\n  AggregationsStringTermsBucket,\n  AggregationsTermsAggregateBase,\n  AggregationsTermsAggregation,\n  GeoLocation\n} from '@elastic/elasticsearch/lib/api/types'\n\ntype FacetsList = Record<string, Record<string, number>>\ntype FacetsStats = Record<\n  string,\n  { min: number | null; max: number | null; avg: number | null; sum: number | null }\n>\n\nconst getHits = (\n  response: ElasticsearchResponseBody,\n  config: SearchSettingsConfig,\n  instantsearchRequest: AlgoliaMultipleQueriesQuery\n) => {\n  const { hits } = response\n  const { highlight_attributes = [], snippet_attributes = [] } = config\n\n  return hits.hits.map((hit) => ({\n    objectID: hit._id,\n    _index: hit._index,\n    _score: hit._score,\n    ...(hit._source || {}),\n    ...(hit.fields || {}), // for runtime_mapping fields\n    ...(hit.inner_hits ? { inner_hits: hit.inner_hits } : {}),\n    ...(highlight_attributes.length > 0\n      ? {\n          _highlightResult: getHighlightFields(\n            hit,\n            instantsearchRequest?.params?.highlightPreTag,\n            instantsearchRequest?.params?.highlightPostTag,\n            highlight_attributes\n          )\n        }\n      : {}),\n    ...(snippet_attributes.length > 0\n      ? {\n          _snippetResult: getHighlightFields(\n            hit,\n            instantsearchRequest?.params?.highlightPreTag,\n            instantsearchRequest?.params?.highlightPostTag,\n            config.snippet_attributes\n          )\n        }\n      : {}),\n    ...(config.geo_attribute && hit._source?.[config.geo_attribute]\n      ? { _geoloc: convertLatLng(hit._source?.[config.geo_attribute] as GeoLocation) }\n      : {})\n  }))\n}\n\nfunction convertLatLng(value: GeoLocation) {\n  if (typeof value === 'string') {\n    const [lat, lng] = value.split(',').map((v) => parseFloat(v))\n    return { lat, lng }\n  } else if (Array.isArray(value)) {\n    return { lat: value[0], lng: value[1] }\n  } else if (typeof value === 'object') {\n    if ('lat' in value && 'lon' in value) {\n      return {\n        lat: parseFloat(value.lat as unknown as string),\n        lng: parseFloat(value.lon as unknown as string)\n      }\n    }\n  }\n  return null\n}\n\nconst TermFacetResponse = (aggregation: AggregationsStringTermsAggregate) => {\n  return (aggregation.buckets as AggregationsStringTermsBucket[]).reduce<FacetStringResponse>(\n    (sum, bucket) => ({\n      ...sum,\n      [bucket.key]: bucket.doc_count\n    }),\n    {}\n  )\n}\n\nconst getFacets = (response: ElasticsearchResponseBody, config: SearchSettingsConfig) => {\n  if (!response?.aggregations) {\n    return {}\n  }\n\n  // flattening for nested facets\n  const aggregations = Object.keys(response.aggregations).reduce<Record<string, any>>(\n    (sum, key) => {\n      const value = (response.aggregations || {})[key] as any\n\n      if (key.endsWith('.')) {\n        const { doc_count, ...nestedAggregations } = value\n        return {\n          ...sum,\n          ...nestedAggregations\n        }\n      }\n\n      return {\n        ...sum,\n        [key]: value\n      }\n    },\n    {}\n  )\n\n  return Object.keys(aggregations).reduce<{\n    facets: FacetsList\n    facets_stats: FacetsStats\n  }>(\n    (sum, f) => {\n      const facet = f.split('$')[0]\n      const fieldType = getFacetFieldType(config.facet_attributes || [], facet)\n      const facetConfig = getFacetFieldConfig(config.facet_attributes || [], facet)\n      const facetResponse =\n        (facetConfig && 'facetResponse' in facetConfig && facetConfig?.facetResponse) ||\n        TermFacetResponse\n\n      if (fieldType === 'numeric') {\n        const facetValues = aggregations[facet + '$_stats'] as AggregationsStatsAggregate\n        const { buckets } = aggregations[facet + '$_entries'] as {\n          buckets: any[]\n        }\n\n        return {\n          ...sum,\n          facets: {\n            ...sum.facets,\n            [facet]: facetResponse({ buckets })\n          },\n          facets_stats: {\n            ...sum.facets_stats,\n            [facet]: {\n              min: facetValues.min,\n              avg: facetValues.avg,\n              max: facetValues.max,\n              sum: facetValues.sum\n            }\n          }\n        }\n      }\n\n      const { buckets } = aggregations[facet] as { buckets: any[] }\n\n      return {\n        ...sum,\n        facets: {\n          ...sum.facets,\n          [facet]: facetResponse({ buckets })\n        }\n      }\n    },\n    {\n      facets: {},\n      facets_stats: {}\n    }\n  )\n}\n\nconst getRenderingContent = (config: SearchSettingsConfig, queryRuleActions: QueryRuleActions) => {\n  const defaultOrder = config.facet_attributes?.map((facet) =>\n    typeof facet === 'string' ? facet : facet.attribute\n  )\n\n  return {\n    renderingContent: {\n      facetOrdering: {\n        facets: {\n          order: queryRuleActions.facetAttributesOrder || defaultOrder || []\n        },\n        values: config.facet_attributes?.reduce<Record<string, { sortRemainingBy: 'count' }>>(\n          (sum, facet) => {\n            const facetName = typeof facet === 'string' ? facet : facet.attribute\n\n            // If request has explicit facet orders and the facet is not\n            // in the query rule actions, we don't want to sort it\n            if (\n              queryRuleActions.facetAttributesOrder &&\n              !queryRuleActions.facetAttributesOrder.includes(facetName)\n            ) {\n              return sum\n            }\n\n            return {\n              ...sum,\n              [facetName]: {\n                sortRemainingBy: 'count'\n              }\n            }\n          },\n          {}\n        )\n      }\n    }\n  }\n}\n\nconst getPageDetails = (\n  response: ElasticsearchResponseBody,\n  request: AlgoliaMultipleQueriesQuery,\n  queryRuleActions: QueryRuleActions\n) => {\n  const { params = {} } = request\n  const { hitsPerPage = 20, page = 0 } = params\n\n  const { total } = response.hits\n  const totalHits = typeof total === 'number' ? total : total?.value\n  const nbPages =\n    hitsPerPage <= 0\n      ? 0\n      : Math.ceil((typeof total === 'number' ? total : total?.value || 0) / hitsPerPage)\n\n  return {\n    hitsPerPage,\n    processingTimeMS: response.took,\n    nbHits: totalHits,\n    page: page,\n    nbPages,\n    query: queryRuleActions.query\n  }\n}\n\nexport default function transformResponse(\n  response: ElasticsearchResponseBody,\n  instantsearchRequest: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig,\n  queryRuleActions: QueryRuleActions\n) {\n  try {\n    return {\n      appliedRules: queryRuleActions.ruleIds,\n      exhaustiveNbHits: true,\n      exhaustiveFacetsCount: true,\n      exhaustiveTypo: true,\n      exhaustive: { facetsCount: true, nbHits: true, typo: true },\n      ...getPageDetails(response, instantsearchRequest, queryRuleActions),\n      ...getRenderingContent(config, queryRuleActions),\n      ...getFacets(response, config),\n      hits: getHits(response, config, instantsearchRequest),\n      index: instantsearchRequest.indexName,\n      params: new URLSearchParams(instantsearchRequest.params as any).toString(),\n      ...(queryRuleActions.userData.length > 0 ? { userData: queryRuleActions.userData } : {})\n    }\n  } catch (e) {\n    throw new Error(`Error transforming Elasticsearch response for index`)\n  }\n}\n\nexport const transformFacetValuesResponse = (\n  response: ElasticsearchResponseBody,\n  instantsearchRequest: AlgoliaMultipleQueriesQuery\n) => {\n  const aggregations = response.aggregations || {}\n  // @ts-ignore\n  const facetName = instantsearchRequest?.params?.facetName\n\n  const preTag = instantsearchRequest.params?.highlightPreTag || '<ais-highlight-0000000000>'\n  const postTag = instantsearchRequest.params?.highlightPostTag || '<ais-highlight-0000000000/>'\n\n  let agg = aggregations[Object.keys(aggregations)[0]] as any\n\n  if (agg && agg[facetName]) {\n    agg = agg[facetName]\n  }\n\n  return {\n    facetHits: agg.buckets.map((entry: any) => ({\n      value: entry.key,\n      highlighted: highlightTerm(\n        entry.key,\n        // @ts-ignore\n        instantsearchRequest.params.facetQuery || ''\n      )\n        .replace(/<\\em>/g, preTag)\n        .replace(/<\\/\\em>/g, postTag),\n      count: entry.doc_count\n    })),\n    exhaustiveFacetsCount: true,\n    processingTimeMS: response.took\n  }\n}\n","import { AppSettings, BasicAuth, ConfigConnection, SearchRequest } from './types'\nimport { ElasticsearchResponseBody, Transporter } from './types'\nimport { createElasticsearchQueryFromRequest } from './utils'\n\nconst authString = (auth: BasicAuth) => {\n  if (typeof btoa === 'undefined') {\n    return Buffer.from(auth.username + ':' + auth.password).toString('base64')\n  } else {\n    return btoa(auth.username + ':' + auth.password)\n  }\n}\n\nfunction getHostFromCloud(cloudId: string) {\n  // the cloud id is `cluster-name:base64encodedurl`\n  // the url is a string divided by two '$', the first is the cloud url\n  // the second the elasticsearch instance, the third the kibana instance\n  let cloudUrls\n  if (typeof atob === 'undefined') {\n    cloudUrls = Buffer.from(cloudId.split(':')[1], 'base64').toString()\n  } else {\n    cloudUrls = atob(cloudId.split(':')[1]).split('$')\n  }\n  return `https://${cloudUrls[1]}.${cloudUrls[0]}`\n}\n\nexport class ESTransporter implements Transporter {\n  private timeout: number\n\n  constructor(public config: ConfigConnection, private settings: AppSettings) {\n    this.timeout = settings.timeout ?? 30000\n  }\n\n  createElasticsearchQueryFromRequest(requests: SearchRequest[]) {\n    return createElasticsearchQueryFromRequest(requests)\n  }\n\n  async performNetworkRequest(requests: SearchRequest[]) {\n    if (this.config.host === undefined && this.config.cloud_id === undefined) {\n      throw new Error(\n        'No Elasticsearch host or cloud_id specified. Please provide a host or cloud id in your Searchkit configuration.'\n      )\n    }\n\n    const host = this.config.cloud_id ? getHostFromCloud(this.config.cloud_id) : this.config.host\n\n    const controller = new AbortController()\n    const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n    try {\n      const response = await fetch(`${host}/_msearch`, {\n        headers: {\n          ...(this.config.apiKey ? { authorization: `ApiKey ${this.config.apiKey}` } : {}),\n          'content-type': 'application/json',\n          ...(this.config.headers || {}),\n          ...(this.config.auth\n            ? {\n                Authorization: 'Basic ' + authString(this.config.auth)\n              }\n            : {})\n        },\n        body: this.createElasticsearchQueryFromRequest(requests),\n        method: 'POST',\n        signal: controller.signal,\n        ...(this.config.withCredentials ? { credentials: 'include' } : {})\n      })\n\n      if (response.ok === false) {\n        throw new Error(`Elasticsearch request failed with status ${response.status}: ${response.statusText}`)\n      }\n\n      return response\n    } catch (error) {\n      if (error instanceof Error && error.name === 'AbortError') {\n        throw new Error(`Elasticsearch request timed out after ${this.timeout}ms`)\n      }\n      throw error\n    } finally {\n      clearTimeout(timeoutId)\n    }\n  }\n\n  async msearch(requests: SearchRequest[]): Promise<ElasticsearchResponseBody[]> {\n    try {\n      const response = await this.performNetworkRequest(requests)\n      const responses = await response.json()\n\n      if (this.settings.debug) {\n        console.log('Elasticsearch response:')\n        console.log(JSON.stringify(responses))\n      }\n\n      if (responses.status >= 500) {\n        console.error(\n          'Elasticsearch Internal Error: Check your elasticsearch instance to make sure it can recieve requests.'\n        )\n        throw new Error(JSON.stringify(responses))\n      } else if (responses.status === 401) {\n        console.error(\n          'Cannot connect to Elasticsearch. Check your connection host and auth details (username/password or API Key required). You can also provide a custom Elasticsearch transporter to the API Client. See https://www.searchkit.co/docs/guides/setup-elasticsearch#connecting-with-usernamepassword for more details.'\n        )\n        throw new Error(JSON.stringify(responses))\n      } else if (responses.responses?.[0]?.status === 403) {\n        console.error(\n          'Auth Error: You do not have permission to access this index. Check you are calling the right index (specified in frontend) and your API Key permissions has access to the index.'\n        )\n        throw new Error(JSON.stringify(responses))\n      } else if (responses.status === 404 || responses.responses?.[0]?.status === 404) {\n        console.error('Elasticsearch index not found. Check your index name and make sure it exists.')\n        throw new Error(JSON.stringify(responses))\n      } else if (responses.status === 400 || responses.responses?.[0]?.status === 400) {\n        console.error(\n          `Elasticsearch Bad Request.\n\n          1. Check your query and make sure it is valid.\n          2. Check the field mapping. See documentation to make sure you are using text types for searching and keyword fields for faceting\n          3. Turn on debug mode to see the Elasticsearch query and the error response.\n          `\n        )\n        throw new Error(JSON.stringify(responses))\n      }\n      return responses.responses\n    } catch (error) {\n      throw error\n    }\n  }\n}\n","import { transformQueryString } from './filters'\nimport { AlgoliaMultipleQueriesQuery, QueryRule, SearchSettingsConfig } from './types'\n\nexport interface QueryContextFilter {\n  attribute: string\n  value: string\n}\n\nexport interface QueryContext {\n  query: string\n  context: readonly string[]\n  filters: readonly QueryContextFilter[]\n}\n\nexport interface QueryRuleActions {\n  ruleIds: string[]\n  pinnedDocs: string[]\n  boostFunctions: any[]\n  query: string\n  userData: unknown[]\n  facetAttributesOrder: string[] | undefined\n  baseFilters: any[]\n  touched: boolean\n}\n\nconst getFacetFilters = (\n  facetFilters: string | readonly string[] | readonly (string | readonly string[])[] | undefined\n): QueryContextFilter[] => {\n  if (!facetFilters) {\n    return []\n  }\n  if (typeof facetFilters === 'string') {\n    const [attribute, value] = facetFilters.split(/:(.*)/)\n    return [{ attribute, value }]\n  } else {\n    // @ts-ignore\n    return facetFilters.reduce<QueryContextFilter[]>((sum: any, filter: any) => {\n      if (typeof filter === 'string') {\n        const [attribute, value] = filter.split(/:(.*)/)\n        return [...sum, { attribute, value }]\n      }\n      return [...sum, ...getFacetFilters(filter)]\n    }, [])\n  }\n}\n\nexport const getQueryRulesActionsFromRequest = (\n  queryRules: QueryRule[],\n  request: AlgoliaMultipleQueriesQuery,\n  config: SearchSettingsConfig\n) => {\n  const queryContext: QueryContext = {\n    query: request.params?.query || '',\n    context: request.params?.ruleContexts || [],\n    filters: getFacetFilters(request.params?.facetFilters)\n  }\n\n  const satisfiedRules = getSatisfiedRules(queryContext, queryRules || [])\n\n  const actions = satisfiedRules.reduce<QueryRuleActions>(\n    (sum, rule) => {\n      rule.actions.map((action) => {\n        sum.touched = true\n        if (action.action === 'PinnedResult') {\n          sum.pinnedDocs.push(...action.documentIds)\n        } else if (action.action === 'QueryRewrite') {\n          sum.query = action.query\n        } else if (action.action === 'QueryBoost') {\n          sum.boostFunctions.push({\n            filter: {\n              query_string: {\n                query: transformQueryString(\n                  config.facet_attributes,\n                  config.filter_attributes,\n                  action.query\n                )\n              }\n            },\n            weight: action.weight\n          })\n        } else if (action.action === 'RenderUserData') {\n          sum.userData.push(JSON.parse(action.userData))\n        } else if (action.action === 'RenderFacetsOrder') {\n          sum.facetAttributesOrder = action.facetAttributesOrder\n        } else if (action.action === 'QueryFilter') {\n          sum.baseFilters.push({\n            query_string: {\n              query: transformQueryString(\n                config.facet_attributes,\n                config.filter_attributes,\n                action.query\n              )\n            }\n          })\n        }\n      })\n      return sum\n    },\n    {\n      ruleIds: satisfiedRules.map((rule) => rule.id),\n      pinnedDocs: [],\n      boostFunctions: [],\n      query: queryContext.query,\n      userData: [],\n      facetAttributesOrder: undefined,\n      touched: false,\n      baseFilters: []\n    }\n  )\n\n  return actions\n}\n\nexport const getSatisfiedRules = (queryContext: QueryContext, rules: QueryRule[]) =>\n  rules.filter(\n    (ruleOrs) =>\n      ruleOrs.conditions.find(\n        (rule) =>\n          rule.filter((condition) => {\n            if (condition.context === 'query' && condition.match_type === 'exact') {\n              return condition.value === queryContext.query\n            }\n            if (condition.context === 'query' && condition.match_type === 'contains') {\n              return queryContext.query.includes(condition.value)\n            }\n            if (condition.context === 'query' && condition.match_type === 'prefix') {\n              return queryContext.query.startsWith(condition.value)\n            }\n            if (condition.context === 'context') {\n              return condition.value.some((value) => queryContext.context.includes(value))\n            }\n            if (condition.context === 'filterPresent') {\n              return condition.values.every(\n                (value) =>\n                  queryContext.filters.find(\n                    (filter) => filter.attribute === value.attribute && filter.value === value.value\n                  ) !== undefined\n              )\n            }\n\n            return false\n          }).length === rule.length\n      ) !== undefined\n  )\n","import type { MultipleQueriesQuery as AlgoliaMultipleQueriesQuery } from '@algolia/client-search'\nimport { transformRequest } from './transformRequest'\nimport transformResponse, { transformFacetValuesResponse } from './transformResponse'\nimport { SearchkitConfig, SearchRequest, RequestOptions, Transporter, AppSettings } from './types'\nimport { ESTransporter } from './Transporter'\nimport { getQueryRulesActionsFromRequest, QueryRuleActions } from './queryRules'\nimport { createElasticsearchQueryFromRequest } from './utils'\nimport { getIndexName } from './sorting'\nexport * from './types'\nexport * from './Transporter'\nexport * from './filterUtils'\n\nexport default class Searchkit {\n  private transporter: Transporter\n\n  constructor(private config: SearchkitConfig, private settings: AppSettings = { debug: false }) {\n    this.transporter =\n      'msearch' in config.connection\n        ? config.connection\n        : new ESTransporter(config.connection, settings)\n  }\n\n  private async performSearch(requests: SearchRequest[]) {\n    if (this.settings.debug) {\n      console.log('Performing search with requests:')\n      console.log('POST /_msearch')\n      console.log(createElasticsearchQueryFromRequest(requests))\n    }\n    const responses = await this.transporter.msearch(requests)\n    return responses\n  }\n\n  async handleInstantSearchRequests(\n    instantsearchRequests: readonly AlgoliaMultipleQueriesQuery[],\n    requestOptions?: RequestOptions\n  ) {\n    if (!instantsearchRequests || Array.isArray(instantsearchRequests) === false) {\n      console.log({ instantsearchRequests })\n      throw new Error(\n        'No instantsearch requests provided. Check that the data you are providing from API request is correct. Likely you are not passing the request body correctly, its still a JSON string or the API is not a POST request.'\n      )\n    }\n\n    const queryRules = this.config.search_settings.query_rules || []\n\n    const requestQueryRuleActions: QueryRuleActions[] = instantsearchRequests.map((request) => {\n      return getQueryRulesActionsFromRequest(queryRules, request, this.config.search_settings)\n    })\n\n    let esRequests: SearchRequest[] = instantsearchRequests.map((request, i) => ({\n      body: transformRequest(\n        request,\n        this.config.search_settings,\n        requestQueryRuleActions[i],\n        requestOptions\n      ),\n      request: request,\n      indexName: getIndexName(request.indexName, this.config.search_settings)\n    }))\n\n    if (requestOptions?.hooks?.beforeSearch) {\n      esRequests = await requestOptions.hooks.beforeSearch(esRequests)\n    }\n\n    let esResponses = await this.performSearch(esRequests)\n\n    if (requestOptions?.hooks?.afterSearch) {\n      esResponses = await requestOptions.hooks.afterSearch(esRequests, esResponses)\n    }\n\n    try {\n      const instantsearchResponses = esResponses.map((response, i) => {\n        // @ts-ignore\n        if (instantsearchRequests[i].params?.facetName) {\n          return transformFacetValuesResponse(response, instantsearchRequests[i])\n        }\n        return transformResponse(\n          response,\n          instantsearchRequests[i],\n          this.config.search_settings,\n          requestQueryRuleActions[i]\n        )\n      })\n\n      return {\n        results: instantsearchResponses\n      }\n    } catch (err) {\n      console.error(err)\n      throw new Error(\n        'Error transforming response. Check the afterSearch hook function is correct. Likely you are not returning the correct response object.'\n      )\n    }\n  }\n}\n"],"mappings":"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","names":["field","operator","value","filter","sum","sortConfig","facetAttributes","getHighlightFields","highlightedMatch","getHighlightFields","buckets","_a"]}