{"version":3,"file":"query-populate.mjs","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import { curry, isString, isEmpty, isObject, constant, identity, cloneDeep } from 'lodash';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\nimport { ValidationError } from '../errors';\n\nconst DEFAULT_QS_ARRAY_LIMIT = 100;\n\n/**\n * Detects objects with consecutive numeric string keys and string values — the shape `qs`\n * produces when indexed array notation exceeds `arrayLimit` (see #25632).\n */\nconst isQsArrayLimitPopulateObject = (value: unknown): value is Record<string, string> => {\n  if (!isObject(value) || Array.isArray(value)) {\n    return false;\n  }\n\n  const keys = Object.keys(value);\n\n  if (keys.length === 0 || keys.length <= DEFAULT_QS_ARRAY_LIMIT) {\n    return false;\n  }\n\n  const hasConsecutiveNumericKeys = keys.every((key, index) => key === String(index));\n\n  if (!hasConsecutiveNumericKeys) {\n    return false;\n  }\n\n  return Object.values(value).every((entry) => typeof entry === 'string');\n};\n\nconst throwQsArrayLimitPopulateError = (entryCount: number) => {\n  throw new ValidationError(\n    `Too many populate entries (${entryCount}). The maximum number of populate entries when using array notation is ${DEFAULT_QS_ARRAY_LIMIT}. ` +\n      'Consider using object notation (populate[field]=true), nested population, or reducing the number of fields.'\n  );\n};\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  Array.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 paths = objectPopulateToPaths(traversedPopulate);\n\n    // Dot notation cannot represent polymorphic `on` fragments. Keep the object form\n    // when a visitor adds one, rather than trying to serialize it as nested `populate`.\n    return paths ? paths[0] : traversedPopulate;\n  })\n  // Array of strings ['foo', 'bar.baz'] => traverse as one object, then serialize when possible\n  .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n    const populateObject = pathsToObjectPopulate(populate);\n    const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n    const paths = objectPopulateToPaths(traversedPopulate);\n\n    // A string array cannot hold polymorphic `on` fragments. Return the sanitized object\n    // as a whole when one is present, so consumers receive a valid populate representation.\n    return paths ?? traversedPopulate;\n  })\n  .intercept(isQsArrayLimitPopulateObject, async (_visitor, _options, populate) => {\n    throwQsArrayLimitPopulateError(Object.keys(populate).length);\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 = (value: string) => value.split('.');\n    const recompose = (parts: string[]) => parts.join('.');\n\n    return {\n      transform: (value) => value.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 value == null || isEmpty(value) ? root : `${root}.${value}`;\n      },\n\n      keys(data) {\n        const v = tokenize(data)[0];\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 (value == null) {\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, { ...value, ...(newValue as Record<string, unknown>) });\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 (value == null) {\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 (value == null) {\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 (value == null || !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[] | undefined => {\n  const paths: string[] = [];\n\n  function traverse(currentObj: PopulateObject, parentPath: string): boolean {\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        const nestedPopulate = (value as { populate?: PopulateObject }).populate;\n\n        if (!nestedPopulate || !traverse(nestedPopulate, currentPath)) {\n          return false;\n        }\n      }\n    }\n\n    return true;\n  }\n\n  if (!traverse(input, '')) {\n    return undefined;\n  }\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":["DEFAULT_QS_ARRAY_LIMIT","isQsArrayLimitPopulateObject","value","isObject","Array","isArray","keys","Object","length","hasConsecutiveNumericKeys","every","key","index","String","values","entry","throwQsArrayLimitPopulateError","entryCount","ValidationError","isKeyword","keyword","attribute","isWildcard","isPopulateString","isString","isStringArray","isObj","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","paths","objectPopulateToPaths","_visitor","_options","parse","transform","identity","get","_key","data","set","constant","remove","undefined","tokenize","split","recompose","parts","join","trim","root","isEmpty","v","rest","cloneDeep","ignored","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","nestedPopulate","result","object","first","forEach","clause"],"mappings":"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"}