@strapi/utils 5.12.1 → 5.12.3

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.
Files changed (233) hide show
  1. package/dist/async.js +28 -0
  2. package/dist/async.js.map +1 -0
  3. package/dist/async.mjs +24 -0
  4. package/dist/async.mjs.map +1 -0
  5. package/dist/content-types.js +201 -0
  6. package/dist/content-types.js.map +1 -0
  7. package/dist/content-types.mjs +167 -0
  8. package/dist/content-types.mjs.map +1 -0
  9. package/dist/convert-query-params.js +512 -0
  10. package/dist/convert-query-params.js.map +1 -0
  11. package/dist/convert-query-params.mjs +510 -0
  12. package/dist/convert-query-params.mjs.map +1 -0
  13. package/dist/env-helper.js +81 -0
  14. package/dist/env-helper.js.map +1 -0
  15. package/dist/env-helper.mjs +79 -0
  16. package/dist/env-helper.mjs.map +1 -0
  17. package/dist/errors.js +104 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/errors.mjs +88 -0
  20. package/dist/errors.mjs.map +1 -0
  21. package/dist/file.js +57 -0
  22. package/dist/file.js.map +1 -0
  23. package/dist/file.mjs +50 -0
  24. package/dist/file.mjs.map +1 -0
  25. package/dist/format-yup-error.js +19 -0
  26. package/dist/format-yup-error.js.map +1 -0
  27. package/dist/format-yup-error.mjs +17 -0
  28. package/dist/format-yup-error.mjs.map +1 -0
  29. package/dist/hooks.js +86 -0
  30. package/dist/hooks.js.map +1 -0
  31. package/dist/hooks.mjs +80 -0
  32. package/dist/hooks.mjs.map +1 -0
  33. package/dist/import-default.js +9 -0
  34. package/dist/import-default.js.map +1 -0
  35. package/dist/import-default.mjs +7 -0
  36. package/dist/import-default.mjs.map +1 -0
  37. package/dist/index.js +54 -4358
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.mjs +48 -4317
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/machine-id.js +17 -0
  42. package/dist/machine-id.js.map +1 -0
  43. package/dist/machine-id.mjs +15 -0
  44. package/dist/machine-id.mjs.map +1 -0
  45. package/dist/operators.js +79 -0
  46. package/dist/operators.js.map +1 -0
  47. package/dist/operators.mjs +76 -0
  48. package/dist/operators.mjs.map +1 -0
  49. package/dist/package-manager.js +36 -0
  50. package/dist/package-manager.js.map +1 -0
  51. package/dist/package-manager.mjs +33 -0
  52. package/dist/package-manager.mjs.map +1 -0
  53. package/dist/pagination.js +163 -0
  54. package/dist/pagination.js.map +1 -0
  55. package/dist/pagination.mjs +159 -0
  56. package/dist/pagination.mjs.map +1 -0
  57. package/dist/parse-type.js +140 -0
  58. package/dist/parse-type.js.map +1 -0
  59. package/dist/parse-type.mjs +118 -0
  60. package/dist/parse-type.mjs.map +1 -0
  61. package/dist/policy.js +33 -0
  62. package/dist/policy.js.map +1 -0
  63. package/dist/policy.mjs +30 -0
  64. package/dist/policy.mjs.map +1 -0
  65. package/dist/primitives/arrays.js +7 -0
  66. package/dist/primitives/arrays.js.map +1 -0
  67. package/dist/primitives/arrays.mjs +5 -0
  68. package/dist/primitives/arrays.mjs.map +1 -0
  69. package/dist/primitives/dates.js +11 -0
  70. package/dist/primitives/dates.js.map +1 -0
  71. package/dist/primitives/dates.mjs +9 -0
  72. package/dist/primitives/dates.mjs.map +1 -0
  73. package/dist/primitives/objects.js +13 -0
  74. package/dist/primitives/objects.js.map +1 -0
  75. package/dist/primitives/objects.mjs +11 -0
  76. package/dist/primitives/objects.mjs.map +1 -0
  77. package/dist/primitives/strings.js +49 -0
  78. package/dist/primitives/strings.js.map +1 -0
  79. package/dist/primitives/strings.mjs +38 -0
  80. package/dist/primitives/strings.mjs.map +1 -0
  81. package/dist/print-value.js +42 -0
  82. package/dist/print-value.js.map +1 -0
  83. package/dist/print-value.mjs +40 -0
  84. package/dist/print-value.mjs.map +1 -0
  85. package/dist/provider-factory.js +82 -0
  86. package/dist/provider-factory.js.map +1 -0
  87. package/dist/provider-factory.mjs +80 -0
  88. package/dist/provider-factory.mjs.map +1 -0
  89. package/dist/relations.js +54 -0
  90. package/dist/relations.js.map +1 -0
  91. package/dist/relations.mjs +45 -0
  92. package/dist/relations.mjs.map +1 -0
  93. package/dist/sanitize/index.js +195 -0
  94. package/dist/sanitize/index.js.map +1 -0
  95. package/dist/sanitize/index.mjs +194 -0
  96. package/dist/sanitize/index.mjs.map +1 -0
  97. package/dist/sanitize/sanitizers.js +173 -0
  98. package/dist/sanitize/sanitizers.js.map +1 -0
  99. package/dist/sanitize/sanitizers.mjs +166 -0
  100. package/dist/sanitize/sanitizers.mjs.map +1 -0
  101. package/dist/sanitize/visitors/expand-wildcard-populate.js +20 -0
  102. package/dist/sanitize/visitors/expand-wildcard-populate.js.map +1 -0
  103. package/dist/sanitize/visitors/expand-wildcard-populate.mjs +18 -0
  104. package/dist/sanitize/visitors/expand-wildcard-populate.mjs.map +1 -0
  105. package/dist/sanitize/visitors/index.js +22 -0
  106. package/dist/sanitize/visitors/index.js.map +1 -0
  107. package/dist/sanitize/visitors/index.mjs +9 -0
  108. package/dist/sanitize/visitors/index.mjs.map +1 -0
  109. package/dist/sanitize/visitors/remove-disallowed-fields.js +87 -0
  110. package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -0
  111. package/dist/sanitize/visitors/remove-disallowed-fields.mjs +85 -0
  112. package/dist/sanitize/visitors/remove-disallowed-fields.mjs.map +1 -0
  113. package/dist/sanitize/visitors/remove-dynamic-zones.js +12 -0
  114. package/dist/sanitize/visitors/remove-dynamic-zones.js.map +1 -0
  115. package/dist/sanitize/visitors/remove-dynamic-zones.mjs +10 -0
  116. package/dist/sanitize/visitors/remove-dynamic-zones.mjs.map +1 -0
  117. package/dist/sanitize/visitors/remove-morph-to-relations.js +12 -0
  118. package/dist/sanitize/visitors/remove-morph-to-relations.js.map +1 -0
  119. package/dist/sanitize/visitors/remove-morph-to-relations.mjs +10 -0
  120. package/dist/sanitize/visitors/remove-morph-to-relations.mjs.map +1 -0
  121. package/dist/sanitize/visitors/remove-password.js +10 -0
  122. package/dist/sanitize/visitors/remove-password.js.map +1 -0
  123. package/dist/sanitize/visitors/remove-password.mjs +8 -0
  124. package/dist/sanitize/visitors/remove-password.mjs.map +1 -0
  125. package/dist/sanitize/visitors/remove-private.js +16 -0
  126. package/dist/sanitize/visitors/remove-private.js.map +1 -0
  127. package/dist/sanitize/visitors/remove-private.mjs +14 -0
  128. package/dist/sanitize/visitors/remove-private.mjs.map +1 -0
  129. package/dist/sanitize/visitors/remove-restricted-fields.js +28 -0
  130. package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -0
  131. package/dist/sanitize/visitors/remove-restricted-fields.mjs +26 -0
  132. package/dist/sanitize/visitors/remove-restricted-fields.mjs.map +1 -0
  133. package/dist/sanitize/visitors/remove-restricted-relations.js +116 -0
  134. package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -0
  135. package/dist/sanitize/visitors/remove-restricted-relations.mjs +114 -0
  136. package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -0
  137. package/dist/set-creator-fields.js +18 -0
  138. package/dist/set-creator-fields.js.map +1 -0
  139. package/dist/set-creator-fields.mjs +16 -0
  140. package/dist/set-creator-fields.mjs.map +1 -0
  141. package/dist/template.js +18 -0
  142. package/dist/template.js.map +1 -0
  143. package/dist/template.mjs +15 -0
  144. package/dist/template.mjs.map +1 -0
  145. package/dist/traverse/factory.js +158 -0
  146. package/dist/traverse/factory.js.map +1 -0
  147. package/dist/traverse/factory.mjs +156 -0
  148. package/dist/traverse/factory.mjs.map +1 -0
  149. package/dist/traverse/index.js +14 -0
  150. package/dist/traverse/index.js.map +1 -0
  151. package/dist/traverse/index.mjs +5 -0
  152. package/dist/traverse/index.mjs.map +1 -0
  153. package/dist/traverse/query-fields.js +41 -0
  154. package/dist/traverse/query-fields.js.map +1 -0
  155. package/dist/traverse/query-fields.mjs +39 -0
  156. package/dist/traverse/query-fields.mjs.map +1 -0
  157. package/dist/traverse/query-filters.js +114 -0
  158. package/dist/traverse/query-filters.js.map +1 -0
  159. package/dist/traverse/query-filters.mjs +112 -0
  160. package/dist/traverse/query-filters.mjs.map +1 -0
  161. package/dist/traverse/query-populate.js +280 -0
  162. package/dist/traverse/query-populate.js.map +1 -0
  163. package/dist/traverse/query-populate.mjs +278 -0
  164. package/dist/traverse/query-populate.mjs.map +1 -0
  165. package/dist/traverse/query-sort.js +144 -0
  166. package/dist/traverse/query-sort.js.map +1 -0
  167. package/dist/traverse/query-sort.mjs +142 -0
  168. package/dist/traverse/query-sort.mjs.map +1 -0
  169. package/dist/traverse-entity.js +170 -0
  170. package/dist/traverse-entity.js.map +1 -0
  171. package/dist/traverse-entity.mjs +168 -0
  172. package/dist/traverse-entity.mjs.map +1 -0
  173. package/dist/validate/index.js +218 -0
  174. package/dist/validate/index.js.map +1 -0
  175. package/dist/validate/index.mjs +217 -0
  176. package/dist/validate/index.mjs.map +1 -0
  177. package/dist/validate/utils.js +27 -0
  178. package/dist/validate/utils.js.map +1 -0
  179. package/dist/validate/utils.mjs +24 -0
  180. package/dist/validate/utils.mjs.map +1 -0
  181. package/dist/validate/validators.js +369 -0
  182. package/dist/validate/validators.js.map +1 -0
  183. package/dist/validate/validators.mjs +356 -0
  184. package/dist/validate/validators.mjs.map +1 -0
  185. package/dist/validate/visitors/index.js +22 -0
  186. package/dist/validate/visitors/index.js.map +1 -0
  187. package/dist/validate/visitors/index.mjs +9 -0
  188. package/dist/validate/visitors/index.mjs.map +1 -0
  189. package/dist/validate/visitors/throw-disallowed-fields.js +91 -0
  190. package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -0
  191. package/dist/validate/visitors/throw-disallowed-fields.mjs +89 -0
  192. package/dist/validate/visitors/throw-disallowed-fields.mjs.map +1 -0
  193. package/dist/validate/visitors/throw-dynamic-zones.js +16 -0
  194. package/dist/validate/visitors/throw-dynamic-zones.js.map +1 -0
  195. package/dist/validate/visitors/throw-dynamic-zones.mjs +14 -0
  196. package/dist/validate/visitors/throw-dynamic-zones.mjs.map +1 -0
  197. package/dist/validate/visitors/throw-morph-to-relations.js +16 -0
  198. package/dist/validate/visitors/throw-morph-to-relations.js.map +1 -0
  199. package/dist/validate/visitors/throw-morph-to-relations.mjs +14 -0
  200. package/dist/validate/visitors/throw-morph-to-relations.mjs.map +1 -0
  201. package/dist/validate/visitors/throw-password.js +15 -0
  202. package/dist/validate/visitors/throw-password.js.map +1 -0
  203. package/dist/validate/visitors/throw-password.mjs +13 -0
  204. package/dist/validate/visitors/throw-password.mjs.map +1 -0
  205. package/dist/validate/visitors/throw-private.js +20 -0
  206. package/dist/validate/visitors/throw-private.js.map +1 -0
  207. package/dist/validate/visitors/throw-private.mjs +18 -0
  208. package/dist/validate/visitors/throw-private.mjs.map +1 -0
  209. package/dist/validate/visitors/throw-restricted-fields.js +36 -0
  210. package/dist/validate/visitors/throw-restricted-fields.js.map +1 -0
  211. package/dist/validate/visitors/throw-restricted-fields.mjs +34 -0
  212. package/dist/validate/visitors/throw-restricted-fields.mjs.map +1 -0
  213. package/dist/validate/visitors/throw-restricted-relations.js +125 -0
  214. package/dist/validate/visitors/throw-restricted-relations.js.map +1 -0
  215. package/dist/validate/visitors/throw-restricted-relations.mjs +123 -0
  216. package/dist/validate/visitors/throw-restricted-relations.mjs.map +1 -0
  217. package/dist/validate/visitors/throw-unrecognized-fields.js +66 -0
  218. package/dist/validate/visitors/throw-unrecognized-fields.js.map +1 -0
  219. package/dist/validate/visitors/throw-unrecognized-fields.mjs +64 -0
  220. package/dist/validate/visitors/throw-unrecognized-fields.mjs.map +1 -0
  221. package/dist/validators.js +60 -0
  222. package/dist/validators.js.map +1 -0
  223. package/dist/validators.mjs +37 -0
  224. package/dist/validators.mjs.map +1 -0
  225. package/dist/yup.js +101 -0
  226. package/dist/yup.js.map +1 -0
  227. package/dist/yup.mjs +74 -0
  228. package/dist/yup.mjs.map +1 -0
  229. package/dist/zod.js +31 -0
  230. package/dist/zod.js.map +1 -0
  231. package/dist/zod.mjs +29 -0
  232. package/dist/zod.mjs.map +1 -0
  233. package/package.json +3 -3
