@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,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isEmpty, isString, cloneDeep, curry, isObject } from 'lodash';
|
|
2
2
|
import { hasSort } from '../sort-query.mjs';
|
|
3
3
|
import traverseFactory from './factory.mjs';
|
|
4
4
|
|
|
@@ -15,7 +15,7 @@ const isObj = (value)=>isObject(value);
|
|
|
15
15
|
/** Meaningless sort arrays (e.g. qs `sort[]` → `[null]`) must not be walked as `{ '0': null }`. */ const isMeaninglessSortArray = (value)=>Array.isArray(value) && !hasSort(value);
|
|
16
16
|
const sort = traverseFactory().intercept(isMeaninglessSortArray, async (_visitor, _options, sort)=>sort).intercept(// String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose
|
|
17
17
|
isNestedSorts, async (visitor, options, sort, { recurse })=>{
|
|
18
|
-
return Promise.all(sort.split(',').map(trim).map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((part)=>!isEmpty(part)).join(','));
|
|
18
|
+
return Promise.all(sort.split(',').map((value)=>value.trim()).map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((part)=>!isEmpty(part)).join(','));
|
|
19
19
|
}).intercept(// Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items
|
|
20
20
|
isStringArray, async (visitor, options, sort, { recurse })=>{
|
|
21
21
|
return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!isEmpty(nestedSort)));
|
|
@@ -24,7 +24,7 @@ isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
|
24
24
|
return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!isEmpty(nestedSort)));
|
|
25
25
|
})// Parse string values
|
|
26
26
|
.parse(isString, ()=>{
|
|
27
|
-
const tokenize =
|
|
27
|
+
const tokenize = (value)=>(value ?? '').split('.').flatMap((part)=>part.split(':'));
|
|
28
28
|
const recompose = (parts)=>{
|
|
29
29
|
if (parts.length === 0) {
|
|
30
30
|
return undefined;
|
|
@@ -40,7 +40,7 @@ isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
|
40
40
|
}, '');
|
|
41
41
|
};
|
|
42
42
|
return {
|
|
43
|
-
transform: trim,
|
|
43
|
+
transform: (value)=>value.trim(),
|
|
44
44
|
remove (key, data) {
|
|
45
45
|
const [root] = tokenize(data);
|
|
46
46
|
return root === key ? undefined : data;
|
|
@@ -50,10 +50,10 @@ isObjectArray, async (visitor, options, sort, { recurse })=>{
|
|
|
50
50
|
if (root !== key) {
|
|
51
51
|
return data;
|
|
52
52
|
}
|
|
53
|
-
return
|
|
53
|
+
return value == null ? root : `${root}.${value}`;
|
|
54
54
|
},
|
|
55
55
|
keys (data) {
|
|
56
|
-
const v =
|
|
56
|
+
const v = tokenize(data)[0];
|
|
57
57
|
return v ? [
|
|
58
58
|
v
|
|
59
59
|
] : [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-sort.mjs","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.mjs","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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-entity.d.ts","sourceRoot":"","sources":["../src/traverse-entity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAoBpE,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACxB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC;AAE3F,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,4GAA4G;IAC5G,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"traverse-entity.d.ts","sourceRoot":"","sources":["../src/traverse-entity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAoBpE,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACxB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC;AAE3F,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAC7B,4GAA4G;IAC5G,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,MAAM;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;CACf;AAkPD,QAAA,MAAM,kBAAkB,GAAI,UAAU;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE;gBACtC,MAAM;aAIT,MAAM,SAAS,IAAI;CAG5B,CAAC;;AAEH,wBAAqC"}
|
package/dist/traverse-entity.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var contentTypes = require('./content-types.js');
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -71,7 +71,7 @@ const traverseEntity = async (visitor, options, entity)=>{
|
|
|
71
71
|
// created inline inside a dynamic zone component can leave a null item).
|
|
72
72
|
// Reading `__component` on it crashed traversal; pass nil entries through
|
|
73
73
|
// untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)
|
|
74
|
-
if (
|
|
74
|
+
if (entry == null) {
|
|
75
75
|
return entry;
|
|
76
76
|
}
|
|
77
77
|
const targetSchema = getModel(entry.__component);
|
|
@@ -85,12 +85,12 @@ const traverseEntity = async (visitor, options, entity)=>{
|
|
|
85
85
|
return traverseEntity(visitor, traverseOptions, entry);
|
|
86
86
|
};
|
|
87
87
|
// End recursion
|
|
88
|
-
if (!
|
|
88
|
+
if (!_.isObject(entity) || schema == null) {
|
|
89
89
|
return entity;
|
|
90
90
|
}
|
|
91
91
|
// Don't mutate the original entity object
|
|
92
92
|
// only clone at 1st level as the next level will get clone when traversed
|
|
93
|
-
const copy =
|
|
93
|
+
const copy = _.clone(entity);
|
|
94
94
|
const visitorUtils = createVisitorUtils({
|
|
95
95
|
data: copy
|
|
96
96
|
});
|
|
@@ -102,10 +102,10 @@ const traverseEntity = async (visitor, options, entity)=>{
|
|
|
102
102
|
const newPath = {
|
|
103
103
|
...path
|
|
104
104
|
};
|
|
105
|
-
newPath.raw =
|
|
106
|
-
newPath.rawWithIndices =
|
|
107
|
-
if (
|
|
108
|
-
newPath.attribute =
|
|
105
|
+
newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;
|
|
106
|
+
newPath.rawWithIndices = path.rawWithIndices == null ? key : `${path.rawWithIndices}.${key}`;
|
|
107
|
+
if (attribute != null) {
|
|
108
|
+
newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;
|
|
109
109
|
}
|
|
110
110
|
// Visit the current attribute
|
|
111
111
|
const visitorOptions = {
|
|
@@ -131,7 +131,7 @@ const traverseEntity = async (visitor, options, entity)=>{
|
|
|
131
131
|
// Extract the value for the current key (after calling the visitor)
|
|
132
132
|
const value = copy[key];
|
|
133
133
|
// Ignore Nil values or attributes
|
|
134
|
-
if (
|
|
134
|
+
if (value == null || attribute == null) {
|
|
135
135
|
continue;
|
|
136
136
|
}
|
|
137
137
|
if (contentTypes.isRelationalAttribute(attribute)) {
|
|
@@ -143,12 +143,12 @@ const traverseEntity = async (visitor, options, entity)=>{
|
|
|
143
143
|
};
|
|
144
144
|
const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
|
|
145
145
|
const method = isMorphRelation ? traverseMorphRelationTarget : traverseRelationTarget(getModel(attribute.target));
|
|
146
|
-
if (
|
|
146
|
+
if (Array.isArray(value)) {
|
|
147
147
|
// Process array items in parallel with ordered error handling
|
|
148
148
|
copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
|
|
149
149
|
const arrayPath = {
|
|
150
150
|
...newPath,
|
|
151
|
-
rawWithIndices:
|
|
151
|
+
rawWithIndices: newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`
|
|
152
152
|
};
|
|
153
153
|
return method(visitor, arrayPath, item);
|
|
154
154
|
}));
|
|
@@ -164,12 +164,12 @@ const traverseEntity = async (visitor, options, entity)=>{
|
|
|
164
164
|
attribute,
|
|
165
165
|
path: newPath
|
|
166
166
|
};
|
|
167
|
-
if (
|
|
167
|
+
if (Array.isArray(value)) {
|
|
168
168
|
// Process media array items in parallel with ordered error handling
|
|
169
169
|
copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
|
|
170
170
|
const arrayPath = {
|
|
171
171
|
...newPath,
|
|
172
|
-
rawWithIndices:
|
|
172
|
+
rawWithIndices: newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`
|
|
173
173
|
};
|
|
174
174
|
return traverseMediaTarget(visitor, arrayPath, item);
|
|
175
175
|
}));
|
|
@@ -186,12 +186,12 @@ const traverseEntity = async (visitor, options, entity)=>{
|
|
|
186
186
|
path: newPath
|
|
187
187
|
};
|
|
188
188
|
const targetSchema = getModel(attribute.component);
|
|
189
|
-
if (
|
|
189
|
+
if (Array.isArray(value)) {
|
|
190
190
|
// Process component array items in parallel with ordered error handling
|
|
191
191
|
copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
|
|
192
192
|
const arrayPath = {
|
|
193
193
|
...newPath,
|
|
194
|
-
rawWithIndices:
|
|
194
|
+
rawWithIndices: newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`
|
|
195
195
|
};
|
|
196
196
|
return traverseComponent(visitor, arrayPath, targetSchema, item);
|
|
197
197
|
}));
|
|
@@ -200,7 +200,7 @@ const traverseEntity = async (visitor, options, entity)=>{
|
|
|
200
200
|
}
|
|
201
201
|
continue;
|
|
202
202
|
}
|
|
203
|
-
if (attribute.type === 'dynamiczone' &&
|
|
203
|
+
if (attribute.type === 'dynamiczone' && Array.isArray(value)) {
|
|
204
204
|
parent = {
|
|
205
205
|
schema,
|
|
206
206
|
key,
|
|
@@ -211,7 +211,7 @@ const traverseEntity = async (visitor, options, entity)=>{
|
|
|
211
211
|
copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
|
|
212
212
|
const arrayPath = {
|
|
213
213
|
...newPath,
|
|
214
|
-
rawWithIndices:
|
|
214
|
+
rawWithIndices: newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`
|
|
215
215
|
};
|
|
216
216
|
return visitDynamicZoneEntry(visitor, arrayPath, item);
|
|
217
217
|
}));
|
|
@@ -228,7 +228,7 @@ const createVisitorUtils = ({ data })=>({
|
|
|
228
228
|
data[key] = value;
|
|
229
229
|
}
|
|
230
230
|
});
|
|
231
|
-
var traverseEntity$1 =
|
|
231
|
+
var traverseEntity$1 = _.curry(traverseEntity);
|
|
232
232
|
|
|
233
233
|
module.exports = traverseEntity$1;
|
|
234
234
|
//# sourceMappingURL=traverse-entity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-entity.js","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (\n visitor: Visitor,\n options: TraverseOptions,\n entity: Data\n): Promise<Data> => {\n const {\n path = { raw: null, attribute: null, rawWithIndices: null },\n schema,\n getModel,\n allowedExtraRootKeys,\n } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n // A dynamic zone array can contain a `null` entry (for example a relation\n // created inline inside a dynamic zone component can leave a null item).\n // Reading `__component` on it crashed traversal; pass nil entries through\n // untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)\n if (isNil(entry)) {\n return entry;\n }\n\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = isNil(path.rawWithIndices) ? key : `${path.rawWithIndices}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n // Awaited only when the visitor actually returns something thenable. Most visitors\n // finish synchronously for most keys — a scalar is not a relation, so the relation\n // visitor returns immediately — and `await` on a non-thenable still allocates a\n // promise and defers the rest of the loop to a microtask. Over every key of every\n // node of every entity in a page that was the largest single source of promise churn.\n const visited = visitor(visitorOptions, visitorUtils) as unknown;\n\n if (visited != null && typeof (visited as PromiseLike<void>).then === 'function') {\n await visited;\n }\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","allowedExtraRootKeys","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","isNil","__component","isObject","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","visited","then","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traverse-entity.js","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, curry } from 'lodash';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (\n visitor: Visitor,\n options: TraverseOptions,\n entity: Data\n): Promise<Data> => {\n const {\n path = { raw: null, attribute: null, rawWithIndices: null },\n schema,\n getModel,\n allowedExtraRootKeys,\n } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n // A dynamic zone array can contain a `null` entry (for example a relation\n // created inline inside a dynamic zone component can leave a null item).\n // Reading `__component` on it crashed traversal; pass nil entries through\n // untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)\n if (entry == null) {\n return entry;\n }\n\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || schema == null) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = path.rawWithIndices == null ? key : `${path.rawWithIndices}.${key}`;\n\n if (attribute != null) {\n newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n // Awaited only when the visitor actually returns something thenable. Most visitors\n // finish synchronously for most keys — a scalar is not a relation, so the relation\n // visitor returns immediately — and `await` on a non-thenable still allocates a\n // promise and defers the rest of the loop to a microtask. Over every key of every\n // node of every entity in a page that was the largest single source of promise churn.\n const visited = visitor(visitorOptions, visitorUtils) as unknown;\n\n if (visited != null && typeof (visited as PromiseLike<void>).then === 'function') {\n await visited;\n }\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (value == null || attribute == null) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (Array.isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (Array.isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (Array.isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","allowedExtraRootKeys","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","visited","then","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","Array","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|
package/dist/traverse-entity.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { curry, isObject,
|
|
1
|
+
import { curry, isObject, clone } from 'lodash';
|
|
2
2
|
import { isRelationalAttribute, isMediaAttribute } from './content-types.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -69,7 +69,7 @@ const traverseEntity$1 = async (visitor, options, entity)=>{
|
|
|
69
69
|
// created inline inside a dynamic zone component can leave a null item).
|
|
70
70
|
// Reading `__component` on it crashed traversal; pass nil entries through
|
|
71
71
|
// untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)
|
|
72
|
-
if (
|
|
72
|
+
if (entry == null) {
|
|
73
73
|
return entry;
|
|
74
74
|
}
|
|
75
75
|
const targetSchema = getModel(entry.__component);
|
|
@@ -83,7 +83,7 @@ const traverseEntity$1 = async (visitor, options, entity)=>{
|
|
|
83
83
|
return traverseEntity$1(visitor, traverseOptions, entry);
|
|
84
84
|
};
|
|
85
85
|
// End recursion
|
|
86
|
-
if (!isObject(entity) ||
|
|
86
|
+
if (!isObject(entity) || schema == null) {
|
|
87
87
|
return entity;
|
|
88
88
|
}
|
|
89
89
|
// Don't mutate the original entity object
|
|
@@ -100,10 +100,10 @@ const traverseEntity$1 = async (visitor, options, entity)=>{
|
|
|
100
100
|
const newPath = {
|
|
101
101
|
...path
|
|
102
102
|
};
|
|
103
|
-
newPath.raw =
|
|
104
|
-
newPath.rawWithIndices =
|
|
105
|
-
if (
|
|
106
|
-
newPath.attribute =
|
|
103
|
+
newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;
|
|
104
|
+
newPath.rawWithIndices = path.rawWithIndices == null ? key : `${path.rawWithIndices}.${key}`;
|
|
105
|
+
if (attribute != null) {
|
|
106
|
+
newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;
|
|
107
107
|
}
|
|
108
108
|
// Visit the current attribute
|
|
109
109
|
const visitorOptions = {
|
|
@@ -129,7 +129,7 @@ const traverseEntity$1 = async (visitor, options, entity)=>{
|
|
|
129
129
|
// Extract the value for the current key (after calling the visitor)
|
|
130
130
|
const value = copy[key];
|
|
131
131
|
// Ignore Nil values or attributes
|
|
132
|
-
if (
|
|
132
|
+
if (value == null || attribute == null) {
|
|
133
133
|
continue;
|
|
134
134
|
}
|
|
135
135
|
if (isRelationalAttribute(attribute)) {
|
|
@@ -141,12 +141,12 @@ const traverseEntity$1 = async (visitor, options, entity)=>{
|
|
|
141
141
|
};
|
|
142
142
|
const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
|
|
143
143
|
const method = isMorphRelation ? traverseMorphRelationTarget : traverseRelationTarget(getModel(attribute.target));
|
|
144
|
-
if (isArray(value)) {
|
|
144
|
+
if (Array.isArray(value)) {
|
|
145
145
|
// Process array items in parallel with ordered error handling
|
|
146
146
|
copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
|
|
147
147
|
const arrayPath = {
|
|
148
148
|
...newPath,
|
|
149
|
-
rawWithIndices:
|
|
149
|
+
rawWithIndices: newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`
|
|
150
150
|
};
|
|
151
151
|
return method(visitor, arrayPath, item);
|
|
152
152
|
}));
|
|
@@ -162,12 +162,12 @@ const traverseEntity$1 = async (visitor, options, entity)=>{
|
|
|
162
162
|
attribute,
|
|
163
163
|
path: newPath
|
|
164
164
|
};
|
|
165
|
-
if (isArray(value)) {
|
|
165
|
+
if (Array.isArray(value)) {
|
|
166
166
|
// Process media array items in parallel with ordered error handling
|
|
167
167
|
copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
|
|
168
168
|
const arrayPath = {
|
|
169
169
|
...newPath,
|
|
170
|
-
rawWithIndices:
|
|
170
|
+
rawWithIndices: newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`
|
|
171
171
|
};
|
|
172
172
|
return traverseMediaTarget(visitor, arrayPath, item);
|
|
173
173
|
}));
|
|
@@ -184,12 +184,12 @@ const traverseEntity$1 = async (visitor, options, entity)=>{
|
|
|
184
184
|
path: newPath
|
|
185
185
|
};
|
|
186
186
|
const targetSchema = getModel(attribute.component);
|
|
187
|
-
if (isArray(value)) {
|
|
187
|
+
if (Array.isArray(value)) {
|
|
188
188
|
// Process component array items in parallel with ordered error handling
|
|
189
189
|
copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
|
|
190
190
|
const arrayPath = {
|
|
191
191
|
...newPath,
|
|
192
|
-
rawWithIndices:
|
|
192
|
+
rawWithIndices: newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`
|
|
193
193
|
};
|
|
194
194
|
return traverseComponent(visitor, arrayPath, targetSchema, item);
|
|
195
195
|
}));
|
|
@@ -198,7 +198,7 @@ const traverseEntity$1 = async (visitor, options, entity)=>{
|
|
|
198
198
|
}
|
|
199
199
|
continue;
|
|
200
200
|
}
|
|
201
|
-
if (attribute.type === 'dynamiczone' && isArray(value)) {
|
|
201
|
+
if (attribute.type === 'dynamiczone' && Array.isArray(value)) {
|
|
202
202
|
parent = {
|
|
203
203
|
schema,
|
|
204
204
|
key,
|
|
@@ -209,7 +209,7 @@ const traverseEntity$1 = async (visitor, options, entity)=>{
|
|
|
209
209
|
copy[key] = await parallelWithOrderedErrors(value.map((item, i)=>{
|
|
210
210
|
const arrayPath = {
|
|
211
211
|
...newPath,
|
|
212
|
-
rawWithIndices:
|
|
212
|
+
rawWithIndices: newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`
|
|
213
213
|
};
|
|
214
214
|
return visitDynamicZoneEntry(visitor, arrayPath, item);
|
|
215
215
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-entity.mjs","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (\n visitor: Visitor,\n options: TraverseOptions,\n entity: Data\n): Promise<Data> => {\n const {\n path = { raw: null, attribute: null, rawWithIndices: null },\n schema,\n getModel,\n allowedExtraRootKeys,\n } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n // A dynamic zone array can contain a `null` entry (for example a relation\n // created inline inside a dynamic zone component can leave a null item).\n // Reading `__component` on it crashed traversal; pass nil entries through\n // untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)\n if (isNil(entry)) {\n return entry;\n }\n\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = isNil(path.rawWithIndices) ? key : `${path.rawWithIndices}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n // Awaited only when the visitor actually returns something thenable. Most visitors\n // finish synchronously for most keys — a scalar is not a relation, so the relation\n // visitor returns immediately — and `await` on a non-thenable still allocates a\n // promise and defers the rest of the loop to a microtask. Over every key of every\n // node of every entity in a page that was the largest single source of promise churn.\n const visited = visitor(visitorOptions, visitorUtils) as unknown;\n\n if (visited != null && typeof (visited as PromiseLike<void>).then === 'function') {\n await visited;\n }\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices: isNil(newPath.rawWithIndices)\n ? `${i}`\n : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","allowedExtraRootKeys","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","isNil","__component","isObject","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","visited","then","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traverse-entity.mjs","sources":["../src/traverse-entity.ts"],"sourcesContent":["import { clone, isObject, curry } from 'lodash';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\n/**\n * Execute promises in parallel but throw errors in array index order.\n */\nconst parallelWithOrderedErrors = async <T>(promises: Promise<T>[]): Promise<T[]> => {\n const results = await Promise.allSettled(promises);\n\n // Throw first error in array index order (matches sequential behavior)\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (result.status === 'rejected') {\n throw result.reason;\n }\n }\n\n return results.map((r) => (r as PromiseFulfilledResult<T>).value);\n};\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n rawWithIndices?: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n /** Extra root-level keys allowed (e.g. registered input params). Only used when path.attribute === null. */\n allowedExtraRootKeys?: string[];\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (\n visitor: Visitor,\n options: TraverseOptions,\n entity: Data\n): Promise<Data> => {\n const {\n path = { raw: null, attribute: null, rawWithIndices: null },\n schema,\n getModel,\n allowedExtraRootKeys,\n } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = {\n schema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n // A dynamic zone array can contain a `null` entry (for example a relation\n // created inline inside a dynamic zone component can leave a null item).\n // Reading `__component` on it crashed traversal; pass nil entries through\n // untouched, consistent with how `traverseEntity` ends recursion on nil. (#24303)\n if (entry == null) {\n return entry;\n }\n\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = {\n schema: targetSchema,\n path,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || schema == null) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = path.raw == null ? key : `${path.raw}.${key}`;\n newPath.rawWithIndices = path.rawWithIndices == null ? key : `${path.rawWithIndices}.${key}`;\n\n if (attribute != null) {\n newPath.attribute = path.attribute == null ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n allowedExtraRootKeys,\n };\n\n // Awaited only when the visitor actually returns something thenable. Most visitors\n // finish synchronously for most keys — a scalar is not a relation, so the relation\n // visitor returns immediately — and `await` on a non-thenable still allocates a\n // promise and defers the rest of the loop to a microtask. Over every key of every\n // node of every entity in a page that was the largest single source of promise churn.\n const visited = visitor(visitorOptions, visitorUtils) as unknown;\n\n if (visited != null && typeof (visited as PromiseLike<void>).then === 'function') {\n await visited;\n }\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (value == null || attribute == null) {\n continue;\n }\n\n if (isRelationalAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (Array.isArray(value)) {\n // Process array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return method(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n parent = { schema, key, attribute, path: newPath };\n\n if (Array.isArray(value)) {\n // Process media array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseMediaTarget(visitor, arrayPath, item);\n })\n );\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n parent = { schema, key, attribute, path: newPath };\n const targetSchema = getModel(attribute.component);\n\n if (Array.isArray(value)) {\n // Process component array items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return traverseComponent(visitor, arrayPath, targetSchema, item);\n })\n );\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n parent = { schema, key, attribute, path: newPath };\n\n // Process dynamic zone items in parallel with ordered error handling\n copy[key] = await parallelWithOrderedErrors(\n value.map((item, i) => {\n const arrayPath = {\n ...newPath,\n rawWithIndices:\n newPath.rawWithIndices == null ? `${i}` : `${newPath.rawWithIndices}.${i}`,\n };\n return visitDynamicZoneEntry(visitor, arrayPath, item);\n })\n );\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n"],"names":["parallelWithOrderedErrors","promises","results","Promise","allSettled","i","length","result","status","reason","map","r","value","traverseEntity","visitor","options","entity","path","raw","attribute","rawWithIndices","schema","getModel","allowedExtraRootKeys","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","key","attributes","newPath","visitorOptions","visited","then","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","Array","isArray","item","arrayPath","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAY,MAAM,QAAQ,CAAC;AAKpD,OAAO,EACL,KAAK,SAAS,EAGf,MAAM,6BAA6B,CAAC;AAIrC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAK3C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAMvC,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,MAAM,EAAE,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;CACxD;AACD,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,KAAK,EACb,OAAO,CAAC,EAAE,OAAO,KACd,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,wBAAwB,GAAG,CACrC,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,KAAK,EACb,OAAO,CAAC,EAAE,OAAO,KACd,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,UAAU,UAAU;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,QAAA,MAAM,mBAAmB,GAAI,MAAM,UAAU;;mBA8FlC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UACtB,KAAK,kCAC0B,OAAO;;;;;CAsKjD,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
|
package/dist/validate/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var contentTypes = require('../content-types.js');
|
|
5
5
|
var contentApiConstants = require('../content-api-constants.js');
|
|
6
6
|
var contentApiRouteParams = require('../content-api-route-params.js');
|
|
@@ -27,7 +27,7 @@ const createAPIValidators = (opts)=>{
|
|
|
27
27
|
if (!schema) {
|
|
28
28
|
throw new Error('Missing schema in validateInput');
|
|
29
29
|
}
|
|
30
|
-
if (
|
|
30
|
+
if (Array.isArray(data)) {
|
|
31
31
|
await Promise.all(data.map((entry)=>validateInput(entry, schema, options)));
|
|
32
32
|
return;
|
|
33
33
|
}
|
|
@@ -35,7 +35,7 @@ const createAPIValidators = (opts)=>{
|
|
|
35
35
|
const nonWritableAttributes = contentTypes.getNonWritableAttributes(schema);
|
|
36
36
|
const transforms = [
|
|
37
37
|
(data)=>{
|
|
38
|
-
if (
|
|
38
|
+
if (_.isObject(data)) {
|
|
39
39
|
if (ID_ATTRIBUTE in data) {
|
|
40
40
|
utils.throwInvalidKey({
|
|
41
41
|
key: ID_ATTRIBUTE
|
|
@@ -80,7 +80,7 @@ const createAPIValidators = (opts)=>{
|
|
|
80
80
|
// the main document payload is already validated above by traverseEntity (throwUnrecognizedFields, etc.);
|
|
81
81
|
// relation ops (connect/disconnect/set) are handled there, not by the route's Zod schema. We only run
|
|
82
82
|
// Zod here for truly extra root keys added via addInputParams (e.g. clientMutationId).
|
|
83
|
-
if (
|
|
83
|
+
if (_.isObject(data) && route?.request?.body?.['application/json']) {
|
|
84
84
|
const bodySchema = route.request.body['application/json'];
|
|
85
85
|
if (typeof bodySchema === 'object' && 'shape' in bodySchema) {
|
|
86
86
|
const shape = bodySchema.shape;
|
|
@@ -183,7 +183,7 @@ const createAPIValidators = (opts)=>{
|
|
|
183
183
|
if (!schema) {
|
|
184
184
|
throw new Error('Missing schema in validateFilters');
|
|
185
185
|
}
|
|
186
|
-
if (
|
|
186
|
+
if (Array.isArray(filters)) {
|
|
187
187
|
await Promise.all(filters.map((filter)=>validateFilters(filter, schema, {
|
|
188
188
|
auth
|
|
189
189
|
})));
|