@strapi/utils 5.40.0 → 5.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-populate.d.ts","sourceRoot":"","sources":["../../src/traverse/query-populate.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"query-populate.d.ts","sourceRoot":"","sources":["../../src/traverse/query-populate.ts"],"names":[],"mappings":";;AAkSA,wBAAwC"}
|
|
@@ -99,14 +99,22 @@ const populate = factory().intercept(isPopulateString, async (visitor, options,
|
|
|
99
99
|
get (key, data) {
|
|
100
100
|
return data[key];
|
|
101
101
|
}
|
|
102
|
-
})).ignore(({ key, attribute })=>{
|
|
103
|
-
//
|
|
104
|
-
// the visitors
|
|
102
|
+
})).ignore(({ key, attribute, parent })=>{
|
|
103
|
+
// We don't want to recurse using traversePopulate for query keywords.
|
|
104
|
+
// Instead, the visitors handle them with the appropriate traversal (sort, filters, etc.).
|
|
105
|
+
//
|
|
106
|
+
// When a keyword name (e.g. 'filters') also exists as an attribute in the schema,
|
|
107
|
+
// we still treat it as a keyword if we're inside a nested populate context
|
|
108
|
+
// (parent is an attribute). This prevents the traverse from recursing into
|
|
109
|
+
// component/relation attributes named 'filters' with query filter data,
|
|
110
|
+
// which would cause "Invalid key" validation errors (issue #21338).
|
|
111
|
+
//
|
|
112
|
+
// The attribute can still be populated explicitly via `populate: { filters: true }`.
|
|
105
113
|
return [
|
|
106
114
|
'sort',
|
|
107
115
|
'filters',
|
|
108
116
|
'fields'
|
|
109
|
-
].includes(key) && !attribute;
|
|
117
|
+
].includes(key) && (!attribute || !!parent?.attribute);
|
|
110
118
|
}).on(// Handle recursion on populate."populate"
|
|
111
119
|
isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
112
120
|
const parent = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-populate.js","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 }) => {\n // we don't want to recurse using traversePopulate and instead let\n // the visitors recurse with the appropriate traversal (sort, filters, etc...)\n return ['sort', 'filters', 'fields'].includes(key) && !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","includes","on","path","schema","getModel","parent","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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"}
|
|
1
|
+
{"version":3,"file":"query-populate.js","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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"}
|
|
@@ -97,14 +97,22 @@ const populate = traverseFactory().intercept(isPopulateString, async (visitor, o
|
|
|
97
97
|
get (key, data) {
|
|
98
98
|
return data[key];
|
|
99
99
|
}
|
|
100
|
-
})).ignore(({ key, attribute })=>{
|
|
101
|
-
//
|
|
102
|
-
// the visitors
|
|
100
|
+
})).ignore(({ key, attribute, parent })=>{
|
|
101
|
+
// We don't want to recurse using traversePopulate for query keywords.
|
|
102
|
+
// Instead, the visitors handle them with the appropriate traversal (sort, filters, etc.).
|
|
103
|
+
//
|
|
104
|
+
// When a keyword name (e.g. 'filters') also exists as an attribute in the schema,
|
|
105
|
+
// we still treat it as a keyword if we're inside a nested populate context
|
|
106
|
+
// (parent is an attribute). This prevents the traverse from recursing into
|
|
107
|
+
// component/relation attributes named 'filters' with query filter data,
|
|
108
|
+
// which would cause "Invalid key" validation errors (issue #21338).
|
|
109
|
+
//
|
|
110
|
+
// The attribute can still be populated explicitly via `populate: { filters: true }`.
|
|
103
111
|
return [
|
|
104
112
|
'sort',
|
|
105
113
|
'filters',
|
|
106
114
|
'fields'
|
|
107
|
-
].includes(key) && !attribute;
|
|
115
|
+
].includes(key) && (!attribute || !!parent?.attribute);
|
|
108
116
|
}).on(// Handle recursion on populate."populate"
|
|
109
117
|
isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
|
|
110
118
|
const parent = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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 }) => {\n // we don't want to recurse using traversePopulate and instead let\n // the visitors recurse with the appropriate traversal (sort, filters, etc...)\n return ['sort', 'filters', 'fields'].includes(key) && !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","includes","on","path","schema","getModel","parent","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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"}
|
|
1
|
+
{"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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/utils",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.41.0",
|
|
4
4
|
"description": "Shared utilities for the Strapi packages",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"strapi",
|
|
@@ -62,10 +62,10 @@
|
|
|
62
62
|
"@types/http-errors": "2.0.4",
|
|
63
63
|
"@types/koa": "2.13.4",
|
|
64
64
|
"@types/node": "24.10.0",
|
|
65
|
-
"eslint-config-custom": "5.
|
|
65
|
+
"eslint-config-custom": "5.41.0",
|
|
66
66
|
"koa": "2.16.4",
|
|
67
67
|
"koa-body": "6.0.1",
|
|
68
|
-
"tsconfig": "5.
|
|
68
|
+
"tsconfig": "5.41.0"
|
|
69
69
|
},
|
|
70
70
|
"engines": {
|
|
71
71
|
"node": ">=20.0.0 <=24.x.x",
|