@strapi/utils 5.56.0 → 5.58.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.
- package/dist/async.js +2 -2
- package/dist/async.js.map +1 -1
- package/dist/async.mjs +1 -1
- package/dist/async.mjs.map +1 -1
- package/dist/content-types.d.ts.map +1 -1
- package/dist/content-types.js +8 -9
- package/dist/content-types.js.map +1 -1
- package/dist/content-types.mjs +6 -7
- package/dist/content-types.mjs.map +1 -1
- package/dist/convert-query-params.d.ts.map +1 -1
- package/dist/convert-query-params.js +33 -34
- package/dist/convert-query-params.js.map +1 -1
- package/dist/convert-query-params.mjs +23 -24
- package/dist/convert-query-params.mjs.map +1 -1
- package/dist/format-yup-error.js +3 -3
- package/dist/format-yup-error.js.map +1 -1
- package/dist/format-yup-error.mjs +1 -1
- package/dist/format-yup-error.mjs.map +1 -1
- package/dist/hooks.js +3 -3
- package/dist/hooks.js.map +1 -1
- package/dist/hooks.mjs +2 -2
- package/dist/hooks.mjs.map +1 -1
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +15 -18
- package/dist/pagination.js.map +1 -1
- package/dist/pagination.mjs +15 -18
- package/dist/pagination.mjs.map +1 -1
- package/dist/policy.d.ts +1 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +1 -3
- package/dist/policy.js.map +1 -1
- package/dist/policy.mjs +1 -3
- package/dist/policy.mjs.map +1 -1
- package/dist/primitives/objects.d.ts +7 -1
- package/dist/primitives/objects.d.ts.map +1 -1
- package/dist/primitives/objects.js +5 -0
- package/dist/primitives/objects.js.map +1 -1
- package/dist/primitives/objects.mjs +5 -1
- package/dist/primitives/objects.mjs.map +1 -1
- package/dist/primitives/strings.d.ts.map +1 -1
- package/dist/primitives/strings.js +3 -7
- package/dist/primitives/strings.js.map +1 -1
- package/dist/primitives/strings.mjs +3 -7
- package/dist/primitives/strings.mjs.map +1 -1
- package/dist/provider-factory.js +4 -4
- package/dist/provider-factory.js.map +1 -1
- package/dist/provider-factory.mjs +1 -1
- package/dist/provider-factory.mjs.map +1 -1
- package/dist/relations.js +2 -2
- package/dist/relations.js.map +1 -1
- package/dist/relations.mjs +1 -1
- package/dist/relations.mjs.map +1 -1
- package/dist/sanitize/index.d.ts.map +1 -1
- package/dist/sanitize/index.js +8 -8
- package/dist/sanitize/index.js.map +1 -1
- package/dist/sanitize/index.mjs +7 -7
- package/dist/sanitize/index.mjs.map +1 -1
- package/dist/sanitize/sanitizers.js +10 -10
- package/dist/sanitize/sanitizers.js.map +1 -1
- package/dist/sanitize/sanitizers.mjs +4 -4
- package/dist/sanitize/sanitizers.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-disallowed-fields.js +4 -4
- package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -1
- package/dist/sanitize/visitors/remove-disallowed-fields.mjs +3 -3
- package/dist/sanitize/visitors/remove-disallowed-fields.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-fields.js +2 -2
- package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-fields.mjs +2 -2
- package/dist/sanitize/visitors/remove-restricted-fields.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-relations.js +9 -9
- package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-relations.mjs +4 -4
- package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +3 -3
- package/dist/security.js.map +1 -1
- package/dist/security.mjs +3 -3
- package/dist/security.mjs.map +1 -1
- package/dist/set-creator-fields.d.ts +4 -1
- package/dist/set-creator-fields.d.ts.map +1 -1
- package/dist/set-creator-fields.js +7 -4
- package/dist/set-creator-fields.js.map +1 -1
- package/dist/set-creator-fields.mjs +7 -4
- package/dist/set-creator-fields.mjs.map +1 -1
- package/dist/traverse/factory.js +8 -8
- package/dist/traverse/factory.js.map +1 -1
- package/dist/traverse/factory.mjs +8 -8
- package/dist/traverse/factory.mjs.map +1 -1
- package/dist/traverse/query-fields.js +7 -7
- package/dist/traverse/query-fields.js.map +1 -1
- package/dist/traverse/query-fields.mjs +3 -3
- package/dist/traverse/query-fields.mjs.map +1 -1
- package/dist/traverse/query-filters.js +12 -12
- package/dist/traverse/query-filters.js.map +1 -1
- package/dist/traverse/query-filters.mjs +7 -7
- package/dist/traverse/query-filters.mjs.map +1 -1
- package/dist/traverse/query-populate.d.ts.map +1 -1
- package/dist/traverse/query-populate.js +21 -21
- package/dist/traverse/query-populate.js.map +1 -1
- package/dist/traverse/query-populate.mjs +12 -12
- package/dist/traverse/query-populate.mjs.map +1 -1
- package/dist/traverse/query-sort.d.ts.map +1 -1
- package/dist/traverse/query-sort.js +16 -16
- package/dist/traverse/query-sort.js.map +1 -1
- package/dist/traverse/query-sort.mjs +6 -6
- package/dist/traverse/query-sort.mjs.map +1 -1
- package/dist/traverse-entity.d.ts.map +1 -1
- package/dist/traverse-entity.js +18 -18
- package/dist/traverse-entity.js.map +1 -1
- package/dist/traverse-entity.mjs +16 -16
- package/dist/traverse-entity.mjs.map +1 -1
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +5 -5
- package/dist/validate/index.js.map +1 -1
- package/dist/validate/index.mjs +3 -3
- package/dist/validate/index.mjs.map +1 -1
- package/dist/validate/utils.d.ts +2 -1
- package/dist/validate/utils.d.ts.map +1 -1
- package/dist/validate/utils.js +4 -4
- package/dist/validate/utils.js.map +1 -1
- package/dist/validate/utils.mjs +4 -4
- package/dist/validate/utils.mjs.map +1 -1
- package/dist/validate/validators.d.ts.map +1 -1
- package/dist/validate/validators.js +17 -9
- package/dist/validate/validators.js.map +1 -1
- package/dist/validate/validators.mjs +14 -6
- package/dist/validate/validators.mjs.map +1 -1
- package/dist/validate/visitors/throw-disallowed-fields.js +4 -4
- package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -1
- package/dist/validate/visitors/throw-disallowed-fields.mjs +3 -3
- package/dist/validate/visitors/throw-disallowed-fields.mjs.map +1 -1
- package/dist/validate/visitors/throw-restricted-fields.js +2 -2
- package/dist/validate/visitors/throw-restricted-fields.js.map +1 -1
- package/dist/validate/visitors/throw-restricted-fields.mjs +2 -2
- package/dist/validate/visitors/throw-restricted-fields.mjs.map +1 -1
- package/dist/validate/visitors/throw-restricted-relations.js +6 -6
- package/dist/validate/visitors/throw-restricted-relations.js.map +1 -1
- package/dist/validate/visitors/throw-restricted-relations.mjs +2 -2
- package/dist/validate/visitors/throw-restricted-relations.mjs.map +1 -1
- package/dist/validators.js +3 -3
- package/dist/validators.js.map +1 -1
- package/dist/validators.mjs +3 -3
- package/dist/validators.mjs.map +1 -1
- package/dist/yup.d.ts.map +1 -1
- package/dist/yup.js +2 -3
- package/dist/yup.js.map +1 -1
- package/dist/yup.mjs +3 -4
- package/dist/yup.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var factory = require('./factory.js');
|
|
5
5
|
var contentTypes = require('../content-types.js');
|
|
6
6
|
var errors = require('../errors.js');
|
|
@@ -10,7 +10,7 @@ const DEFAULT_QS_ARRAY_LIMIT = 100;
|
|
|
10
10
|
* Detects objects with consecutive numeric string keys and string values — the shape `qs`
|
|
11
11
|
* produces when indexed array notation exceeds `arrayLimit` (see #25632).
|
|
12
12
|
*/ const isQsArrayLimitPopulateObject = (value)=>{
|
|
13
|
-
if (!
|
|
13
|
+
if (!_.isObject(value) || Array.isArray(value)) {
|
|
14
14
|
return false;
|
|
15
15
|
}
|
|
16
16
|
const keys = Object.keys(value);
|
|
@@ -33,10 +33,10 @@ const isKeyword = (keyword)=>{
|
|
|
33
33
|
};
|
|
34
34
|
const isWildcard = (value)=>value === '*';
|
|
35
35
|
const isPopulateString = (value)=>{
|
|
36
|
-
return
|
|
36
|
+
return _.isString(value) && !isWildcard(value);
|
|
37
37
|
};
|
|
38
|
-
const isStringArray = (value)=>
|
|
39
|
-
const isObj = (value)=>
|
|
38
|
+
const isStringArray = (value)=>Array.isArray(value) && value.every(_.isString);
|
|
39
|
+
const isObj = (value)=>_.isObject(value);
|
|
40
40
|
const populate = factory().intercept(isPopulateString, async (visitor, options, populate, { recurse })=>{
|
|
41
41
|
/**
|
|
42
42
|
* Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)
|
|
@@ -63,7 +63,7 @@ const populate = factory().intercept(isPopulateString, async (visitor, options,
|
|
|
63
63
|
.parse(isWildcard, ()=>({
|
|
64
64
|
/**
|
|
65
65
|
* Since value is '*', we don't need to transform it
|
|
66
|
-
*/ transform:
|
|
66
|
+
*/ transform: _.identity,
|
|
67
67
|
/**
|
|
68
68
|
* '*' isn't a key/value structure, so regardless
|
|
69
69
|
* of the given key, it returns the data ('*')
|
|
@@ -75,18 +75,18 @@ const populate = factory().intercept(isPopulateString, async (visitor, options,
|
|
|
75
75
|
/**
|
|
76
76
|
* '*' isn't a key/value structure, but we need to simulate at least one to enable
|
|
77
77
|
* the data traversal. We're using '' since it represents a falsy string value
|
|
78
|
-
*/ keys:
|
|
78
|
+
*/ keys: _.constant([
|
|
79
79
|
''
|
|
80
80
|
]),
|
|
81
81
|
/**
|
|
82
82
|
* Removing '*' means setting it to undefined, regardless of the given key
|
|
83
|
-
*/ remove:
|
|
83
|
+
*/ remove: _.constant(undefined)
|
|
84
84
|
}))// Parse string values
|
|
85
|
-
.parse(
|
|
86
|
-
const tokenize =
|
|
87
|
-
const recompose =
|
|
85
|
+
.parse(_.isString, ()=>{
|
|
86
|
+
const tokenize = (value)=>value.split('.');
|
|
87
|
+
const recompose = (parts)=>parts.join('.');
|
|
88
88
|
return {
|
|
89
|
-
transform:
|
|
89
|
+
transform: (value)=>value.trim(),
|
|
90
90
|
remove (key, data) {
|
|
91
91
|
const [root] = tokenize(data);
|
|
92
92
|
return root === key ? undefined : data;
|
|
@@ -96,10 +96,10 @@ const populate = factory().intercept(isPopulateString, async (visitor, options,
|
|
|
96
96
|
if (root !== key) {
|
|
97
97
|
return data;
|
|
98
98
|
}
|
|
99
|
-
return
|
|
99
|
+
return value == null || _.isEmpty(value) ? root : `${root}.${value}`;
|
|
100
100
|
},
|
|
101
101
|
keys (data) {
|
|
102
|
-
const v =
|
|
102
|
+
const v = tokenize(data)[0];
|
|
103
103
|
return v ? [
|
|
104
104
|
v
|
|
105
105
|
] : [];
|
|
@@ -111,7 +111,7 @@ const populate = factory().intercept(isPopulateString, async (visitor, options,
|
|
|
111
111
|
};
|
|
112
112
|
})// Parse object values
|
|
113
113
|
.parse(isObj, ()=>({
|
|
114
|
-
transform:
|
|
114
|
+
transform: _.cloneDeep,
|
|
115
115
|
remove (key, data) {
|
|
116
116
|
// eslint-disable-next-line no-unused-vars
|
|
117
117
|
const { [key]: ignored, ...rest } = data;
|
|
@@ -181,7 +181,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
181
181
|
set(key, newOn);
|
|
182
182
|
})// Handle populate on relation
|
|
183
183
|
.onRelation(async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse })=>{
|
|
184
|
-
if (
|
|
184
|
+
if (value == null) {
|
|
185
185
|
return;
|
|
186
186
|
}
|
|
187
187
|
const parent = {
|
|
@@ -192,7 +192,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
192
192
|
};
|
|
193
193
|
if (contentTypes.isMorphToRelationalAttribute(attribute)) {
|
|
194
194
|
// Don't traverse values that cannot be parsed
|
|
195
|
-
if (!
|
|
195
|
+
if (!_.isObject(value) || !('on' in value && _.isObject(value?.on))) {
|
|
196
196
|
return;
|
|
197
197
|
}
|
|
198
198
|
// If there is a populate fragment defined, traverse it
|
|
@@ -221,7 +221,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
221
221
|
set(key, newValue);
|
|
222
222
|
})// Handle populate on media
|
|
223
223
|
.onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set })=>{
|
|
224
|
-
if (
|
|
224
|
+
if (value == null) {
|
|
225
225
|
return;
|
|
226
226
|
}
|
|
227
227
|
const parent = {
|
|
@@ -241,7 +241,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
241
241
|
set(key, newValue);
|
|
242
242
|
})// Handle populate on components
|
|
243
243
|
.onComponent(async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set })=>{
|
|
244
|
-
if (
|
|
244
|
+
if (value == null) {
|
|
245
245
|
return;
|
|
246
246
|
}
|
|
247
247
|
const parent = {
|
|
@@ -260,7 +260,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
260
260
|
set(key, newValue);
|
|
261
261
|
})// Handle populate on dynamic zones
|
|
262
262
|
.onDynamicZone(async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse })=>{
|
|
263
|
-
if (
|
|
263
|
+
if (value == null || !_.isObject(value)) {
|
|
264
264
|
return;
|
|
265
265
|
}
|
|
266
266
|
const parent = {
|
|
@@ -282,7 +282,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
282
282
|
set(key, newOn);
|
|
283
283
|
}
|
|
284
284
|
});
|
|
285
|
-
var traverseQueryPopulate =
|
|
285
|
+
var traverseQueryPopulate = _.curry(populate.traverse);
|
|
286
286
|
const objectPopulateToPaths = (input)=>{
|
|
287
287
|
const paths = [];
|
|
288
288
|
function traverse(currentObj, parentPath) {
|
|
@@ -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';\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) || 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<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 = 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, { ...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 (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[] | 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","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","join","trim","root","isNil","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","nestedPopulate","result","object","forEach","clause"],"mappings":";;;;;;;AAqBA,MAAMA,sBAAAA,GAAyB,GAAA;AAE/B;;;IAIA,MAAMC,+BAA+B,CAACC,KAAAA,GAAAA;AACpC,IAAA,IAAI,CAACC,WAAAA,CAASD,KAAAA,CAAAA,IAAUE,UAAAA,CAAQF,KAAAA,CAAAA,EAAQ;QACtC,OAAO,KAAA;AACT,IAAA;IAEA,MAAMG,IAAAA,GAAOC,MAAAA,CAAOD,IAAI,CAACH,KAAAA,CAAAA;AAEzB,IAAA,IAAIG,KAAKE,MAAM,KAAK,KAAKF,IAAAA,CAAKE,MAAM,IAAIP,sBAAAA,EAAwB;QAC9D,OAAO,KAAA;AACT,IAAA;IAEA,MAAMQ,yBAAAA,GAA4BH,KAAKI,KAAK,CAAC,CAACC,GAAAA,EAAKC,KAAAA,GAAUD,QAAQE,MAAAA,CAAOD,KAAAA,CAAAA,CAAAA;AAE5E,IAAA,IAAI,CAACH,yBAAAA,EAA2B;QAC9B,OAAO,KAAA;AACT,IAAA;IAEA,OAAOF,MAAAA,CAAOO,MAAM,CAACX,KAAAA,CAAAA,CAAOO,KAAK,CAAC,CAACK,KAAAA,GAAU,OAAOA,KAAAA,KAAU,QAAA,CAAA;AAChE,CAAA;AAEA,MAAMC,iCAAiC,CAACC,UAAAA,GAAAA;IACtC,MAAM,IAAIC,sBAAAA,CACR,CAAC,2BAA2B,EAAED,UAAAA,CAAW,uEAAuE,EAAEhB,sBAAAA,CAAuB,EAAE,CAAC,GAC1I,6GAAA,CAAA;AAEN,CAAA;AAEA,MAAMkB,YAAY,CAACC,OAAAA,GAAAA;AACjB,IAAA,OAAO,CAAC,EAAET,GAAG,EAAEU,SAAS,EAAyC,GAAA;QAC/D,OAAO,CAACA,aAAaD,OAAAA,KAAYT,GAAAA;AACnC,IAAA,CAAA;AACF,CAAA;AAEA,MAAMW,UAAAA,GAAa,CAACnB,KAAAA,GAAiCA,KAAAA,KAAU,GAAA;AAE/D,MAAMoB,mBAAmB,CAACpB,KAAAA,GAAAA;IACxB,OAAOqB,WAAAA,CAASrB,KAAAA,CAAAA,IAAU,CAACmB,UAAAA,CAAWnB,KAAAA,CAAAA;AACxC,CAAA;AAEA,MAAMsB,gBAAgB,CAACtB,KAAAA,GACrBE,WAAQF,KAAAA,CAAAA,IAAUA,KAAAA,CAAMO,KAAK,CAACc,WAAAA,CAAAA;AAEhC,MAAME,KAAAA,GAAQ,CAACvB,KAAAA,GAAqDC,WAAAA,CAASD,KAAAA,CAAAA;AAE7E,MAAMwB,QAAAA,GAAWC,OAAAA,EAAAA,CACdC,SAAS,CAACN,gBAAAA,EAAkB,OAAOO,OAAAA,EAASC,OAAAA,EAASJ,QAAAA,EAAU,EAAEK,OAAO,EAAE,GAAA;AACzE;;;QAIA,MAAMC,iBAAiBC,qBAAAA,CAAsB;AAACP,QAAAA;AAAS,KAAA,CAAA;AACvD,IAAA,MAAMQ,iBAAAA,GAAqB,MAAMH,OAAAA,CAAQF,OAAAA,EAASC,OAAAA,EAASE,cAAAA,CAAAA;AAC3D,IAAA,MAAMG,QAAQC,qBAAAA,CAAsBF,iBAAAA,CAAAA;;;AAIpC,IAAA,OAAOC,KAAAA,GAAQA,KAAK,CAAC,CAAA,CAAE,GAAGD,iBAAAA;AAC5B,CAAA,CACA;CACCN,SAAS,CAACJ,eAAe,OAAOK,OAAAA,EAASC,SAASJ,QAAAA,EAAU,EAAEK,OAAO,EAAE,GAAA;AACtE,IAAA,MAAMC,iBAAiBC,qBAAAA,CAAsBP,QAAAA,CAAAA;AAC7C,IAAA,MAAMQ,iBAAAA,GAAqB,MAAMH,OAAAA,CAAQF,OAAAA,EAASC,OAAAA,EAASE,cAAAA,CAAAA;AAC3D,IAAA,MAAMG,QAAQC,qBAAAA,CAAsBF,iBAAAA,CAAAA;;;AAIpC,IAAA,OAAOC,KAAAA,IAASD,iBAAAA;AAClB,CAAA,CAAA,CACCN,SAAS,CAAC3B,4BAAAA,EAA8B,OAAOoC,UAAUC,QAAAA,EAAUZ,QAAAA,GAAAA;AAClEX,IAAAA,8BAAAA,CAA+BT,MAAAA,CAAOD,IAAI,CAACqB,QAAAA,CAAAA,CAAUnB,MAAM,CAAA;AAC7D,CAAA,CACA;CACCgC,KAAK,CAAClB,UAAAA,EAAY,KAAO;AACxB;;AAEC,QACDmB,SAAAA,EAAWC,WAAAA;AAEX;;;QAIAC,GAAAA,EAAK,CAACC,IAAAA,EAAMC,IAAAA,GAASA,IAAAA;AAErB;;;QAIAC,GAAAA,EAAK,CAACF,IAAAA,EAAMzC,KAAAA,GAAUA,KAAAA;AAEtB;;;AAGC,QACDG,MAAMyC,WAAAA,CAAS;AAAC,YAAA;AAAG,SAAA,CAAA;AAEnB;;AAEC,QACDC,QAAQD,WAAAA,CAASE,SAAAA;AACnB,KAAA,EAEA;AACCT,CAAAA,KAAK,CAAChB,WAAAA,EAAU,IAAA;AACf,IAAA,MAAM0B,WAAWC,QAAAA,CAAM,GAAA,CAAA;AACvB,IAAA,MAAMC,YAAYC,OAAAA,CAAK,GAAA,CAAA;IAEvB,OAAO;QACLZ,SAAAA,EAAWa,OAAAA;QAEXN,MAAAA,CAAAA,CAAOrC,GAAG,EAAEkC,IAAI,EAAA;YACd,MAAM,CAACU,IAAAA,CAAK,GAAGL,QAAAA,CAASL,IAAAA,CAAAA;YAExB,OAAOU,IAAAA,KAAS5C,MAAMsC,SAAAA,GAAYJ,IAAAA;AACpC,QAAA,CAAA;AAEAC,QAAAA,GAAAA,CAAAA,CAAInC,GAAG,EAAER,KAAK,EAAE0C,IAAI,EAAA;YAClB,MAAM,CAACU,IAAAA,CAAK,GAAGL,QAAAA,CAASL,IAAAA,CAAAA;AAExB,YAAA,IAAIU,SAAS5C,GAAAA,EAAK;gBAChB,OAAOkC,IAAAA;AACT,YAAA;YAEA,OAAOW,QAAAA,CAAMrD,UAAUsD,UAAAA,CAAQtD,KAAAA,CAAAA,GAASoD,OAAO,CAAA,EAAGA,IAAAA,CAAK,CAAC,EAAEpD,KAAAA,CAAAA,CAAO;AACnE,QAAA,CAAA;AAEAG,QAAAA,IAAAA,CAAAA,CAAKuC,IAAI,EAAA;YACP,MAAMa,CAAAA,GAAIC,SAAMT,QAAAA,CAASL,IAAAA,CAAAA,CAAAA;AACzB,YAAA,OAAOa,CAAAA,GAAI;AAACA,gBAAAA;AAAE,aAAA,GAAG,EAAE;AACrB,QAAA,CAAA;QAEAf,GAAAA,CAAAA,CAAIhC,GAAG,EAAEkC,IAAI,EAAA;AACX,YAAA,MAAM,CAACU,IAAAA,EAAM,GAAGK,IAAAA,CAAK,GAAGV,QAAAA,CAASL,IAAAA,CAAAA;YAEjC,OAAOlC,GAAAA,KAAQ4C,IAAAA,GAAOH,SAAAA,CAAUQ,IAAAA,CAAAA,GAAQX,SAAAA;AAC1C,QAAA;AACF,KAAA;AACF,CAAA,CACA;CACCT,KAAK,CAACd,KAAAA,EAAO,KAAO;QACnBe,SAAAA,EAAWoB,YAAAA;QAEXb,MAAAA,CAAAA,CAAOrC,GAAG,EAAEkC,IAAI,EAAA;;YAEd,MAAM,EAAE,CAAClC,GAAAA,GAAMmD,OAAO,EAAE,GAAGF,MAAM,GAAGf,IAAAA;YAEpC,OAAOe,IAAAA;AACT,QAAA,CAAA;AAEAd,QAAAA,GAAAA,CAAAA,CAAInC,GAAG,EAAER,KAAK,EAAE0C,IAAI,EAAA;YAClB,OAAO;AAAE,gBAAA,GAAGA,IAAI;AAAE,gBAAA,CAAClC,MAAMR;AAAM,aAAA;AACjC,QAAA,CAAA;AAEAG,QAAAA,IAAAA,CAAAA,CAAKuC,IAAI,EAAA;YACP,OAAOtC,MAAAA,CAAOD,IAAI,CAACuC,IAAAA,CAAAA;AACrB,QAAA,CAAA;QAEAF,GAAAA,CAAAA,CAAIhC,GAAG,EAAEkC,IAAI,EAAA;YACX,OAAOA,IAAI,CAAClC,GAAAA,CAAI;AAClB,QAAA;KACF,CAAA,CAAA,CACCoD,MAAM,CAAC,CAAC,EAAEpD,GAAG,EAAEU,SAAS,EAAE2C,MAAM,EAAE,GAAA;;;;;;;;;;;IAWjC,OAAO;AAAC,QAAA,MAAA;AAAQ,QAAA,SAAA;AAAW,QAAA;KAAS,CAACC,QAAQ,CAACtD,GAAAA,CAAAA,KAAS,CAACU,SAAAA,IAAa,CAAC,CAAC2C,MAAAA,EAAQ3C,SAAQ,CAAA;AACzF,CAAA,CAAA,CACC6C,EAAE;AAED/C,SAAAA,CAAU,UAAA,CAAA,EACV,OAAO,EAAER,GAAG,EAAEmB,OAAO,EAAEqC,IAAI,EAAEhE,KAAK,EAAEiE,MAAM,EAAEC,QAAQ,EAAEhD,SAAS,EAAE,EAAE,EAAEyB,GAAG,EAAEd,OAAO,EAAE,GAAA;AACjF,IAAA,MAAMgC,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;IAEtD,MAAMiD,QAAAA,GAAW,MAAMtC,OAAAA,CAAQF,OAAAA,EAAS;AAAEsC,QAAAA,MAAAA;AAAQD,QAAAA,IAAAA;AAAME,QAAAA,QAAAA;AAAUL,QAAAA;KAAO,EAAG7D,KAAAA,CAAAA;AAE5E2C,IAAAA,GAAAA,CAAInC,GAAAA,EAAK2D,QAAAA,CAAAA;AACX,CAAA,CAAA,CAEDJ,EAAE,CACD/C,SAAAA,CAAU,IAAA,CAAA,EACV,OAAO,EAAER,GAAG,EAAEmB,OAAO,EAAEqC,IAAI,EAAEhE,KAAK,EAAEkE,QAAQ,EAAEL,MAAM,EAAE,EAAE,EAAElB,GAAG,EAAEd,OAAO,EAAE,GAAA;AACtE,IAAA,MAAMuC,QAAiC,EAAC;IAExC,IAAI,CAAC7C,MAAMvB,KAAAA,CAAAA,EAAQ;AACjB,QAAA;AACF,IAAA;IAEA,KAAK,MAAM,CAACqE,GAAAA,EAAKC,WAAAA,CAAY,IAAIlE,MAAAA,CAAOmE,OAAO,CAACvE,KAAAA,CAAAA,CAAQ;AACtD,QAAA,MAAMwE,QAAQN,QAAAA,CAASG,GAAAA,CAAAA;AACvB,QAAA,MAAMI,OAAAA,GAAU;AAAE,YAAA,GAAGT,IAAI;YAAEU,GAAAA,EAAK,CAAA,EAAGV,KAAKU,GAAG,CAAC,CAAC,EAAEL,GAAAA,CAAI,CAAC;AAAE,SAAA;AAEtDD,QAAAA,KAAK,CAACC,GAAAA,CAAI,GAAG,MAAMxC,QACjBF,OAAAA,EACA;YAAEsC,MAAAA,EAAQO,KAAAA;YAAOR,IAAAA,EAAMS,OAAAA;AAASP,YAAAA,QAAAA;AAAUL,YAAAA;SAAO,EACjDS,WAAAA,CAAAA;AAEJ,IAAA;AAEA3B,IAAAA,GAAAA,CAAInC,GAAAA,EAAK4D,KAAAA,CAAAA;AACX,CAAA,CAEF;CACCO,UAAU,CACT,OAAO,EAAEnE,GAAG,EAAER,KAAK,EAAEkB,SAAS,EAAES,OAAO,EAAEqC,IAAI,EAAEC,MAAM,EAAEC,QAAQ,EAAE,EAAE,EAAEvB,GAAG,EAAEd,OAAO,EAAE,GAAA;AACjF,IAAA,IAAIwB,SAAMrD,KAAAA,CAAAA,EAAQ;AAChB,QAAA;AACF,IAAA;AAEA,IAAA,MAAM6D,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;AAEtD,IAAA,IAAI0D,0CAA6B1D,SAAAA,CAAAA,EAAY;;QAE3C,IAAI,CAACjB,WAAAA,CAASD,KAAAA,CAAAA,IAAU,EAAE,QAAQA,KAAAA,IAASC,WAAAA,CAASD,KAAAA,EAAO+D,EAAAA,CAAE,CAAA,EAAI;AAC/D,YAAA;AACF,QAAA;;QAGA,MAAMI,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;AAAEsC,YAAAA,MAAAA;AAAQD,YAAAA,IAAAA;AAAME,YAAAA,QAAAA;AAAUL,YAAAA;SAAO,EACjC;AAAEE,YAAAA,EAAAA,EAAI/D,KAAAA,EAAO+D;AAAG,SAAA,CAAA;AAGlBpB,QAAAA,GAAAA,CAAInC,GAAAA,EAAK;AAAE,YAAA,GAAGR,KAAK;AAAE,YAAA,GAAImE;AAAqC,SAAA,CAAA;AAE9D,QAAA;AACF,IAAA;IAEA,MAAMU,eAAAA,GAAkB3D,UAAU4D,MAAM;AACxC,IAAA,MAAMC,eAAeb,QAAAA,CAASW,eAAAA,CAAAA;IAE9B,MAAMV,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;QAAEsC,MAAAA,EAAQc,YAAAA;AAAcf,QAAAA,IAAAA;AAAME,QAAAA,QAAAA;AAAUL,QAAAA;KAAO,EAC/C7D,KAAAA,CAAAA;AAGF2C,IAAAA,GAAAA,CAAInC,GAAAA,EAAK2D,QAAAA,CAAAA;AACX,CAAA,CAEF;CACCa,OAAO,CAAC,OAAO,EAAExE,GAAG,EAAEwD,IAAI,EAAEC,MAAM,EAAE/C,SAAS,EAAES,OAAO,EAAE3B,KAAK,EAAEkE,QAAQ,EAAE,EAAE,EAAErC,OAAO,EAAEc,GAAG,EAAE,GAAA;AAC1F,IAAA,IAAIU,SAAMrD,KAAAA,CAAAA,EAAQ;AAChB,QAAA;AACF,IAAA;AAEA,IAAA,MAAM6D,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;AAEtD,IAAA,MAAM2D,eAAAA,GAAkB,qBAAA;AACxB,IAAA,MAAME,eAAeb,QAAAA,CAASW,eAAAA,CAAAA;IAE9B,MAAMV,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;QAAEsC,MAAAA,EAAQc,YAAAA;AAAcf,QAAAA,IAAAA;AAAME,QAAAA,QAAAA;AAAUL,QAAAA;KAAO,EAC/C7D,KAAAA,CAAAA;AAGF2C,IAAAA,GAAAA,CAAInC,GAAAA,EAAK2D,QAAAA,CAAAA;AACX,CAAA,CACA;CACCc,WAAW,CACV,OAAO,EAAEzE,GAAG,EAAER,KAAK,EAAEiE,MAAM,EAAEtC,OAAO,EAAEqC,IAAI,EAAE9C,SAAS,EAAEgD,QAAQ,EAAE,EAAE,EAAErC,OAAO,EAAEc,GAAG,EAAE,GAAA;AACjF,IAAA,IAAIU,SAAMrD,KAAAA,CAAAA,EAAQ;AAChB,QAAA;AACF,IAAA;AAEA,IAAA,MAAM6D,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;IAEtD,MAAM6D,YAAAA,GAAeb,QAAAA,CAAShD,SAAAA,CAAUgE,SAAS,CAAA;IAEjD,MAAMf,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;QAAEsC,MAAAA,EAAQc,YAAAA;AAAcf,QAAAA,IAAAA;AAAME,QAAAA,QAAAA;AAAUL,QAAAA;KAAO,EAC/C7D,KAAAA,CAAAA;AAGF2C,IAAAA,GAAAA,CAAInC,GAAAA,EAAK2D,QAAAA,CAAAA;AACX,CAAA,CAEF;CACCgB,aAAa,CACZ,OAAO,EAAE3E,GAAG,EAAER,KAAK,EAAEiE,MAAM,EAAEtC,OAAO,EAAEqC,IAAI,EAAE9C,SAAS,EAAEgD,QAAQ,EAAE,EAAE,EAAEvB,GAAG,EAAEd,OAAO,EAAE,GAAA;AACjF,IAAA,IAAIwB,QAAAA,CAAMrD,KAAAA,CAAAA,IAAU,CAACC,WAAAA,CAASD,KAAAA,CAAAA,EAAQ;AACpC,QAAA;AACF,IAAA;AAEA,IAAA,MAAM6D,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;;AAGtD,IAAA,IAAI,IAAA,IAAQlB,KAAAA,IAASA,KAAAA,CAAM+D,EAAE,EAAE;QAC7B,MAAMK,KAAAA,GAAQ,MAAMvC,OAAAA,CAAQF,OAAAA,EAAS;AAAEsC,YAAAA,MAAAA;AAAQD,YAAAA,IAAAA;AAAME,YAAAA,QAAAA;AAAUL,YAAAA;SAAO,EAAG;AAAEE,YAAAA,EAAAA,EAAI/D,MAAM+D;AAAG,SAAA,CAAA;AAExFpB,QAAAA,GAAAA,CAAInC,GAAAA,EAAK4D,KAAAA,CAAAA;AACX,IAAA;AACF,CAAA,CAAA;AAGJ,4BAAegB,QAAAA,CAAM5D,QAAAA,CAAS6D,QAAQ,CAAA;AAMtC,MAAMnD,wBAAwB,CAACoD,KAAAA,GAAAA;AAC7B,IAAA,MAAMrD,QAAkB,EAAE;IAE1B,SAASoD,QAAAA,CAASE,UAA0B,EAAEC,UAAkB,EAAA;QAC9D,KAAK,MAAM,CAAChF,GAAAA,EAAKR,KAAAA,CAAM,IAAII,MAAAA,CAAOmE,OAAO,CAACgB,UAAAA,CAAAA,CAAa;AACrD,YAAA,MAAME,cAAcD,UAAAA,GAAa,CAAA,EAAGA,WAAW,CAAC,EAAEhF,KAAK,GAAGA,GAAAA;AAC1D,YAAA,IAAIR,UAAU,IAAA,EAAM;AAClBiC,gBAAAA,KAAAA,CAAMyD,IAAI,CAACD,WAAAA,CAAAA;YACb,CAAA,MAAO;gBACL,MAAME,cAAAA,GAAiB,KAAC3F,CAAwCwB,QAAQ;AAExE,gBAAA,IAAI,CAACmE,cAAAA,IAAkB,CAACN,QAAAA,CAASM,gBAAgBF,WAAAA,CAAAA,EAAc;oBAC7D,OAAO,KAAA;AACT,gBAAA;AACF,YAAA;AACF,QAAA;QAEA,OAAO,IAAA;AACT,IAAA;IAEA,IAAI,CAACJ,QAAAA,CAASC,KAAAA,EAAO,EAAA,CAAA,EAAK;QACxB,OAAOxC,SAAAA;AACT,IAAA;IAEA,OAAOb,KAAAA;AACT,CAAA;AAEA,MAAMF,wBAAwB,CAACuD,KAAAA,GAAAA;AAC7B,IAAA,MAAMM,SAAyB,EAAC;IAEhC,SAASP,QAAAA,CAASQ,MAAsB,EAAE1F,IAAc,EAAA;AACtD,QAAA,MAAM,CAACqD,KAAAA,EAAO,GAAGC,IAAAA,CAAK,GAAGtD,IAAAA;QACzB,IAAIsD,IAAAA,CAAKpD,MAAM,KAAK,CAAA,EAAG;YACrBwF,MAAM,CAACrC,MAAM,GAAG,IAAA;QAClB,CAAA,MAAO;YACL,IAAI,CAACqC,MAAM,CAACrC,KAAAA,CAAM,IAAI,OAAOqC,MAAM,CAACrC,KAAAA,CAAM,KAAK,SAAA,EAAW;gBACxDqC,MAAM,CAACrC,MAAM,GAAG;AAAEhC,oBAAAA,QAAAA,EAAU;AAAG,iBAAA;AACjC,YAAA;AACA6D,YAAAA,QAAAA,CAAS,MAAO,CAAC7B,KAAAA,CAAM,CAAkChC,QAAQ,EAAEiC,IAAAA,CAAAA;AACrE,QAAA;AACF,IAAA;IAEA6B,KAAAA,CAAMQ,OAAO,CAAC,CAACC,MAAAA,GAAWV,SAASO,MAAAA,EAAQG,MAAAA,CAAO/C,KAAK,CAAC,GAAA,CAAA,CAAA,CAAA;IAExD,OAAO4C,MAAAA;AACT,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"query-populate.js","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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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { identity, constant, isString,
|
|
1
|
+
import { identity, constant, isString, isEmpty, cloneDeep, isObject, curry } from 'lodash';
|
|
2
2
|
import traverseFactory from './factory.mjs';
|
|
3
3
|
import { isMorphToRelationalAttribute } from '../content-types.mjs';
|
|
4
4
|
import { ValidationError } from '../errors.mjs';
|
|
@@ -8,7 +8,7 @@ const DEFAULT_QS_ARRAY_LIMIT = 100;
|
|
|
8
8
|
* Detects objects with consecutive numeric string keys and string values — the shape `qs`
|
|
9
9
|
* produces when indexed array notation exceeds `arrayLimit` (see #25632).
|
|
10
10
|
*/ const isQsArrayLimitPopulateObject = (value)=>{
|
|
11
|
-
if (!isObject(value) || isArray(value)) {
|
|
11
|
+
if (!isObject(value) || Array.isArray(value)) {
|
|
12
12
|
return false;
|
|
13
13
|
}
|
|
14
14
|
const keys = Object.keys(value);
|
|
@@ -33,7 +33,7 @@ const isWildcard = (value)=>value === '*';
|
|
|
33
33
|
const isPopulateString = (value)=>{
|
|
34
34
|
return isString(value) && !isWildcard(value);
|
|
35
35
|
};
|
|
36
|
-
const isStringArray = (value)=>isArray(value) && value.every(isString);
|
|
36
|
+
const isStringArray = (value)=>Array.isArray(value) && value.every(isString);
|
|
37
37
|
const isObj = (value)=>isObject(value);
|
|
38
38
|
const populate = traverseFactory().intercept(isPopulateString, async (visitor, options, populate, { recurse })=>{
|
|
39
39
|
/**
|
|
@@ -81,10 +81,10 @@ const populate = traverseFactory().intercept(isPopulateString, async (visitor, o
|
|
|
81
81
|
*/ remove: constant(undefined)
|
|
82
82
|
}))// Parse string values
|
|
83
83
|
.parse(isString, ()=>{
|
|
84
|
-
const tokenize = split('.');
|
|
85
|
-
const recompose = join('.');
|
|
84
|
+
const tokenize = (value)=>value.split('.');
|
|
85
|
+
const recompose = (parts)=>parts.join('.');
|
|
86
86
|
return {
|
|
87
|
-
transform: trim,
|
|
87
|
+
transform: (value)=>value.trim(),
|
|
88
88
|
remove (key, data) {
|
|
89
89
|
const [root] = tokenize(data);
|
|
90
90
|
return root === key ? undefined : data;
|
|
@@ -94,10 +94,10 @@ const populate = traverseFactory().intercept(isPopulateString, async (visitor, o
|
|
|
94
94
|
if (root !== key) {
|
|
95
95
|
return data;
|
|
96
96
|
}
|
|
97
|
-
return
|
|
97
|
+
return value == null || isEmpty(value) ? root : `${root}.${value}`;
|
|
98
98
|
},
|
|
99
99
|
keys (data) {
|
|
100
|
-
const v =
|
|
100
|
+
const v = tokenize(data)[0];
|
|
101
101
|
return v ? [
|
|
102
102
|
v
|
|
103
103
|
] : [];
|
|
@@ -179,7 +179,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
179
179
|
set(key, newOn);
|
|
180
180
|
})// Handle populate on relation
|
|
181
181
|
.onRelation(async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse })=>{
|
|
182
|
-
if (
|
|
182
|
+
if (value == null) {
|
|
183
183
|
return;
|
|
184
184
|
}
|
|
185
185
|
const parent = {
|
|
@@ -219,7 +219,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
219
219
|
set(key, newValue);
|
|
220
220
|
})// Handle populate on media
|
|
221
221
|
.onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set })=>{
|
|
222
|
-
if (
|
|
222
|
+
if (value == null) {
|
|
223
223
|
return;
|
|
224
224
|
}
|
|
225
225
|
const parent = {
|
|
@@ -239,7 +239,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
239
239
|
set(key, newValue);
|
|
240
240
|
})// Handle populate on components
|
|
241
241
|
.onComponent(async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set })=>{
|
|
242
|
-
if (
|
|
242
|
+
if (value == null) {
|
|
243
243
|
return;
|
|
244
244
|
}
|
|
245
245
|
const parent = {
|
|
@@ -258,7 +258,7 @@ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, att
|
|
|
258
258
|
set(key, newValue);
|
|
259
259
|
})// Handle populate on dynamic zones
|
|
260
260
|
.onDynamicZone(async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse })=>{
|
|
261
|
-
if (
|
|
261
|
+
if (value == null || !isObject(value)) {
|
|
262
262
|
return;
|
|
263
263
|
}
|
|
264
264
|
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';\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) || 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<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 = 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, { ...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 (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[] | 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","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","join","trim","root","isNil","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","nestedPopulate","result","object","forEach","clause"],"mappings":";;;;;AAqBA,MAAMA,sBAAAA,GAAyB,GAAA;AAE/B;;;IAIA,MAAMC,+BAA+B,CAACC,KAAAA,GAAAA;AACpC,IAAA,IAAI,CAACC,QAAAA,CAASD,KAAAA,CAAAA,IAAUE,OAAAA,CAAQF,KAAAA,CAAAA,EAAQ;QACtC,OAAO,KAAA;AACT,IAAA;IAEA,MAAMG,IAAAA,GAAOC,MAAAA,CAAOD,IAAI,CAACH,KAAAA,CAAAA;AAEzB,IAAA,IAAIG,KAAKE,MAAM,KAAK,KAAKF,IAAAA,CAAKE,MAAM,IAAIP,sBAAAA,EAAwB;QAC9D,OAAO,KAAA;AACT,IAAA;IAEA,MAAMQ,yBAAAA,GAA4BH,KAAKI,KAAK,CAAC,CAACC,GAAAA,EAAKC,KAAAA,GAAUD,QAAQE,MAAAA,CAAOD,KAAAA,CAAAA,CAAAA;AAE5E,IAAA,IAAI,CAACH,yBAAAA,EAA2B;QAC9B,OAAO,KAAA;AACT,IAAA;IAEA,OAAOF,MAAAA,CAAOO,MAAM,CAACX,KAAAA,CAAAA,CAAOO,KAAK,CAAC,CAACK,KAAAA,GAAU,OAAOA,KAAAA,KAAU,QAAA,CAAA;AAChE,CAAA;AAEA,MAAMC,iCAAiC,CAACC,UAAAA,GAAAA;IACtC,MAAM,IAAIC,eAAAA,CACR,CAAC,2BAA2B,EAAED,UAAAA,CAAW,uEAAuE,EAAEhB,sBAAAA,CAAuB,EAAE,CAAC,GAC1I,6GAAA,CAAA;AAEN,CAAA;AAEA,MAAMkB,YAAY,CAACC,OAAAA,GAAAA;AACjB,IAAA,OAAO,CAAC,EAAET,GAAG,EAAEU,SAAS,EAAyC,GAAA;QAC/D,OAAO,CAACA,aAAaD,OAAAA,KAAYT,GAAAA;AACnC,IAAA,CAAA;AACF,CAAA;AAEA,MAAMW,UAAAA,GAAa,CAACnB,KAAAA,GAAiCA,KAAAA,KAAU,GAAA;AAE/D,MAAMoB,mBAAmB,CAACpB,KAAAA,GAAAA;IACxB,OAAOqB,QAAAA,CAASrB,KAAAA,CAAAA,IAAU,CAACmB,UAAAA,CAAWnB,KAAAA,CAAAA;AACxC,CAAA;AAEA,MAAMsB,gBAAgB,CAACtB,KAAAA,GACrBE,QAAQF,KAAAA,CAAAA,IAAUA,KAAAA,CAAMO,KAAK,CAACc,QAAAA,CAAAA;AAEhC,MAAME,KAAAA,GAAQ,CAACvB,KAAAA,GAAqDC,QAAAA,CAASD,KAAAA,CAAAA;AAE7E,MAAMwB,QAAAA,GAAWC,eAAAA,EAAAA,CACdC,SAAS,CAACN,gBAAAA,EAAkB,OAAOO,OAAAA,EAASC,OAAAA,EAASJ,QAAAA,EAAU,EAAEK,OAAO,EAAE,GAAA;AACzE;;;QAIA,MAAMC,iBAAiBC,qBAAAA,CAAsB;AAACP,QAAAA;AAAS,KAAA,CAAA;AACvD,IAAA,MAAMQ,iBAAAA,GAAqB,MAAMH,OAAAA,CAAQF,OAAAA,EAASC,OAAAA,EAASE,cAAAA,CAAAA;AAC3D,IAAA,MAAMG,QAAQC,qBAAAA,CAAsBF,iBAAAA,CAAAA;;;AAIpC,IAAA,OAAOC,KAAAA,GAAQA,KAAK,CAAC,CAAA,CAAE,GAAGD,iBAAAA;AAC5B,CAAA,CACA;CACCN,SAAS,CAACJ,eAAe,OAAOK,OAAAA,EAASC,SAASJ,QAAAA,EAAU,EAAEK,OAAO,EAAE,GAAA;AACtE,IAAA,MAAMC,iBAAiBC,qBAAAA,CAAsBP,QAAAA,CAAAA;AAC7C,IAAA,MAAMQ,iBAAAA,GAAqB,MAAMH,OAAAA,CAAQF,OAAAA,EAASC,OAAAA,EAASE,cAAAA,CAAAA;AAC3D,IAAA,MAAMG,QAAQC,qBAAAA,CAAsBF,iBAAAA,CAAAA;;;AAIpC,IAAA,OAAOC,KAAAA,IAASD,iBAAAA;AAClB,CAAA,CAAA,CACCN,SAAS,CAAC3B,4BAAAA,EAA8B,OAAOoC,UAAUC,QAAAA,EAAUZ,QAAAA,GAAAA;AAClEX,IAAAA,8BAAAA,CAA+BT,MAAAA,CAAOD,IAAI,CAACqB,QAAAA,CAAAA,CAAUnB,MAAM,CAAA;AAC7D,CAAA,CACA;CACCgC,KAAK,CAAClB,UAAAA,EAAY,KAAO;AACxB;;AAEC,QACDmB,SAAAA,EAAWC,QAAAA;AAEX;;;QAIAC,GAAAA,EAAK,CAACC,IAAAA,EAAMC,IAAAA,GAASA,IAAAA;AAErB;;;QAIAC,GAAAA,EAAK,CAACF,IAAAA,EAAMzC,KAAAA,GAAUA,KAAAA;AAEtB;;;AAGC,QACDG,MAAMyC,QAAAA,CAAS;AAAC,YAAA;AAAG,SAAA,CAAA;AAEnB;;AAEC,QACDC,QAAQD,QAAAA,CAASE,SAAAA;AACnB,KAAA,EAEA;AACCT,CAAAA,KAAK,CAAChB,QAAAA,EAAU,IAAA;AACf,IAAA,MAAM0B,WAAWC,KAAAA,CAAM,GAAA,CAAA;AACvB,IAAA,MAAMC,YAAYC,IAAAA,CAAK,GAAA,CAAA;IAEvB,OAAO;QACLZ,SAAAA,EAAWa,IAAAA;QAEXN,MAAAA,CAAAA,CAAOrC,GAAG,EAAEkC,IAAI,EAAA;YACd,MAAM,CAACU,IAAAA,CAAK,GAAGL,QAAAA,CAASL,IAAAA,CAAAA;YAExB,OAAOU,IAAAA,KAAS5C,MAAMsC,SAAAA,GAAYJ,IAAAA;AACpC,QAAA,CAAA;AAEAC,QAAAA,GAAAA,CAAAA,CAAInC,GAAG,EAAER,KAAK,EAAE0C,IAAI,EAAA;YAClB,MAAM,CAACU,IAAAA,CAAK,GAAGL,QAAAA,CAASL,IAAAA,CAAAA;AAExB,YAAA,IAAIU,SAAS5C,GAAAA,EAAK;gBAChB,OAAOkC,IAAAA;AACT,YAAA;YAEA,OAAOW,KAAAA,CAAMrD,UAAUsD,OAAAA,CAAQtD,KAAAA,CAAAA,GAASoD,OAAO,CAAA,EAAGA,IAAAA,CAAK,CAAC,EAAEpD,KAAAA,CAAAA,CAAO;AACnE,QAAA,CAAA;AAEAG,QAAAA,IAAAA,CAAAA,CAAKuC,IAAI,EAAA;YACP,MAAMa,CAAAA,GAAIC,MAAMT,QAAAA,CAASL,IAAAA,CAAAA,CAAAA;AACzB,YAAA,OAAOa,CAAAA,GAAI;AAACA,gBAAAA;AAAE,aAAA,GAAG,EAAE;AACrB,QAAA,CAAA;QAEAf,GAAAA,CAAAA,CAAIhC,GAAG,EAAEkC,IAAI,EAAA;AACX,YAAA,MAAM,CAACU,IAAAA,EAAM,GAAGK,IAAAA,CAAK,GAAGV,QAAAA,CAASL,IAAAA,CAAAA;YAEjC,OAAOlC,GAAAA,KAAQ4C,IAAAA,GAAOH,SAAAA,CAAUQ,IAAAA,CAAAA,GAAQX,SAAAA;AAC1C,QAAA;AACF,KAAA;AACF,CAAA,CACA;CACCT,KAAK,CAACd,KAAAA,EAAO,KAAO;QACnBe,SAAAA,EAAWoB,SAAAA;QAEXb,MAAAA,CAAAA,CAAOrC,GAAG,EAAEkC,IAAI,EAAA;;YAEd,MAAM,EAAE,CAAClC,GAAAA,GAAMmD,OAAO,EAAE,GAAGF,MAAM,GAAGf,IAAAA;YAEpC,OAAOe,IAAAA;AACT,QAAA,CAAA;AAEAd,QAAAA,GAAAA,CAAAA,CAAInC,GAAG,EAAER,KAAK,EAAE0C,IAAI,EAAA;YAClB,OAAO;AAAE,gBAAA,GAAGA,IAAI;AAAE,gBAAA,CAAClC,MAAMR;AAAM,aAAA;AACjC,QAAA,CAAA;AAEAG,QAAAA,IAAAA,CAAAA,CAAKuC,IAAI,EAAA;YACP,OAAOtC,MAAAA,CAAOD,IAAI,CAACuC,IAAAA,CAAAA;AACrB,QAAA,CAAA;QAEAF,GAAAA,CAAAA,CAAIhC,GAAG,EAAEkC,IAAI,EAAA;YACX,OAAOA,IAAI,CAAClC,GAAAA,CAAI;AAClB,QAAA;KACF,CAAA,CAAA,CACCoD,MAAM,CAAC,CAAC,EAAEpD,GAAG,EAAEU,SAAS,EAAE2C,MAAM,EAAE,GAAA;;;;;;;;;;;IAWjC,OAAO;AAAC,QAAA,MAAA;AAAQ,QAAA,SAAA;AAAW,QAAA;KAAS,CAACC,QAAQ,CAACtD,GAAAA,CAAAA,KAAS,CAACU,SAAAA,IAAa,CAAC,CAAC2C,MAAAA,EAAQ3C,SAAQ,CAAA;AACzF,CAAA,CAAA,CACC6C,EAAE;AAED/C,SAAAA,CAAU,UAAA,CAAA,EACV,OAAO,EAAER,GAAG,EAAEmB,OAAO,EAAEqC,IAAI,EAAEhE,KAAK,EAAEiE,MAAM,EAAEC,QAAQ,EAAEhD,SAAS,EAAE,EAAE,EAAEyB,GAAG,EAAEd,OAAO,EAAE,GAAA;AACjF,IAAA,MAAMgC,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;IAEtD,MAAMiD,QAAAA,GAAW,MAAMtC,OAAAA,CAAQF,OAAAA,EAAS;AAAEsC,QAAAA,MAAAA;AAAQD,QAAAA,IAAAA;AAAME,QAAAA,QAAAA;AAAUL,QAAAA;KAAO,EAAG7D,KAAAA,CAAAA;AAE5E2C,IAAAA,GAAAA,CAAInC,GAAAA,EAAK2D,QAAAA,CAAAA;AACX,CAAA,CAAA,CAEDJ,EAAE,CACD/C,SAAAA,CAAU,IAAA,CAAA,EACV,OAAO,EAAER,GAAG,EAAEmB,OAAO,EAAEqC,IAAI,EAAEhE,KAAK,EAAEkE,QAAQ,EAAEL,MAAM,EAAE,EAAE,EAAElB,GAAG,EAAEd,OAAO,EAAE,GAAA;AACtE,IAAA,MAAMuC,QAAiC,EAAC;IAExC,IAAI,CAAC7C,MAAMvB,KAAAA,CAAAA,EAAQ;AACjB,QAAA;AACF,IAAA;IAEA,KAAK,MAAM,CAACqE,GAAAA,EAAKC,WAAAA,CAAY,IAAIlE,MAAAA,CAAOmE,OAAO,CAACvE,KAAAA,CAAAA,CAAQ;AACtD,QAAA,MAAMwE,QAAQN,QAAAA,CAASG,GAAAA,CAAAA;AACvB,QAAA,MAAMI,OAAAA,GAAU;AAAE,YAAA,GAAGT,IAAI;YAAEU,GAAAA,EAAK,CAAA,EAAGV,KAAKU,GAAG,CAAC,CAAC,EAAEL,GAAAA,CAAI,CAAC;AAAE,SAAA;AAEtDD,QAAAA,KAAK,CAACC,GAAAA,CAAI,GAAG,MAAMxC,QACjBF,OAAAA,EACA;YAAEsC,MAAAA,EAAQO,KAAAA;YAAOR,IAAAA,EAAMS,OAAAA;AAASP,YAAAA,QAAAA;AAAUL,YAAAA;SAAO,EACjDS,WAAAA,CAAAA;AAEJ,IAAA;AAEA3B,IAAAA,GAAAA,CAAInC,GAAAA,EAAK4D,KAAAA,CAAAA;AACX,CAAA,CAEF;CACCO,UAAU,CACT,OAAO,EAAEnE,GAAG,EAAER,KAAK,EAAEkB,SAAS,EAAES,OAAO,EAAEqC,IAAI,EAAEC,MAAM,EAAEC,QAAQ,EAAE,EAAE,EAAEvB,GAAG,EAAEd,OAAO,EAAE,GAAA;AACjF,IAAA,IAAIwB,MAAMrD,KAAAA,CAAAA,EAAQ;AAChB,QAAA;AACF,IAAA;AAEA,IAAA,MAAM6D,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;AAEtD,IAAA,IAAI0D,6BAA6B1D,SAAAA,CAAAA,EAAY;;QAE3C,IAAI,CAACjB,QAAAA,CAASD,KAAAA,CAAAA,IAAU,EAAE,QAAQA,KAAAA,IAASC,QAAAA,CAASD,KAAAA,EAAO+D,EAAAA,CAAE,CAAA,EAAI;AAC/D,YAAA;AACF,QAAA;;QAGA,MAAMI,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;AAAEsC,YAAAA,MAAAA;AAAQD,YAAAA,IAAAA;AAAME,YAAAA,QAAAA;AAAUL,YAAAA;SAAO,EACjC;AAAEE,YAAAA,EAAAA,EAAI/D,KAAAA,EAAO+D;AAAG,SAAA,CAAA;AAGlBpB,QAAAA,GAAAA,CAAInC,GAAAA,EAAK;AAAE,YAAA,GAAGR,KAAK;AAAE,YAAA,GAAImE;AAAqC,SAAA,CAAA;AAE9D,QAAA;AACF,IAAA;IAEA,MAAMU,eAAAA,GAAkB3D,UAAU4D,MAAM;AACxC,IAAA,MAAMC,eAAeb,QAAAA,CAASW,eAAAA,CAAAA;IAE9B,MAAMV,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;QAAEsC,MAAAA,EAAQc,YAAAA;AAAcf,QAAAA,IAAAA;AAAME,QAAAA,QAAAA;AAAUL,QAAAA;KAAO,EAC/C7D,KAAAA,CAAAA;AAGF2C,IAAAA,GAAAA,CAAInC,GAAAA,EAAK2D,QAAAA,CAAAA;AACX,CAAA,CAEF;CACCa,OAAO,CAAC,OAAO,EAAExE,GAAG,EAAEwD,IAAI,EAAEC,MAAM,EAAE/C,SAAS,EAAES,OAAO,EAAE3B,KAAK,EAAEkE,QAAQ,EAAE,EAAE,EAAErC,OAAO,EAAEc,GAAG,EAAE,GAAA;AAC1F,IAAA,IAAIU,MAAMrD,KAAAA,CAAAA,EAAQ;AAChB,QAAA;AACF,IAAA;AAEA,IAAA,MAAM6D,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;AAEtD,IAAA,MAAM2D,eAAAA,GAAkB,qBAAA;AACxB,IAAA,MAAME,eAAeb,QAAAA,CAASW,eAAAA,CAAAA;IAE9B,MAAMV,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;QAAEsC,MAAAA,EAAQc,YAAAA;AAAcf,QAAAA,IAAAA;AAAME,QAAAA,QAAAA;AAAUL,QAAAA;KAAO,EAC/C7D,KAAAA,CAAAA;AAGF2C,IAAAA,GAAAA,CAAInC,GAAAA,EAAK2D,QAAAA,CAAAA;AACX,CAAA,CACA;CACCc,WAAW,CACV,OAAO,EAAEzE,GAAG,EAAER,KAAK,EAAEiE,MAAM,EAAEtC,OAAO,EAAEqC,IAAI,EAAE9C,SAAS,EAAEgD,QAAQ,EAAE,EAAE,EAAErC,OAAO,EAAEc,GAAG,EAAE,GAAA;AACjF,IAAA,IAAIU,MAAMrD,KAAAA,CAAAA,EAAQ;AAChB,QAAA;AACF,IAAA;AAEA,IAAA,MAAM6D,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;IAEtD,MAAM6D,YAAAA,GAAeb,QAAAA,CAAShD,SAAAA,CAAUgE,SAAS,CAAA;IAEjD,MAAMf,QAAAA,GAAW,MAAMtC,OAAAA,CACrBF,OAAAA,EACA;QAAEsC,MAAAA,EAAQc,YAAAA;AAAcf,QAAAA,IAAAA;AAAME,QAAAA,QAAAA;AAAUL,QAAAA;KAAO,EAC/C7D,KAAAA,CAAAA;AAGF2C,IAAAA,GAAAA,CAAInC,GAAAA,EAAK2D,QAAAA,CAAAA;AACX,CAAA,CAEF;CACCgB,aAAa,CACZ,OAAO,EAAE3E,GAAG,EAAER,KAAK,EAAEiE,MAAM,EAAEtC,OAAO,EAAEqC,IAAI,EAAE9C,SAAS,EAAEgD,QAAQ,EAAE,EAAE,EAAEvB,GAAG,EAAEd,OAAO,EAAE,GAAA;AACjF,IAAA,IAAIwB,KAAAA,CAAMrD,KAAAA,CAAAA,IAAU,CAACC,QAAAA,CAASD,KAAAA,CAAAA,EAAQ;AACpC,QAAA;AACF,IAAA;AAEA,IAAA,MAAM6D,MAAAA,GAAiB;AAAErD,QAAAA,GAAAA;AAAKwD,QAAAA,IAAAA;AAAMC,QAAAA,MAAAA;AAAQ/C,QAAAA;AAAU,KAAA;;AAGtD,IAAA,IAAI,IAAA,IAAQlB,KAAAA,IAASA,KAAAA,CAAM+D,EAAE,EAAE;QAC7B,MAAMK,KAAAA,GAAQ,MAAMvC,OAAAA,CAAQF,OAAAA,EAAS;AAAEsC,YAAAA,MAAAA;AAAQD,YAAAA,IAAAA;AAAME,YAAAA,QAAAA;AAAUL,YAAAA;SAAO,EAAG;AAAEE,YAAAA,EAAAA,EAAI/D,MAAM+D;AAAG,SAAA,CAAA;AAExFpB,QAAAA,GAAAA,CAAInC,GAAAA,EAAK4D,KAAAA,CAAAA;AACX,IAAA;AACF,CAAA,CAAA;AAGJ,4BAAegB,KAAAA,CAAM5D,QAAAA,CAAS6D,QAAQ,CAAA;AAMtC,MAAMnD,wBAAwB,CAACoD,KAAAA,GAAAA;AAC7B,IAAA,MAAMrD,QAAkB,EAAE;IAE1B,SAASoD,QAAAA,CAASE,UAA0B,EAAEC,UAAkB,EAAA;QAC9D,KAAK,MAAM,CAAChF,GAAAA,EAAKR,KAAAA,CAAM,IAAII,MAAAA,CAAOmE,OAAO,CAACgB,UAAAA,CAAAA,CAAa;AACrD,YAAA,MAAME,cAAcD,UAAAA,GAAa,CAAA,EAAGA,WAAW,CAAC,EAAEhF,KAAK,GAAGA,GAAAA;AAC1D,YAAA,IAAIR,UAAU,IAAA,EAAM;AAClBiC,gBAAAA,KAAAA,CAAMyD,IAAI,CAACD,WAAAA,CAAAA;YACb,CAAA,MAAO;gBACL,MAAME,cAAAA,GAAiB,KAAC3F,CAAwCwB,QAAQ;AAExE,gBAAA,IAAI,CAACmE,cAAAA,IAAkB,CAACN,QAAAA,CAASM,gBAAgBF,WAAAA,CAAAA,EAAc;oBAC7D,OAAO,KAAA;AACT,gBAAA;AACF,YAAA;AACF,QAAA;QAEA,OAAO,IAAA;AACT,IAAA;IAEA,IAAI,CAACJ,QAAAA,CAASC,KAAAA,EAAO,EAAA,CAAA,EAAK;QACxB,OAAOxC,SAAAA;AACT,IAAA;IAEA,OAAOb,KAAAA;AACT,CAAA;AAEA,MAAMF,wBAAwB,CAACuD,KAAAA,GAAAA;AAC7B,IAAA,MAAMM,SAAyB,EAAC;IAEhC,SAASP,QAAAA,CAASQ,MAAsB,EAAE1F,IAAc,EAAA;AACtD,QAAA,MAAM,CAACqD,KAAAA,EAAO,GAAGC,IAAAA,CAAK,GAAGtD,IAAAA;QACzB,IAAIsD,IAAAA,CAAKpD,MAAM,KAAK,CAAA,EAAG;YACrBwF,MAAM,CAACrC,MAAM,GAAG,IAAA;QAClB,CAAA,MAAO;YACL,IAAI,CAACqC,MAAM,CAACrC,KAAAA,CAAM,IAAI,OAAOqC,MAAM,CAACrC,KAAAA,CAAM,KAAK,SAAA,EAAW;gBACxDqC,MAAM,CAACrC,MAAM,GAAG;AAAEhC,oBAAAA,QAAAA,EAAU;AAAG,iBAAA;AACjC,YAAA;AACA6D,YAAAA,QAAAA,CAAS,MAAO,CAAC7B,KAAAA,CAAM,CAAkChC,QAAQ,EAAEiC,IAAAA,CAAAA;AACrE,QAAA;AACF,IAAA;IAEA6B,KAAAA,CAAMQ,OAAO,CAAC,CAACC,MAAAA,GAAWV,SAASO,MAAAA,EAAQG,MAAAA,CAAO/C,KAAK,CAAC,GAAA,CAAA,CAAA,CAAA;IAExD,OAAO4C,MAAAA;AACT,CAAA;;;;"}
|
|
1
|
+
{"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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-sort.d.ts","sourceRoot":"","sources":["../../src/traverse/query-sort.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"query-sort.d.ts","sourceRoot":"","sources":["../../src/traverse/query-sort.ts"],"names":[],"mappings":";AAyLA,wBAAoC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var sortQuery = require('../sort-query.js');
|
|
5
5
|
var factory = require('./factory.js');
|
|
6
6
|
|
|
@@ -10,29 +10,29 @@ const ORDERS = {
|
|
|
10
10
|
};
|
|
11
11
|
const ORDER_VALUES = Object.values(ORDERS);
|
|
12
12
|
const isSortOrder = (value)=>ORDER_VALUES.includes(value.toLowerCase());
|
|
13
|
-
const isStringArray = (value)=>Array.isArray(value) && value.every(
|
|
14
|
-
const isObjectArray = (value)=>Array.isArray(value) && value.every(
|
|
15
|
-
const isNestedSorts = (value)=>
|
|
16
|
-
const isObj = (value)=>
|
|
13
|
+
const isStringArray = (value)=>Array.isArray(value) && value.every(_.isString);
|
|
14
|
+
const isObjectArray = (value)=>Array.isArray(value) && value.every(_.isObject);
|
|
15
|
+
const isNestedSorts = (value)=>_.isString(value) && value.split(',').length > 1;
|
|
16
|
+
const isObj = (value)=>_.isObject(value);
|
|
17
17
|
/** Meaningless sort arrays (e.g. qs `sort[]` → `[null]`) must not be walked as `{ '0': null }`. */ const isMeaninglessSortArray = (value)=>Array.isArray(value) && !sortQuery.hasSort(value);
|
|
18
18
|
const sort = factory().intercept(isMeaninglessSortArray, async (_visitor, _options, sort)=>sort).intercept(// String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose
|
|
19
19
|
isNestedSorts, async (visitor, options, sort, { recurse })=>{
|
|
20
|
-
return Promise.all(sort.split(',').map(
|
|
20
|
+
return Promise.all(sort.split(',').map((value)=>value.trim()).map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((part)=>!_.isEmpty(part)).join(','));
|
|
21
21
|
}).intercept(// Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items
|
|
22
22
|
isStringArray, async (visitor, options, sort, { recurse })=>{
|
|
23
|
-
return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!
|
|
23
|
+
return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!_.isEmpty(nestedSort)));
|
|
24
24
|
}).intercept(// Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items
|
|
25
25
|
isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
26
|
-
return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!
|
|
26
|
+
return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!_.isEmpty(nestedSort)));
|
|
27
27
|
})// Parse string values
|
|
28
|
-
.parse(
|
|
29
|
-
const tokenize =
|
|
28
|
+
.parse(_.isString, ()=>{
|
|
29
|
+
const tokenize = (value)=>(value ?? '').split('.').flatMap((part)=>part.split(':'));
|
|
30
30
|
const recompose = (parts)=>{
|
|
31
31
|
if (parts.length === 0) {
|
|
32
32
|
return undefined;
|
|
33
33
|
}
|
|
34
34
|
return parts.reduce((acc, part)=>{
|
|
35
|
-
if (
|
|
35
|
+
if (_.isEmpty(part)) {
|
|
36
36
|
return acc;
|
|
37
37
|
}
|
|
38
38
|
if (acc === '') {
|
|
@@ -42,7 +42,7 @@ isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
|
42
42
|
}, '');
|
|
43
43
|
};
|
|
44
44
|
return {
|
|
45
|
-
transform:
|
|
45
|
+
transform: (value)=>value.trim(),
|
|
46
46
|
remove (key, data) {
|
|
47
47
|
const [root] = tokenize(data);
|
|
48
48
|
return root === key ? undefined : data;
|
|
@@ -52,10 +52,10 @@ isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
|
52
52
|
if (root !== key) {
|
|
53
53
|
return data;
|
|
54
54
|
}
|
|
55
|
-
return
|
|
55
|
+
return value == null ? root : `${root}.${value}`;
|
|
56
56
|
},
|
|
57
57
|
keys (data) {
|
|
58
|
-
const v =
|
|
58
|
+
const v = tokenize(data)[0];
|
|
59
59
|
return v ? [
|
|
60
60
|
v
|
|
61
61
|
] : [];
|
|
@@ -67,7 +67,7 @@ isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
|
67
67
|
};
|
|
68
68
|
})// Parse object values
|
|
69
69
|
.parse(isObj, ()=>({
|
|
70
|
-
transform:
|
|
70
|
+
transform: _.cloneDeep,
|
|
71
71
|
remove (key, data) {
|
|
72
72
|
// eslint-disable-next-line no-unused-vars
|
|
73
73
|
const { [key]: ignored, ...rest } = data;
|
|
@@ -140,7 +140,7 @@ isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
|
140
140
|
}, value);
|
|
141
141
|
set(key, newValue);
|
|
142
142
|
});
|
|
143
|
-
var traverseQuerySort =
|
|
143
|
+
var traverseQuerySort = _.curry(sort.traverse);
|
|
144
144
|
|
|
145
145
|
module.exports = traverseQuerySort;
|
|
146
146
|
//# sourceMappingURL=query-sort.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-sort.js","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import {\n curry,\n isString,\n isObject,\n map,\n trim,\n split,\n isEmpty,\n flatten,\n pipe,\n isNil,\n first,\n cloneDeep,\n} from 'lodash/fp';\n\nimport { hasSort } from '../sort-query';\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\n/** Meaningless sort arrays (e.g. qs `sort[]` → `[null]`) must not be walked as `{ '0': null }`. */\nconst isMeaninglessSortArray = (value: unknown): value is unknown[] =>\n Array.isArray(value) && !hasSort(value);\n\nconst sort = traverseFactory()\n .intercept(isMeaninglessSortArray, async (_visitor, _options, sort) => sort)\n .intercept(\n // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n isNestedSorts,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(\n sort\n .split(',')\n .map(trim)\n .map((nestedSort) => recurse(visitor, options, nestedSort))\n ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n }\n )\n .intercept(\n // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n isStringArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n .intercept(\n // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n isObjectArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n // Parse string values\n .parse(isString, () => {\n const tokenize = pipe(split('.'), map(split(':')), flatten);\n const recompose = (parts: string[]) => {\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.reduce((acc, part) => {\n if (isEmpty(part)) {\n return acc;\n }\n\n if (acc === '') {\n return part;\n }\n\n return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n }, '');\n };\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) ? 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 // Handle deep sort on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, getModel, schema }, { 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 // Handle deep sort on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\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 deep sort on components\n .onComponent(\n async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\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\nexport default curry(sort.traverse);\n"],"names":["ORDERS","asc","desc","ORDER_VALUES","Object","values","isSortOrder","value","includes","toLowerCase","isStringArray","Array","isArray","every","isString","isObjectArray","isObject","isNestedSorts","split","length","isObj","isMeaninglessSortArray","hasSort","sort","traverseFactory","intercept","_visitor","_options","visitor","options","recurse","Promise","all","map","trim","nestedSort","then","res","filter","part","isEmpty","join","parse","tokenize","pipe","flatten","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","isNil","keys","v","first","get","rest","cloneDeep","ignored","onRelation","attribute","path","getModel","schema","isMorphRelation","relation","startsWith","parent","targetSchemaUID","target","targetSchema","newValue","onMedia","onComponent","component","curry","traverse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-sort.js","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import { curry, isString, isObject, isEmpty, cloneDeep } from 'lodash';\n\nimport { hasSort } from '../sort-query';\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\n/** Meaningless sort arrays (e.g. qs `sort[]` → `[null]`) must not be walked as `{ '0': null }`. */\nconst isMeaninglessSortArray = (value: unknown): value is unknown[] =>\n Array.isArray(value) && !hasSort(value);\n\nconst sort = traverseFactory()\n .intercept(isMeaninglessSortArray, async (_visitor, _options, sort) => sort)\n .intercept(\n // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n isNestedSorts,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(\n sort\n .split(',')\n .map((value) => value.trim())\n .map((nestedSort) => recurse(visitor, options, nestedSort))\n ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n }\n )\n .intercept(\n // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n isStringArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n .intercept(\n // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n isObjectArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n // Parse string values\n .parse(isString, () => {\n const tokenize = (value: string | undefined) =>\n (value ?? '').split('.').flatMap((part) => part.split(':'));\n const recompose = (parts: string[]) => {\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.reduce((acc, part) => {\n if (isEmpty(part)) {\n return acc;\n }\n\n if (acc === '') {\n return part;\n }\n\n return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n }, '');\n };\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 ? 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 // Handle deep sort on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, getModel, schema }, { 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 // Handle deep sort on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\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 deep sort on components\n .onComponent(\n async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\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\nexport default curry(sort.traverse);\n"],"names":["ORDERS","asc","desc","ORDER_VALUES","Object","values","isSortOrder","value","includes","toLowerCase","isStringArray","Array","isArray","every","isString","isObjectArray","isObject","isNestedSorts","split","length","isObj","isMeaninglessSortArray","hasSort","sort","traverseFactory","intercept","_visitor","_options","visitor","options","recurse","Promise","all","map","trim","nestedSort","then","res","filter","part","isEmpty","join","parse","tokenize","flatMap","recompose","parts","undefined","reduce","acc","transform","remove","key","data","root","set","keys","v","get","rest","cloneDeep","ignored","onRelation","attribute","path","getModel","schema","isMorphRelation","relation","startsWith","parent","targetSchemaUID","target","targetSchema","newValue","onMedia","onComponent","component","curry","traverse"],"mappings":"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"}
|