@@ -0,0 +1,142 @@
1
+ import { trim, isEmpty, isString, pipe, split, map, flatten, isNil, first, cloneDeep, curry, isObject } from 'lodash/fp';
2
+ import traverseFactory from './factory.mjs';
3
+
4
+ const ORDERS = {
5
+ asc: 'asc',
6
+ desc: 'desc'
7
+ };
8
+ const ORDER_VALUES = Object.values(ORDERS);
9
+ const isSortOrder = (value)=>ORDER_VALUES.includes(value.toLowerCase());
10
+ const isStringArray = (value)=>Array.isArray(value) && value.every(isString);
11
+ const isObjectArray = (value)=>Array.isArray(value) && value.every(isObject);
12
+ const isNestedSorts = (value)=>isString(value) && value.split(',').length > 1;
13
+ const isObj = (value)=>isObject(value);
14
+ const sort = traverseFactory().intercept(// String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose
15
+ isNestedSorts, async (visitor, options, sort, { recurse })=>{
16
+ return Promise.all(sort.split(',').map(trim).map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((part)=>!isEmpty(part)).join(','));
17
+ }).intercept(// Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items
18
+ isStringArray, async (visitor, options, sort, { recurse })=>{
19
+ return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!isEmpty(nestedSort)));
20
+ }).intercept(// Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items
21
+ isObjectArray, async (visitor, options, sort, { recurse })=>{
22
+ return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!isEmpty(nestedSort)));
23
+ })// Parse string values
24
+ .parse(isString, ()=>{
25
+ const tokenize = pipe(split('.'), map(split(':')), flatten);
26
+ const recompose = (parts)=>{
27
+ if (parts.length === 0) {
28
+ return undefined;
29
+ }
30
+ return parts.reduce((acc, part)=>{
31
+ if (isEmpty(part)) {
32
+ return acc;
33
+ }
34
+ if (acc === '') {
35
+ return part;
36
+ }
37
+ return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;
38
+ }, '');
39
+ };
40
+ return {
41
+ transform: trim,
42
+ remove (key, data) {
43
+ const [root] = tokenize(data);
44
+ return root === key ? undefined : data;
45
+ },
46
+ set (key, value, data) {
47
+ const [root] = tokenize(data);
48
+ if (root !== key) {
49
+ return data;
50
+ }
51
+ return isNil(value) ? root : `${root}.${value}`;
52
+ },
53
+ keys (data) {
54
+ const v = first(tokenize(data));
55
+ return v ? [
56
+ v
57
+ ] : [];
58
+ },
59
+ get (key, data) {
60
+ const [root, ...rest] = tokenize(data);
61
+ return key === root ? recompose(rest) : undefined;
62
+ }
63
+ };
64
+ })// Parse object values
65
+ .parse(isObj, ()=>({
66
+ transform: cloneDeep,
67
+ remove (key, data) {
68
+ // eslint-disable-next-line no-unused-vars
69
+ const { [key]: ignored, ...rest } = data;
70
+ return rest;
71
+ },
72
+ set (key, value, data) {
73
+ return {
74
+ ...data,
75
+ [key]: value
76
+ };
77
+ },
78
+ keys (data) {
79
+ return Object.keys(data);
80
+ },
81
+ get (key, data) {
82
+ return data[key];
83
+ }
84
+ }))// Handle deep sort on relation
85
+ .onRelation(async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse })=>{
86
+ const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
87
+ if (isMorphRelation) {
88
+ return;
89
+ }
90
+ const parent = {
91
+ key,
92
+ path,
93
+ schema,
94
+ attribute
95
+ };
96
+ const targetSchemaUID = attribute.target;
97
+ const targetSchema = getModel(targetSchemaUID);
98
+ const newValue = await recurse(visitor, {
99
+ schema: targetSchema,
100
+ path,
101
+ getModel,
102
+ parent
103
+ }, value);
104
+ set(key, newValue);
105
+ })// Handle deep sort on media
106
+ .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set })=>{
107
+ const parent = {
108
+ key,
109
+ path,
110
+ schema,
111
+ attribute
112
+ };
113
+ const targetSchemaUID = 'plugin::upload.file';
114
+ const targetSchema = getModel(targetSchemaUID);
115
+ const newValue = await recurse(visitor, {
116
+ schema: targetSchema,
117
+ path,
118
+ getModel,
119
+ parent
120
+ }, value);
121
+ set(key, newValue);
122
+ })// Handle deep sort on components
123
+ .onComponent(async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set })=>{
124
+ const parent = {
125
+ key,
126
+ path,
127
+ schema,
128
+ attribute
129
+ };
130
+ const targetSchema = getModel(attribute.component);
131
+ const newValue = await recurse(visitor, {
132
+ schema: targetSchema,
133
+ path,
134
+ getModel,
135
+ parent
136
+ }, value);
137
+ set(key, newValue);
138
+ });
139
+ var traverseQuerySort = curry(sort.traverse);
140
+
141
+ export { traverseQuerySort as default };
142
+ //# sourceMappingURL=query-sort.mjs.map
@@ -0,0 +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 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\nconst sort = traverseFactory()\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","sort","traverseFactory","intercept","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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"}
@@ -0,0 +1,170 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var contentTypes = require('./content-types.js');
5
+
6
+ const traverseEntity = async (visitor, options, entity)=>{
7
+ const { path = {
8
+ raw: null,
9
+ attribute: null
10
+ }, schema, getModel } = options;
11
+ let parent = options.parent;
12
+ const traverseMorphRelationTarget = async (visitor, path, entry)=>{
13
+ const targetSchema = getModel(entry.__type);
14
+ const traverseOptions = {
15
+ schema: targetSchema,
16
+ path,
17
+ getModel,
18
+ parent
19
+ };
20
+ return traverseEntity(visitor, traverseOptions, entry);
21
+ };
22
+ const traverseRelationTarget = (schema)=>async (visitor, path, entry)=>{
23
+ const traverseOptions = {
24
+ schema,
25
+ path,
26
+ getModel,
27
+ parent
28
+ };
29
+ return traverseEntity(visitor, traverseOptions, entry);
30
+ };
31
+ const traverseMediaTarget = async (visitor, path, entry)=>{
32
+ const targetSchemaUID = 'plugin::upload.file';
33
+ const targetSchema = getModel(targetSchemaUID);
34
+ const traverseOptions = {
35
+ schema: targetSchema,
36
+ path,
37
+ getModel,
38
+ parent
39
+ };
40
+ return traverseEntity(visitor, traverseOptions, entry);
41
+ };
42
+ const traverseComponent = async (visitor, path, schema, entry)=>{
43
+ const traverseOptions = {
44
+ schema,
45
+ path,
46
+ getModel,
47
+ parent
48
+ };
49
+ return traverseEntity(visitor, traverseOptions, entry);
50
+ };
51
+ const visitDynamicZoneEntry = async (visitor, path, entry)=>{
52
+ const targetSchema = getModel(entry.__component);
53
+ const traverseOptions = {
54
+ schema: targetSchema,
55
+ path,
56
+ getModel,
57
+ parent
58
+ };
59
+ return traverseEntity(visitor, traverseOptions, entry);
60
+ };
61
+ // End recursion
62
+ if (!fp.isObject(entity) || fp.isNil(schema)) {
63
+ return entity;
64
+ }
65
+ // Don't mutate the original entity object
66
+ // only clone at 1st level as the next level will get clone when traversed
67
+ const copy = fp.clone(entity);
68
+ const visitorUtils = createVisitorUtils({
69
+ data: copy
70
+ });
71
+ const keys = Object.keys(copy);
72
+ for(let i = 0; i < keys.length; i += 1){
73
+ const key = keys[i];
74
+ // Retrieve the attribute definition associated to the key from the schema
75
+ const attribute = schema.attributes[key];
76
+ const newPath = {
77
+ ...path
78
+ };
79
+ newPath.raw = fp.isNil(path.raw) ? key : `${path.raw}.${key}`;
80
+ if (!fp.isNil(attribute)) {
81
+ newPath.attribute = fp.isNil(path.attribute) ? key : `${path.attribute}.${key}`;
82
+ }
83
+ // Visit the current attribute
84
+ const visitorOptions = {
85
+ data: copy,
86
+ schema,
87
+ key,
88
+ value: copy[key],
89
+ attribute,
90
+ path: newPath,
91
+ getModel,
92
+ parent
93
+ };
94
+ await visitor(visitorOptions, visitorUtils);
95
+ // Extract the value for the current key (after calling the visitor)
96
+ const value = copy[key];
97
+ // Ignore Nil values or attributes
98
+ if (fp.isNil(value) || fp.isNil(attribute)) {
99
+ continue;
100
+ }
101
+ // The current attribute becomes the parent once visited
102
+ parent = {
103
+ schema,
104
+ key,
105
+ attribute,
106
+ path: newPath
107
+ };
108
+ if (contentTypes.isRelationalAttribute(attribute)) {
109
+ const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
110
+ const method = isMorphRelation ? traverseMorphRelationTarget : traverseRelationTarget(getModel(attribute.target));
111
+ if (fp.isArray(value)) {
112
+ const res = new Array(value.length);
113
+ for(let i = 0; i < value.length; i += 1){
114
+ res[i] = await method(visitor, newPath, value[i]);
115
+ }
116
+ copy[key] = res;
117
+ } else {
118
+ copy[key] = await method(visitor, newPath, value);
119
+ }
120
+ continue;
121
+ }
122
+ if (contentTypes.isMediaAttribute(attribute)) {
123
+ // need to update copy
124
+ if (fp.isArray(value)) {
125
+ const res = new Array(value.length);
126
+ for(let i = 0; i < value.length; i += 1){
127
+ res[i] = await traverseMediaTarget(visitor, newPath, value[i]);
128
+ }
129
+ copy[key] = res;
130
+ } else {
131
+ copy[key] = await traverseMediaTarget(visitor, newPath, value);
132
+ }
133
+ continue;
134
+ }
135
+ if (attribute.type === 'component') {
136
+ const targetSchema = getModel(attribute.component);
137
+ if (fp.isArray(value)) {
138
+ const res = new Array(value.length);
139
+ for(let i = 0; i < value.length; i += 1){
140
+ res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);
141
+ }
142
+ copy[key] = res;
143
+ } else {
144
+ copy[key] = await traverseComponent(visitor, newPath, targetSchema, value);
145
+ }
146
+ continue;
147
+ }
148
+ if (attribute.type === 'dynamiczone' && fp.isArray(value)) {
149
+ const res = new Array(value.length);
150
+ for(let i = 0; i < value.length; i += 1){
151
+ res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);
152
+ }
153
+ copy[key] = res;
154
+ continue;
155
+ }
156
+ }
157
+ return copy;
158
+ };
159
+ const createVisitorUtils = ({ data })=>({
160
+ remove (key) {
161
+ delete data[key];
162
+ },
163
+ set (key, value) {
164
+ data[key] = value;
165
+ }
166
+ });
167
+ var traverseEntity$1 = fp.curry(traverseEntity);
168
+
169
+ module.exports = traverseEntity$1;
170
+ //# sourceMappingURL=traverse-entity.js.map
@@ -0,0 +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\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}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null }, schema, getModel } = 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 = { schema: targetSchema, path, getModel, parent };\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 = { schema, path, getModel, parent };\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 = { schema: targetSchema, path, getModel, parent };\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 = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\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\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 };\n\n await visitor(visitorOptions, visitorUtils);\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 // The current attribute becomes the parent once visited\n parent = { schema, key, attribute, path: newPath };\n\n if (isRelationalAttribute(attribute)) {\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 const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await method(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n // need to update copy\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseMediaTarget(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n const res: Data[] = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);\n }\n copy[key] = res;\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 const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);\n }\n copy[key] = res;\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":["traverseEntity","visitor","options","entity","path","raw","attribute","schema","getModel","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","isNil","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","i","length","key","attributes","newPath","visitorOptions","value","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","res","Array","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}
@@ -0,0 +1,168 @@
1
+ import { curry, isObject, isNil, clone, isArray } from 'lodash/fp';
2
+ import { isRelationalAttribute, isMediaAttribute } from './content-types.mjs';
3
+
4
+ const traverseEntity = async (visitor, options, entity)=>{
5
+ const { path = {
6
+ raw: null,
7
+ attribute: null
8
+ }, schema, getModel } = options;
9
+ let parent = options.parent;
10
+ const traverseMorphRelationTarget = async (visitor, path, entry)=>{
11
+ const targetSchema = getModel(entry.__type);
12
+ const traverseOptions = {
13
+ schema: targetSchema,
14
+ path,
15
+ getModel,
16
+ parent
17
+ };
18
+ return traverseEntity(visitor, traverseOptions, entry);
19
+ };
20
+ const traverseRelationTarget = (schema)=>async (visitor, path, entry)=>{
21
+ const traverseOptions = {
22
+ schema,
23
+ path,
24
+ getModel,
25
+ parent
26
+ };
27
+ return traverseEntity(visitor, traverseOptions, entry);
28
+ };
29
+ const traverseMediaTarget = async (visitor, path, entry)=>{
30
+ const targetSchemaUID = 'plugin::upload.file';
31
+ const targetSchema = getModel(targetSchemaUID);
32
+ const traverseOptions = {
33
+ schema: targetSchema,
34
+ path,
35
+ getModel,
36
+ parent
37
+ };
38
+ return traverseEntity(visitor, traverseOptions, entry);
39
+ };
40
+ const traverseComponent = async (visitor, path, schema, entry)=>{
41
+ const traverseOptions = {
42
+ schema,
43
+ path,
44
+ getModel,
45
+ parent
46
+ };
47
+ return traverseEntity(visitor, traverseOptions, entry);
48
+ };
49
+ const visitDynamicZoneEntry = async (visitor, path, entry)=>{
50
+ const targetSchema = getModel(entry.__component);
51
+ const traverseOptions = {
52
+ schema: targetSchema,
53
+ path,
54
+ getModel,
55
+ parent
56
+ };
57
+ return traverseEntity(visitor, traverseOptions, entry);
58
+ };
59
+ // End recursion
60
+ if (!isObject(entity) || isNil(schema)) {
61
+ return entity;
62
+ }
63
+ // Don't mutate the original entity object
64
+ // only clone at 1st level as the next level will get clone when traversed
65
+ const copy = clone(entity);
66
+ const visitorUtils = createVisitorUtils({
67
+ data: copy
68
+ });
69
+ const keys = Object.keys(copy);
70
+ for(let i = 0; i < keys.length; i += 1){
71
+ const key = keys[i];
72
+ // Retrieve the attribute definition associated to the key from the schema
73
+ const attribute = schema.attributes[key];
74
+ const newPath = {
75
+ ...path
76
+ };
77
+ newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;
78
+ if (!isNil(attribute)) {
79
+ newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;
80
+ }
81
+ // Visit the current attribute
82
+ const visitorOptions = {
83
+ data: copy,
84
+ schema,
85
+ key,
86
+ value: copy[key],
87
+ attribute,
88
+ path: newPath,
89
+ getModel,
90
+ parent
91
+ };
92
+ await visitor(visitorOptions, visitorUtils);
93
+ // Extract the value for the current key (after calling the visitor)
94
+ const value = copy[key];
95
+ // Ignore Nil values or attributes
96
+ if (isNil(value) || isNil(attribute)) {
97
+ continue;
98
+ }
99
+ // The current attribute becomes the parent once visited
100
+ parent = {
101
+ schema,
102
+ key,
103
+ attribute,
104
+ path: newPath
105
+ };
106
+ if (isRelationalAttribute(attribute)) {
107
+ const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
108
+ const method = isMorphRelation ? traverseMorphRelationTarget : traverseRelationTarget(getModel(attribute.target));
109
+ if (isArray(value)) {
110
+ const res = new Array(value.length);
111
+ for(let i = 0; i < value.length; i += 1){
112
+ res[i] = await method(visitor, newPath, value[i]);
113
+ }
114
+ copy[key] = res;
115
+ } else {
116
+ copy[key] = await method(visitor, newPath, value);
117
+ }
118
+ continue;
119
+ }
120
+ if (isMediaAttribute(attribute)) {
121
+ // need to update copy
122
+ if (isArray(value)) {
123
+ const res = new Array(value.length);
124
+ for(let i = 0; i < value.length; i += 1){
125
+ res[i] = await traverseMediaTarget(visitor, newPath, value[i]);
126
+ }
127
+ copy[key] = res;
128
+ } else {
129
+ copy[key] = await traverseMediaTarget(visitor, newPath, value);
130
+ }
131
+ continue;
132
+ }
133
+ if (attribute.type === 'component') {
134
+ const targetSchema = getModel(attribute.component);
135
+ if (isArray(value)) {
136
+ const res = new Array(value.length);
137
+ for(let i = 0; i < value.length; i += 1){
138
+ res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);
139
+ }
140
+ copy[key] = res;
141
+ } else {
142
+ copy[key] = await traverseComponent(visitor, newPath, targetSchema, value);
143
+ }
144
+ continue;
145
+ }
146
+ if (attribute.type === 'dynamiczone' && isArray(value)) {
147
+ const res = new Array(value.length);
148
+ for(let i = 0; i < value.length; i += 1){
149
+ res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);
150
+ }
151
+ copy[key] = res;
152
+ continue;
153
+ }
154
+ }
155
+ return copy;
156
+ };
157
+ const createVisitorUtils = ({ data })=>({
158
+ remove (key) {
159
+ delete data[key];
160
+ },
161
+ set (key, value) {
162
+ data[key] = value;
163
+ }
164
+ });
165
+ var traverseEntity$1 = curry(traverseEntity);
166
+
167
+ export { traverseEntity$1 as default };
168
+ //# sourceMappingURL=traverse-entity.mjs.map
@@ -0,0 +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\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}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null }, schema, getModel } = 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 = { schema: targetSchema, path, getModel, parent };\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 = { schema, path, getModel, parent };\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 = { schema: targetSchema, path, getModel, parent };\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 = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\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\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 };\n\n await visitor(visitorOptions, visitorUtils);\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 // The current attribute becomes the parent once visited\n parent = { schema, key, attribute, path: newPath };\n\n if (isRelationalAttribute(attribute)) {\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 const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await method(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n // need to update copy\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseMediaTarget(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n const res: Data[] = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);\n }\n copy[key] = res;\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 const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);\n }\n copy[key] = res;\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":["traverseEntity","visitor","options","entity","path","raw","attribute","schema","getModel","parent","traverseMorphRelationTarget","entry","targetSchema","__type","traverseOptions","traverseRelationTarget","traverseMediaTarget","targetSchemaUID","traverseComponent","visitDynamicZoneEntry","__component","isObject","isNil","copy","clone","visitorUtils","createVisitorUtils","data","keys","Object","i","length","key","attributes","newPath","visitorOptions","value","isRelationalAttribute","isMorphRelation","relation","toLowerCase","startsWith","method","target","isArray","res","Array","isMediaAttribute","type","component","remove","set","curry"],"mappings":"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"}