{"version":3,"file":"query-filters.mjs","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { isObject, isEmpty, cloneDeep, omit } from 'lodash';\n\nimport { curry } from '../curry';\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    Array.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(data, key);\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 }) => value == null)\n  // Recursion on operators (non attributes)\n  .on(\n    ({ attribute }) => attribute == null,\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        !Array.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) && !Array.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","Array","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","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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"}