{"version":3,"file":"query-populate.mjs","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import {\n  curry,\n  isString,\n  isArray,\n  isEmpty,\n  split,\n  isObject,\n  trim,\n  constant,\n  isNil,\n  identity,\n  cloneDeep,\n  join,\n  first,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\n\nconst isKeyword = (keyword: string) => {\n  return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n    return !attribute && keyword === key;\n  };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n  return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n  isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n  .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n    /**\n     * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n     * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n     */\n    const populateObject = pathsToObjectPopulate([populate]);\n    const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n    const [result] = objectPopulateToPaths(traversedPopulate);\n\n    return result;\n  })\n  // Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items\n  .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n    const paths = await Promise.all(\n      populate.map((subClause) => recurse(visitor, options, subClause))\n    );\n\n    return paths.filter((item) => !isNil(item));\n  })\n  // for wildcard, generate custom utilities to modify the values\n  .parse(isWildcard, () => ({\n    /**\n     * Since value is '*', we don't need to transform it\n     */\n    transform: identity,\n\n    /**\n     * '*' isn't a key/value structure, so regardless\n     *  of the given key, it returns the data ('*')\n     */\n    get: (_key, data) => data,\n\n    /**\n     * '*' isn't a key/value structure, so regardless\n     * of the given `key`, use `value` as the new `data`\n     */\n    set: (_key, value) => value,\n\n    /**\n     * '*' isn't a key/value structure, but we need to simulate at least one to enable\n     * the data traversal. We're using '' since it represents a falsy string value\n     */\n    keys: constant(['']),\n\n    /**\n     * Removing '*' means setting it to undefined, regardless of the given key\n     */\n    remove: constant(undefined),\n  }))\n\n  // Parse string values\n  .parse(isString, () => {\n    const tokenize = split('.');\n    const recompose = join('.');\n\n    return {\n      transform: trim,\n\n      remove(key, data) {\n        const [root] = tokenize(data);\n\n        return root === key ? undefined : data;\n      },\n\n      set(key, value, data) {\n        const [root] = tokenize(data);\n\n        if (root !== key) {\n          return data;\n        }\n\n        return isNil(value) || isEmpty(value) ? root : `${root}.${value}`;\n      },\n\n      keys(data) {\n        const v = first(tokenize(data));\n        return v ? [v] : [];\n      },\n\n      get(key, data) {\n        const [root, ...rest] = tokenize(data);\n\n        return key === root ? recompose(rest) : undefined;\n      },\n    };\n  })\n  // Parse object values\n  .parse(isObj, () => ({\n    transform: cloneDeep,\n\n    remove(key, data) {\n      // eslint-disable-next-line no-unused-vars\n      const { [key]: ignored, ...rest } = data;\n\n      return rest;\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(({ key, attribute, parent }) => {\n    // We don't want to recurse using traversePopulate for query keywords.\n    // Instead, the visitors handle them with the appropriate traversal (sort, filters, etc.).\n    //\n    // When a keyword name (e.g. 'filters') also exists as an attribute in the schema,\n    // we still treat it as a keyword if we're inside a nested populate context\n    // (parent is an attribute). This prevents the traverse from recursing into\n    // component/relation attributes named 'filters' with query filter data,\n    // which would cause \"Invalid key\" validation errors (issue #21338).\n    //\n    // The attribute can still be populated explicitly via `populate: { filters: true }`.\n    return ['sort', 'filters', 'fields'].includes(key) && (!attribute || !!parent?.attribute);\n  })\n  .on(\n    // Handle recursion on populate.\"populate\"\n    isKeyword('populate'),\n    async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n      const parent: Parent = { key, path, schema, attribute };\n\n      const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n      set(key, newValue);\n    }\n  )\n  .on(\n    isKeyword('on'),\n    async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n      const newOn: Record<string, unknown> = {};\n\n      if (!isObj(value)) {\n        return;\n      }\n\n      for (const [uid, subPopulate] of Object.entries(value)) {\n        const model = getModel(uid);\n        const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n        newOn[uid] = await recurse(\n          visitor,\n          { schema: model, path: newPath, getModel, parent },\n          subPopulate\n        );\n      }\n\n      set(key, newOn);\n    }\n  )\n  // Handle populate on relation\n  .onRelation(\n    async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n      if (isNil(value)) {\n        return;\n      }\n\n      const parent: Parent = { key, path, schema, attribute };\n\n      if (isMorphToRelationalAttribute(attribute)) {\n        // Don't traverse values that cannot be parsed\n        if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n          return;\n        }\n\n        // If there is a populate fragment defined, traverse it\n        const newValue = await recurse(\n          visitor,\n          { schema, path, getModel, parent },\n          { on: value?.on }\n        );\n\n        set(key, newValue);\n\n        return;\n      }\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  // Handle populate on media\n  .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n    if (isNil(value)) {\n      return;\n    }\n\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  // Handle populate on components\n  .onComponent(\n    async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n      if (isNil(value)) {\n        return;\n      }\n\n      const parent: Parent = { key, path, schema, attribute };\n\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 populate on dynamic zones\n  .onDynamicZone(\n    async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n      if (isNil(value) || !isObject(value)) {\n        return;\n      }\n\n      const parent: Parent = { key, path, schema, attribute };\n\n      // Handle fragment syntax\n      if ('on' in value && value.on) {\n        const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n        set(key, newOn);\n      }\n    }\n  );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n  [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] => {\n  const paths: string[] = [];\n\n  function traverse(currentObj: PopulateObject, parentPath: string) {\n    for (const [key, value] of Object.entries(currentObj)) {\n      const currentPath = parentPath ? `${parentPath}.${key}` : key;\n      if (value === true) {\n        paths.push(currentPath);\n      } else {\n        traverse((value as { populate: PopulateObject }).populate, currentPath);\n      }\n    }\n  }\n\n  traverse(input, '');\n\n  return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n  const result: PopulateObject = {};\n\n  function traverse(object: PopulateObject, keys: string[]): void {\n    const [first, ...rest] = keys;\n    if (rest.length === 0) {\n      object[first] = true;\n    } else {\n      if (!object[first] || typeof object[first] === 'boolean') {\n        object[first] = { populate: {} };\n      }\n      traverse((object[first] as { populate: PopulateObject }).populate, rest);\n    }\n  }\n\n  input.forEach((clause) => traverse(result, clause.split('.')));\n\n  return result;\n};\n"],"names":["isKeyword","keyword","key","attribute","isWildcard","value","isPopulateString","isString","isStringArray","isArray","every","isObj","isObject","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","result","objectPopulateToPaths","paths","Promise","all","map","subClause","filter","item","isNil","parse","transform","identity","get","_key","data","set","keys","constant","remove","undefined","tokenize","split","recompose","join","trim","root","isEmpty","v","first","rest","cloneDeep","ignored","Object","ignore","parent","includes","on","path","schema","getModel","newValue","newOn","uid","subPopulate","entries","model","newPath","raw","onRelation","isMorphToRelationalAttribute","targetSchemaUID","target","targetSchema","onMedia","onComponent","component","onDynamicZone","curry","traverse","input","currentObj","parentPath","currentPath","push","object","length","forEach","clause"],"mappings":"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"}