{"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';\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 => {\n if (!isObject(value) || 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 isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record => 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 .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 = 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 = {};\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":["DEFAULT_QS_ARRAY_LIMIT","isQsArrayLimitPopulateObject","value","isObject","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","result","objectPopulateToPaths","paths","Promise","all","map","subClause","filter","item","isNil","_visitor","_options","parse","transform","identity","get","_key","data","set","constant","remove","undefined","tokenize","split","recompose","join","trim","root","isEmpty","v","first","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","object","forEach","clause"],"mappings":"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"}