{"version":3,"file":"query-filters.mjs","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { curry, isObject, isEmpty, isArray, isNil, cloneDeep, omit } from 'lodash/fp';\n\nimport { isScalarAttribute } from '../content-types';\nimport { isOperator } from '../operators';\nimport traverseFactory, { type Parent } from './factory';\nimport type { Model } from '../types';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\n/** True if this object should be walked as a filter subtree (operators / attributes), not an opaque operand. */\nconst isFilterLikeObject = (value: Record<string, unknown>, schema?: Model) =>\n  Object.keys(value).some((k) => isOperator(k) || Boolean(schema?.attributes?.[k]));\n\nconst filters = traverseFactory()\n  .intercept(\n    // Intercept filters arrays and apply the traversal to each one individually\n    isArray,\n    async (visitor, options, filters, { recurse }) => {\n      return Promise.all(\n        filters.map((filter, i) => {\n          // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]\n          // can have a value array, thus we can update the raw path but not the attribute one\n          const newPath = options.path\n            ? { ...options.path, raw: `${options.path.raw}[${i}]` }\n            : options.path;\n\n          return recurse(visitor, { ...options, path: newPath }, filter);\n        })\n        // todo: move that to the visitors\n      ).then((res) => res.filter((val) => !(isObject(val) && isEmpty(val))));\n    }\n  )\n  .intercept(\n    // Ignore non object filters and return the value as-is\n    (filters): filters is unknown => !isObject(filters),\n    (_, __, filters) => {\n      return filters;\n    }\n  )\n  // Parse object values\n  .parse(isObj, () => ({\n    transform: cloneDeep,\n\n    remove(key, data) {\n      return omit(key, data);\n    },\n\n    set(key, value, data) {\n      return { ...data, [key]: value };\n    },\n\n    keys(data) {\n      return Object.keys(data);\n    },\n\n    get(key, data) {\n      return data[key];\n    },\n  }))\n  // Ignore null or undefined values\n  .ignore(({ value }) => isNil(value))\n  // Recursion on operators (non attributes)\n  .on(\n    ({ attribute }) => isNil(attribute),\n    async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n      const parent: Parent = { key, path, schema, attribute };\n\n      // Operator operands that are plain objects (not arrays) are only traversed when they look like\n      // filter subtrees (nested operators or schema attributes). Otherwise treat as opaque operands\n      // (e.g. GraphQL DateTime / Date for $gt, $null / $notNull booleans, or { $null: { anything } }).\n      // Without this, traversing into e.g. { $null: { anything: 'x' } } makes validate throw on \"anything\".\n      // $not is excluded: its value is always a nested filter map, not an opaque scalar operand.\n      if (\n        isOperator(key) &&\n        key !== '$not' &&\n        isObj(value) &&\n        !isArray(value) &&\n        !isFilterLikeObject(value, schema)\n      ) {\n        set(key, value);\n        return;\n      }\n\n      set(key, await recurse(visitor, { schema, path, getModel, parent }, value));\n    }\n  )\n  // Handle relation recursion\n  .onRelation(\n    async ({ key, attribute, visitor, path, value, schema, getModel }, { set, recurse }) => {\n      const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n      if (isMorphRelation) {\n        return;\n      }\n\n      const parent: Parent = { key, path, schema, attribute };\n\n      const targetSchemaUID = attribute.target;\n      const targetSchema = getModel(targetSchemaUID!);\n\n      const newValue = await recurse(\n        visitor,\n        { schema: targetSchema, path, getModel, parent },\n        value\n      );\n\n      set(key, newValue);\n    }\n  )\n  .onComponent(\n    async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse }) => {\n      const parent: Parent = { key, path, schema, attribute };\n      const targetSchema = getModel(attribute.component);\n\n      const newValue = await recurse(\n        visitor,\n        { schema: targetSchema, path, getModel, parent },\n        value\n      );\n\n      set(key, newValue);\n    }\n  )\n  // Handle media recursion\n  .onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse }) => {\n    const parent: Parent = { key, path, schema, attribute };\n\n    const targetSchemaUID = 'plugin::upload.file';\n    const targetSchema = getModel(targetSchemaUID);\n\n    const newValue = await recurse(\n      visitor,\n      { schema: targetSchema, path, getModel, parent },\n      value\n    );\n\n    set(key, newValue);\n  })\n  // Scalar fields: recurse into operator maps (e.g. { $contains: 'x' }) so visitors see nested keys.\n  .onAttribute(\n    ({ attribute, value }) =>\n      Boolean(isScalarAttribute(attribute)) && isObj(value) && !isArray(value),\n    async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n      const parent: Parent = { key, path, schema, attribute };\n\n      set(key, await recurse(visitor, { schema, path, getModel, parent }, value));\n    }\n  );\n\nexport default curry(filters.traverse);\n"],"names":["isObj","value","isObject","isFilterLikeObject","schema","Object","keys","some","k","isOperator","Boolean","attributes","filters","traverseFactory","intercept","isArray","visitor","options","recurse","Promise","all","map","filter","i","newPath","path","raw","then","res","val","isEmpty","_","__","parse","transform","cloneDeep","remove","key","data","omit","set","get","ignore","isNil","on","attribute","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","onAttribute","isScalarAttribute","curry","traverse"],"mappings":"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"}