@strapi/utils 5.12.0 → 5.12.2

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,41 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var factory = require('./factory.js');
5
+
6
+ const isStringArray = (value)=>{
7
+ return fp.isArray(value) && value.every(fp.isString);
8
+ };
9
+ const fields = factory()// Intercept array of strings
10
+ // e.g. fields=['title', 'description']
11
+ .intercept(isStringArray, async (visitor, options, fields, { recurse })=>{
12
+ return Promise.all(fields.map((field)=>recurse(visitor, options, field)));
13
+ })// Intercept comma separated fields (as string)
14
+ // e.g. fields='title,description'
15
+ .intercept((value)=>fp.isString(value) && value.includes(','), (visitor, options, fields, { recurse })=>{
16
+ return Promise.all(fields.split(',').map((field)=>recurse(visitor, options, field)));
17
+ })// Return wildcards as is
18
+ .intercept((value)=>fp.eq('*', value), fp.constant('*'))// Parse string values
19
+ // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),
20
+ // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data
21
+ .parse(fp.isString, ()=>({
22
+ transform: fp.trim,
23
+ remove (key, data) {
24
+ return data === key ? undefined : data;
25
+ },
26
+ set (_key, _value, data) {
27
+ return data;
28
+ },
29
+ keys (data) {
30
+ return [
31
+ data
32
+ ];
33
+ },
34
+ get (key, data) {
35
+ return key === data ? data : undefined;
36
+ }
37
+ }));
38
+ var traverseQueryFields = fp.curry(fields.traverse);
39
+
40
+ module.exports = traverseQueryFields;
41
+ //# sourceMappingURL=query-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-fields.js","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { curry, isArray, isString, eq, trim, constant } from 'lodash/fp';\n\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every(isString);\n};\n\nconst fields = traverseFactory()\n // Intercept array of strings\n // e.g. fields=['title', 'description']\n .intercept(isStringArray, async (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.map((field) => recurse(visitor, options, field)));\n })\n // Intercept comma separated fields (as string)\n // e.g. fields='title,description'\n .intercept(\n (value): value is string => isString(value) && value.includes(','),\n (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.split(',').map((field) => recurse(visitor, options, field)));\n }\n )\n // Return wildcards as is\n .intercept((value): value is string => eq('*', value), constant('*'))\n // Parse string values\n // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),\n // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data\n .parse(isString, () => ({\n transform: trim,\n\n remove(key, data) {\n return data === key ? undefined : data;\n },\n\n set(_key, _value, data) {\n return data;\n },\n\n keys(data) {\n return [data];\n },\n\n get(key, data) {\n return key === data ? data : undefined;\n },\n }));\n\nexport default curry(fields.traverse);\n"],"names":["isStringArray","value","isArray","every","isString","fields","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","field","includes","split","eq","constant","parse","transform","trim","remove","key","data","undefined","set","_key","_value","keys","get","curry","traverse"],"mappings":";;;;;AAIA,MAAMA,gBAAgB,CAACC,KAAAA,GAAAA;AACrB,IAAA,OAAOC,UAAQD,CAAAA,KAAAA,CAAAA,IAAUA,KAAME,CAAAA,KAAK,CAACC,WAAAA,CAAAA;AACvC,CAAA;AAEA,MAAMC,MAAAA,GAASC,SACb;AACA;CACCC,SAAS,CAACP,eAAe,OAAOQ,OAAAA,EAASC,SAASJ,MAAQ,EAAA,EAAEK,OAAO,EAAE,GAAA;IACpE,OAAOC,OAAAA,CAAQC,GAAG,CAACP,MAAOQ,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAUJ,OAAQF,CAAAA,OAAAA,EAASC,OAASK,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA;AACrE,CAAA,CACA;AACA;AACCP,CAAAA,SAAS,CACR,CAACN,KAA2BG,GAAAA,WAAAA,CAASH,UAAUA,KAAMc,CAAAA,QAAQ,CAAC,GAAA,CAAA,EAC9D,CAACP,OAASC,EAAAA,OAAAA,EAASJ,MAAQ,EAAA,EAAEK,OAAO,EAAE,GAAA;AACpC,IAAA,OAAOC,OAAQC,CAAAA,GAAG,CAACP,MAAAA,CAAOW,KAAK,CAAC,GAAKH,CAAAA,CAAAA,GAAG,CAAC,CAACC,KAAUJ,GAAAA,OAAAA,CAAQF,SAASC,OAASK,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA;AAChF,CAAA,CAEF;CACCP,SAAS,CAAC,CAACN,KAA2BgB,GAAAA,KAAAA,CAAG,KAAKhB,KAAQiB,CAAAA,EAAAA,WAAAA,CAAS,KAChE;AACA;AACA;CACCC,KAAK,CAACf,WAAU,EAAA,KAAO;QACtBgB,SAAWC,EAAAA,OAAAA;QAEXC,MAAOC,CAAAA,CAAAA,GAAG,EAAEC,IAAI,EAAA;YACd,OAAOA,IAAAA,KAASD,MAAME,SAAYD,GAAAA,IAAAA;AACpC,SAAA;AAEAE,QAAAA,GAAAA,CAAAA,CAAIC,IAAI,EAAEC,MAAM,EAAEJ,IAAI,EAAA;YACpB,OAAOA,IAAAA;AACT,SAAA;AAEAK,QAAAA,IAAAA,CAAAA,CAAKL,IAAI,EAAA;YACP,OAAO;AAACA,gBAAAA;AAAK,aAAA;AACf,SAAA;QAEAM,GAAIP,CAAAA,CAAAA,GAAG,EAAEC,IAAI,EAAA;YACX,OAAOD,GAAAA,KAAQC,OAAOA,IAAOC,GAAAA,SAAAA;AAC/B;KACF,CAAA,CAAA;AAEF,0BAAeM,QAAAA,CAAM1B,MAAO2B,CAAAA,QAAQ,CAAE;;;;"}
@@ -0,0 +1,39 @@
1
+ import { isString, eq, constant, trim, curry, isArray } from 'lodash/fp';
2
+ import traverseFactory from './factory.mjs';
3
+
4
+ const isStringArray = (value)=>{
5
+ return isArray(value) && value.every(isString);
6
+ };
7
+ const fields = traverseFactory()// Intercept array of strings
8
+ // e.g. fields=['title', 'description']
9
+ .intercept(isStringArray, async (visitor, options, fields, { recurse })=>{
10
+ return Promise.all(fields.map((field)=>recurse(visitor, options, field)));
11
+ })// Intercept comma separated fields (as string)
12
+ // e.g. fields='title,description'
13
+ .intercept((value)=>isString(value) && value.includes(','), (visitor, options, fields, { recurse })=>{
14
+ return Promise.all(fields.split(',').map((field)=>recurse(visitor, options, field)));
15
+ })// Return wildcards as is
16
+ .intercept((value)=>eq('*', value), constant('*'))// Parse string values
17
+ // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),
18
+ // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data
19
+ .parse(isString, ()=>({
20
+ transform: trim,
21
+ remove (key, data) {
22
+ return data === key ? undefined : data;
23
+ },
24
+ set (_key, _value, data) {
25
+ return data;
26
+ },
27
+ keys (data) {
28
+ return [
29
+ data
30
+ ];
31
+ },
32
+ get (key, data) {
33
+ return key === data ? data : undefined;
34
+ }
35
+ }));
36
+ var traverseQueryFields = curry(fields.traverse);
37
+
38
+ export { traverseQueryFields as default };
39
+ //# sourceMappingURL=query-fields.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-fields.mjs","sources":["../../src/traverse/query-fields.ts"],"sourcesContent":["import { curry, isArray, isString, eq, trim, constant } from 'lodash/fp';\n\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every(isString);\n};\n\nconst fields = traverseFactory()\n // Intercept array of strings\n // e.g. fields=['title', 'description']\n .intercept(isStringArray, async (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.map((field) => recurse(visitor, options, field)));\n })\n // Intercept comma separated fields (as string)\n // e.g. fields='title,description'\n .intercept(\n (value): value is string => isString(value) && value.includes(','),\n (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.split(',').map((field) => recurse(visitor, options, field)));\n }\n )\n // Return wildcards as is\n .intercept((value): value is string => eq('*', value), constant('*'))\n // Parse string values\n // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),\n // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data\n .parse(isString, () => ({\n transform: trim,\n\n remove(key, data) {\n return data === key ? undefined : data;\n },\n\n set(_key, _value, data) {\n return data;\n },\n\n keys(data) {\n return [data];\n },\n\n get(key, data) {\n return key === data ? data : undefined;\n },\n }));\n\nexport default curry(fields.traverse);\n"],"names":["isStringArray","value","isArray","every","isString","fields","traverseFactory","intercept","visitor","options","recurse","Promise","all","map","field","includes","split","eq","constant","parse","transform","trim","remove","key","data","undefined","set","_key","_value","keys","get","curry","traverse"],"mappings":";;;AAIA,MAAMA,gBAAgB,CAACC,KAAAA,GAAAA;AACrB,IAAA,OAAOC,OAAQD,CAAAA,KAAAA,CAAAA,IAAUA,KAAME,CAAAA,KAAK,CAACC,QAAAA,CAAAA;AACvC,CAAA;AAEA,MAAMC,MAAAA,GAASC,iBACb;AACA;CACCC,SAAS,CAACP,eAAe,OAAOQ,OAAAA,EAASC,SAASJ,MAAQ,EAAA,EAAEK,OAAO,EAAE,GAAA;IACpE,OAAOC,OAAAA,CAAQC,GAAG,CAACP,MAAOQ,CAAAA,GAAG,CAAC,CAACC,KAAAA,GAAUJ,OAAQF,CAAAA,OAAAA,EAASC,OAASK,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA;AACrE,CAAA,CACA;AACA;AACCP,CAAAA,SAAS,CACR,CAACN,KAA2BG,GAAAA,QAAAA,CAASH,UAAUA,KAAMc,CAAAA,QAAQ,CAAC,GAAA,CAAA,EAC9D,CAACP,OAASC,EAAAA,OAAAA,EAASJ,MAAQ,EAAA,EAAEK,OAAO,EAAE,GAAA;AACpC,IAAA,OAAOC,OAAQC,CAAAA,GAAG,CAACP,MAAAA,CAAOW,KAAK,CAAC,GAAKH,CAAAA,CAAAA,GAAG,CAAC,CAACC,KAAUJ,GAAAA,OAAAA,CAAQF,SAASC,OAASK,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA;AAChF,CAAA,CAEF;CACCP,SAAS,CAAC,CAACN,KAA2BgB,GAAAA,EAAAA,CAAG,KAAKhB,KAAQiB,CAAAA,EAAAA,QAAAA,CAAS,KAChE;AACA;AACA;CACCC,KAAK,CAACf,QAAU,EAAA,KAAO;QACtBgB,SAAWC,EAAAA,IAAAA;QAEXC,MAAOC,CAAAA,CAAAA,GAAG,EAAEC,IAAI,EAAA;YACd,OAAOA,IAAAA,KAASD,MAAME,SAAYD,GAAAA,IAAAA;AACpC,SAAA;AAEAE,QAAAA,GAAAA,CAAAA,CAAIC,IAAI,EAAEC,MAAM,EAAEJ,IAAI,EAAA;YACpB,OAAOA,IAAAA;AACT,SAAA;AAEAK,QAAAA,IAAAA,CAAAA,CAAKL,IAAI,EAAA;YACP,OAAO;AAACA,gBAAAA;AAAK,aAAA;AACf,SAAA;QAEAM,GAAIP,CAAAA,CAAAA,GAAG,EAAEC,IAAI,EAAA;YACX,OAAOD,GAAAA,KAAQC,OAAOA,IAAOC,GAAAA,SAAAA;AAC/B;KACF,CAAA,CAAA;AAEF,0BAAeM,KAAAA,CAAM1B,MAAO2B,CAAAA,QAAQ,CAAE;;;;"}
@@ -0,0 +1,114 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var factory = require('./factory.js');
5
+
6
+ const isObj = (value)=>fp.isObject(value);
7
+ const filters = factory().intercept(// Intercept filters arrays and apply the traversal to each one individually
8
+ fp.isArray, async (visitor, options, filters, { recurse })=>{
9
+ return Promise.all(filters.map((filter, i)=>{
10
+ // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]
11
+ // can have a value array, thus we can update the raw path but not the attribute one
12
+ const newPath = options.path ? {
13
+ ...options.path,
14
+ raw: `${options.path.raw}[${i}]`
15
+ } : options.path;
16
+ return recurse(visitor, {
17
+ ...options,
18
+ path: newPath
19
+ }, filter);
20
+ })).then((res)=>res.filter((val)=>!(fp.isObject(val) && fp.isEmpty(val))));
21
+ }).intercept(// Ignore non object filters and return the value as-is
22
+ (filters)=>!fp.isObject(filters), (_, __, filters)=>{
23
+ return filters;
24
+ })// Parse object values
25
+ .parse(isObj, ()=>({
26
+ transform: fp.cloneDeep,
27
+ remove (key, data) {
28
+ return fp.omit(key, data);
29
+ },
30
+ set (key, value, data) {
31
+ return {
32
+ ...data,
33
+ [key]: value
34
+ };
35
+ },
36
+ keys (data) {
37
+ return Object.keys(data);
38
+ },
39
+ get (key, data) {
40
+ return data[key];
41
+ }
42
+ }))// Ignore null or undefined values
43
+ .ignore(({ value })=>fp.isNil(value))// Recursion on operators (non attributes)
44
+ .on(({ attribute })=>fp.isNil(attribute), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
45
+ const parent = {
46
+ key,
47
+ path,
48
+ schema,
49
+ attribute
50
+ };
51
+ set(key, await recurse(visitor, {
52
+ schema,
53
+ path,
54
+ getModel,
55
+ parent
56
+ }, value));
57
+ })// Handle relation recursion
58
+ .onRelation(async ({ key, attribute, visitor, path, value, schema, getModel }, { set, recurse })=>{
59
+ const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
60
+ if (isMorphRelation) {
61
+ return;
62
+ }
63
+ const parent = {
64
+ key,
65
+ path,
66
+ schema,
67
+ attribute
68
+ };
69
+ const targetSchemaUID = attribute.target;
70
+ const targetSchema = getModel(targetSchemaUID);
71
+ const newValue = await recurse(visitor, {
72
+ schema: targetSchema,
73
+ path,
74
+ getModel,
75
+ parent
76
+ }, value);
77
+ set(key, newValue);
78
+ }).onComponent(async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse })=>{
79
+ const parent = {
80
+ key,
81
+ path,
82
+ schema,
83
+ attribute
84
+ };
85
+ const targetSchema = getModel(attribute.component);
86
+ const newValue = await recurse(visitor, {
87
+ schema: targetSchema,
88
+ path,
89
+ getModel,
90
+ parent
91
+ }, value);
92
+ set(key, newValue);
93
+ })// Handle media recursion
94
+ .onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse })=>{
95
+ const parent = {
96
+ key,
97
+ path,
98
+ schema,
99
+ attribute
100
+ };
101
+ const targetSchemaUID = 'plugin::upload.file';
102
+ const targetSchema = getModel(targetSchemaUID);
103
+ const newValue = await recurse(visitor, {
104
+ schema: targetSchema,
105
+ path,
106
+ getModel,
107
+ parent
108
+ }, value);
109
+ set(key, newValue);
110
+ });
111
+ var traverseQueryFilters = fp.curry(filters.traverse);
112
+
113
+ module.exports = traverseQueryFilters;
114
+ //# sourceMappingURL=query-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-filters.js","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { curry, isObject, isEmpty, isArray, isNil, cloneDeep, omit } from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n isArray,\n async (visitor, options, filters, { recurse }) => {\n return Promise.all(\n filters.map((filter, i) => {\n // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]\n // can have a value array, thus we can update the raw path but not the attribute one\n const newPath = options.path\n ? { ...options.path, raw: `${options.path.raw}[${i}]` }\n : options.path;\n\n return recurse(visitor, { ...options, path: newPath }, filter);\n })\n // todo: move that to the visitors\n ).then((res) => res.filter((val) => !(isObject(val) && isEmpty(val))));\n }\n )\n .intercept(\n // Ignore non object filters and return the value as-is\n (filters): filters is unknown => !isObject(filters),\n (_, __, filters) => {\n return filters;\n }\n )\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n return omit(key, data);\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Ignore null or undefined values\n .ignore(({ value }) => isNil(value))\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => isNil(attribute),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n set(key, await recurse(visitor, { schema, path, getModel, parent }, value));\n }\n )\n // Handle relation recursion\n .onRelation(\n async ({ key, attribute, visitor, path, value, schema, getModel }, { 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 .onComponent(\n async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle media recursion\n .onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse }) => {\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\nexport default curry(filters.traverse);\n"],"names":["isObj","value","isObject","filters","traverseFactory","intercept","isArray","visitor","options","recurse","Promise","all","map","filter","i","newPath","path","raw","then","res","val","isEmpty","_","__","parse","transform","cloneDeep","remove","key","data","omit","set","keys","Object","get","ignore","isNil","on","attribute","schema","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","curry","traverse"],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { isArray, isObject, isEmpty, cloneDeep, omit, isNil, curry } from 'lodash/fp';
2
+ import traverseFactory from './factory.mjs';
3
+
4
+ const isObj = (value)=>isObject(value);
5
+ const filters = traverseFactory().intercept(// Intercept filters arrays and apply the traversal to each one individually
6
+ isArray, async (visitor, options, filters, { recurse })=>{
7
+ return Promise.all(filters.map((filter, i)=>{
8
+ // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]
9
+ // can have a value array, thus we can update the raw path but not the attribute one
10
+ const newPath = options.path ? {
11
+ ...options.path,
12
+ raw: `${options.path.raw}[${i}]`
13
+ } : options.path;
14
+ return recurse(visitor, {
15
+ ...options,
16
+ path: newPath
17
+ }, filter);
18
+ })).then((res)=>res.filter((val)=>!(isObject(val) && isEmpty(val))));
19
+ }).intercept(// Ignore non object filters and return the value as-is
20
+ (filters)=>!isObject(filters), (_, __, filters)=>{
21
+ return filters;
22
+ })// Parse object values
23
+ .parse(isObj, ()=>({
24
+ transform: cloneDeep,
25
+ remove (key, data) {
26
+ return omit(key, data);
27
+ },
28
+ set (key, value, data) {
29
+ return {
30
+ ...data,
31
+ [key]: value
32
+ };
33
+ },
34
+ keys (data) {
35
+ return Object.keys(data);
36
+ },
37
+ get (key, data) {
38
+ return data[key];
39
+ }
40
+ }))// Ignore null or undefined values
41
+ .ignore(({ value })=>isNil(value))// Recursion on operators (non attributes)
42
+ .on(({ attribute })=>isNil(attribute), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
43
+ const parent = {
44
+ key,
45
+ path,
46
+ schema,
47
+ attribute
48
+ };
49
+ set(key, await recurse(visitor, {
50
+ schema,
51
+ path,
52
+ getModel,
53
+ parent
54
+ }, value));
55
+ })// Handle relation recursion
56
+ .onRelation(async ({ key, attribute, visitor, path, value, schema, getModel }, { set, recurse })=>{
57
+ const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
58
+ if (isMorphRelation) {
59
+ return;
60
+ }
61
+ const parent = {
62
+ key,
63
+ path,
64
+ schema,
65
+ attribute
66
+ };
67
+ const targetSchemaUID = attribute.target;
68
+ const targetSchema = getModel(targetSchemaUID);
69
+ const newValue = await recurse(visitor, {
70
+ schema: targetSchema,
71
+ path,
72
+ getModel,
73
+ parent
74
+ }, value);
75
+ set(key, newValue);
76
+ }).onComponent(async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse })=>{
77
+ const parent = {
78
+ key,
79
+ path,
80
+ schema,
81
+ attribute
82
+ };
83
+ const targetSchema = getModel(attribute.component);
84
+ const newValue = await recurse(visitor, {
85
+ schema: targetSchema,
86
+ path,
87
+ getModel,
88
+ parent
89
+ }, value);
90
+ set(key, newValue);
91
+ })// Handle media recursion
92
+ .onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse })=>{
93
+ const parent = {
94
+ key,
95
+ path,
96
+ schema,
97
+ attribute
98
+ };
99
+ const targetSchemaUID = 'plugin::upload.file';
100
+ const targetSchema = getModel(targetSchemaUID);
101
+ const newValue = await recurse(visitor, {
102
+ schema: targetSchema,
103
+ path,
104
+ getModel,
105
+ parent
106
+ }, value);
107
+ set(key, newValue);
108
+ });
109
+ var traverseQueryFilters = curry(filters.traverse);
110
+
111
+ export { traverseQueryFilters as default };
112
+ //# sourceMappingURL=query-filters.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-filters.mjs","sources":["../../src/traverse/query-filters.ts"],"sourcesContent":["import { curry, isObject, isEmpty, isArray, isNil, cloneDeep, omit } from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n isArray,\n async (visitor, options, filters, { recurse }) => {\n return Promise.all(\n filters.map((filter, i) => {\n // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]\n // can have a value array, thus we can update the raw path but not the attribute one\n const newPath = options.path\n ? { ...options.path, raw: `${options.path.raw}[${i}]` }\n : options.path;\n\n return recurse(visitor, { ...options, path: newPath }, filter);\n })\n // todo: move that to the visitors\n ).then((res) => res.filter((val) => !(isObject(val) && isEmpty(val))));\n }\n )\n .intercept(\n // Ignore non object filters and return the value as-is\n (filters): filters is unknown => !isObject(filters),\n (_, __, filters) => {\n return filters;\n }\n )\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n return omit(key, data);\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Ignore null or undefined values\n .ignore(({ value }) => isNil(value))\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => isNil(attribute),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n set(key, await recurse(visitor, { schema, path, getModel, parent }, value));\n }\n )\n // Handle relation recursion\n .onRelation(\n async ({ key, attribute, visitor, path, value, schema, getModel }, { 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 .onComponent(\n async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle media recursion\n .onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse }) => {\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\nexport default curry(filters.traverse);\n"],"names":["isObj","value","isObject","filters","traverseFactory","intercept","isArray","visitor","options","recurse","Promise","all","map","filter","i","newPath","path","raw","then","res","val","isEmpty","_","__","parse","transform","cloneDeep","remove","key","data","omit","set","keys","Object","get","ignore","isNil","on","attribute","schema","getModel","parent","onRelation","isMorphRelation","relation","toLowerCase","startsWith","targetSchemaUID","target","targetSchema","newValue","onComponent","component","onMedia","curry","traverse"],"mappings":"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"}
@@ -0,0 +1,280 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var factory = require('./factory.js');
5
+ var contentTypes = require('../content-types.js');
6
+
7
+ const isKeyword = (keyword)=>{
8
+ return ({ key, attribute })=>{
9
+ return !attribute && keyword === key;
10
+ };
11
+ };
12
+ const isWildcard = (value)=>value === '*';
13
+ const isPopulateString = (value)=>{
14
+ return fp.isString(value) && !isWildcard(value);
15
+ };
16
+ const isStringArray = (value)=>fp.isArray(value) && value.every(fp.isString);
17
+ const isObj = (value)=>fp.isObject(value);
18
+ const populate = factory().intercept(isPopulateString, async (visitor, options, populate, { recurse })=>{
19
+ /**
20
+ * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)
21
+ * This gives a consistent structure to track the "parent" node of each nested populate clause
22
+ */ const populateObject = pathsToObjectPopulate([
23
+ populate
24
+ ]);
25
+ const traversedPopulate = await recurse(visitor, options, populateObject);
26
+ const [result] = objectPopulateToPaths(traversedPopulate);
27
+ return result;
28
+ })// Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items
29
+ .intercept(isStringArray, async (visitor, options, populate, { recurse })=>{
30
+ const paths = await Promise.all(populate.map((subClause)=>recurse(visitor, options, subClause)));
31
+ return paths.filter((item)=>!fp.isNil(item));
32
+ })// for wildcard, generate custom utilities to modify the values
33
+ .parse(isWildcard, ()=>({
34
+ /**
35
+ * Since value is '*', we don't need to transform it
36
+ */ transform: fp.identity,
37
+ /**
38
+ * '*' isn't a key/value structure, so regardless
39
+ * of the given key, it returns the data ('*')
40
+ */ get: (_key, data)=>data,
41
+ /**
42
+ * '*' isn't a key/value structure, so regardless
43
+ * of the given `key`, use `value` as the new `data`
44
+ */ set: (_key, value)=>value,
45
+ /**
46
+ * '*' isn't a key/value structure, but we need to simulate at least one to enable
47
+ * the data traversal. We're using '' since it represents a falsy string value
48
+ */ keys: fp.constant([
49
+ ''
50
+ ]),
51
+ /**
52
+ * Removing '*' means setting it to undefined, regardless of the given key
53
+ */ remove: fp.constant(undefined)
54
+ }))// Parse string values
55
+ .parse(fp.isString, ()=>{
56
+ const tokenize = fp.split('.');
57
+ const recompose = fp.join('.');
58
+ return {
59
+ transform: fp.trim,
60
+ remove (key, data) {
61
+ const [root] = tokenize(data);
62
+ return root === key ? undefined : data;
63
+ },
64
+ set (key, value, data) {
65
+ const [root] = tokenize(data);
66
+ if (root !== key) {
67
+ return data;
68
+ }
69
+ return fp.isNil(value) || fp.isEmpty(value) ? root : `${root}.${value}`;
70
+ },
71
+ keys (data) {
72
+ const v = fp.first(tokenize(data));
73
+ return v ? [
74
+ v
75
+ ] : [];
76
+ },
77
+ get (key, data) {
78
+ const [root, ...rest] = tokenize(data);
79
+ return key === root ? recompose(rest) : undefined;
80
+ }
81
+ };
82
+ })// Parse object values
83
+ .parse(isObj, ()=>({
84
+ transform: fp.cloneDeep,
85
+ remove (key, data) {
86
+ // eslint-disable-next-line no-unused-vars
87
+ const { [key]: ignored, ...rest } = data;
88
+ return rest;
89
+ },
90
+ set (key, value, data) {
91
+ return {
92
+ ...data,
93
+ [key]: value
94
+ };
95
+ },
96
+ keys (data) {
97
+ return Object.keys(data);
98
+ },
99
+ get (key, data) {
100
+ return data[key];
101
+ }
102
+ })).ignore(({ key, attribute })=>{
103
+ // we don't want to recurse using traversePopulate and instead let
104
+ // the visitors recurse with the appropriate traversal (sort, filters, etc...)
105
+ return [
106
+ 'sort',
107
+ 'filters',
108
+ 'fields'
109
+ ].includes(key) && !attribute;
110
+ }).on(// Handle recursion on populate."populate"
111
+ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
112
+ const parent = {
113
+ key,
114
+ path,
115
+ schema,
116
+ attribute
117
+ };
118
+ const newValue = await recurse(visitor, {
119
+ schema,
120
+ path,
121
+ getModel,
122
+ parent
123
+ }, value);
124
+ set(key, newValue);
125
+ }).on(isKeyword('on'), async ({ key, visitor, path, value, getModel, parent }, { set, recurse })=>{
126
+ const newOn = {};
127
+ if (!isObj(value)) {
128
+ return;
129
+ }
130
+ for (const [uid, subPopulate] of Object.entries(value)){
131
+ const model = getModel(uid);
132
+ const newPath = {
133
+ ...path,
134
+ raw: `${path.raw}[${uid}]`
135
+ };
136
+ newOn[uid] = await recurse(visitor, {
137
+ schema: model,
138
+ path: newPath,
139
+ getModel,
140
+ parent
141
+ }, subPopulate);
142
+ }
143
+ set(key, newOn);
144
+ })// Handle populate on relation
145
+ .onRelation(async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse })=>{
146
+ if (fp.isNil(value)) {
147
+ return;
148
+ }
149
+ const parent = {
150
+ key,
151
+ path,
152
+ schema,
153
+ attribute
154
+ };
155
+ if (contentTypes.isMorphToRelationalAttribute(attribute)) {
156
+ // Don't traverse values that cannot be parsed
157
+ if (!fp.isObject(value) || !('on' in value && fp.isObject(value?.on))) {
158
+ return;
159
+ }
160
+ // If there is a populate fragment defined, traverse it
161
+ const newValue = await recurse(visitor, {
162
+ schema,
163
+ path,
164
+ getModel,
165
+ parent
166
+ }, {
167
+ on: value?.on
168
+ });
169
+ set(key, newValue);
170
+ return;
171
+ }
172
+ const targetSchemaUID = attribute.target;
173
+ const targetSchema = getModel(targetSchemaUID);
174
+ const newValue = await recurse(visitor, {
175
+ schema: targetSchema,
176
+ path,
177
+ getModel,
178
+ parent
179
+ }, value);
180
+ set(key, newValue);
181
+ })// Handle populate on media
182
+ .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set })=>{
183
+ if (fp.isNil(value)) {
184
+ return;
185
+ }
186
+ const parent = {
187
+ key,
188
+ path,
189
+ schema,
190
+ attribute
191
+ };
192
+ const targetSchemaUID = 'plugin::upload.file';
193
+ const targetSchema = getModel(targetSchemaUID);
194
+ const newValue = await recurse(visitor, {
195
+ schema: targetSchema,
196
+ path,
197
+ getModel,
198
+ parent
199
+ }, value);
200
+ set(key, newValue);
201
+ })// Handle populate on components
202
+ .onComponent(async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set })=>{
203
+ if (fp.isNil(value)) {
204
+ return;
205
+ }
206
+ const parent = {
207
+ key,
208
+ path,
209
+ schema,
210
+ attribute
211
+ };
212
+ const targetSchema = getModel(attribute.component);
213
+ const newValue = await recurse(visitor, {
214
+ schema: targetSchema,
215
+ path,
216
+ getModel,
217
+ parent
218
+ }, value);
219
+ set(key, newValue);
220
+ })// Handle populate on dynamic zones
221
+ .onDynamicZone(async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse })=>{
222
+ if (fp.isNil(value) || !fp.isObject(value)) {
223
+ return;
224
+ }
225
+ const parent = {
226
+ key,
227
+ path,
228
+ schema,
229
+ attribute
230
+ };
231
+ // Handle fragment syntax
232
+ if ('on' in value && value.on) {
233
+ const newOn = await recurse(visitor, {
234
+ schema,
235
+ path,
236
+ getModel,
237
+ parent
238
+ }, {
239
+ on: value.on
240
+ });
241
+ set(key, newOn);
242
+ }
243
+ });
244
+ var traverseQueryPopulate = fp.curry(populate.traverse);
245
+ const objectPopulateToPaths = (input)=>{
246
+ const paths = [];
247
+ function traverse(currentObj, parentPath) {
248
+ for (const [key, value] of Object.entries(currentObj)){
249
+ const currentPath = parentPath ? `${parentPath}.${key}` : key;
250
+ if (value === true) {
251
+ paths.push(currentPath);
252
+ } else {
253
+ traverse(value.populate, currentPath);
254
+ }
255
+ }
256
+ }
257
+ traverse(input, '');
258
+ return paths;
259
+ };
260
+ const pathsToObjectPopulate = (input)=>{
261
+ const result = {};
262
+ function traverse(object, keys) {
263
+ const [first, ...rest] = keys;
264
+ if (rest.length === 0) {
265
+ object[first] = true;
266
+ } else {
267
+ if (!object[first] || typeof object[first] === 'boolean') {
268
+ object[first] = {
269
+ populate: {}
270
+ };
271
+ }
272
+ traverse(object[first].populate, rest);
273
+ }
274
+ }
275
+ input.forEach((clause)=>traverse(result, clause.split('.')));
276
+ return result;
277
+ };
278
+
279
+ module.exports = traverseQueryPopulate;
280
+ //# sourceMappingURL=query-populate.js.map