@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 @@
1
+ {"version":3,"file":"query-populate.js","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import {\n curry,\n isString,\n isArray,\n isEmpty,\n split,\n isObject,\n trim,\n constant,\n isNil,\n identity,\n cloneDeep,\n join,\n first,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const [result] = objectPopulateToPaths(traversedPopulate);\n\n return result;\n })\n // Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const paths = await Promise.all(\n populate.map((subClause) => recurse(visitor, options, subClause))\n );\n\n return paths.filter((item) => !isNil(item));\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = split('.');\n const recompose = join('.');\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n .ignore(({ key, attribute }) => {\n // we don't want to recurse using traversePopulate and instead let\n // the visitors recurse with the appropriate traversal (sort, filters, etc...)\n return ['sort', 'filters', 'fields'].includes(key) && !attribute;\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, newValue);\n\n return;\n }\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (isNil(value) || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string) {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n traverse((value as { populate: PopulateObject }).populate, currentPath);\n }\n }\n }\n\n traverse(input, '');\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n"],"names":["isKeyword","keyword","key","attribute","isWildcard","value","isPopulateString","isString","isStringArray","isArray","every","isObj","isObject","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","result","objectPopulateToPaths","paths","Promise","all","map","subClause","filter","item","isNil","parse","transform","identity","get","_key","data","set","keys","constant","remove","undefined","tokenize","split","recompose","join","trim","root","isEmpty","v","first","rest","cloneDeep","ignored","Object","ignore","includes","on","path","schema","getModel","parent","newValue","newOn","uid","subPopulate","entries","model","newPath","raw","onRelation","isMorphToRelationalAttribute","targetSchemaUID","target","targetSchema","onMedia","onComponent","component","onDynamicZone","curry","traverse","input","currentObj","parentPath","currentPath","push","object","length","forEach","clause"],"mappings":"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"}
@@ -0,0 +1,278 @@
1
+ import { isNil, identity, constant, isString, split, join, trim, isEmpty, first, cloneDeep, isObject, curry, isArray } from 'lodash/fp';
2
+ import traverseFactory from './factory.mjs';
3
+ import { isMorphToRelationalAttribute } from '../content-types.mjs';
4
+
5
+ const isKeyword = (keyword)=>{
6
+ return ({ key, attribute })=>{
7
+ return !attribute && keyword === key;
8
+ };
9
+ };
10
+ const isWildcard = (value)=>value === '*';
11
+ const isPopulateString = (value)=>{
12
+ return isString(value) && !isWildcard(value);
13
+ };
14
+ const isStringArray = (value)=>isArray(value) && value.every(isString);
15
+ const isObj = (value)=>isObject(value);
16
+ const populate = traverseFactory().intercept(isPopulateString, async (visitor, options, populate, { recurse })=>{
17
+ /**
18
+ * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)
19
+ * This gives a consistent structure to track the "parent" node of each nested populate clause
20
+ */ const populateObject = pathsToObjectPopulate([
21
+ populate
22
+ ]);
23
+ const traversedPopulate = await recurse(visitor, options, populateObject);
24
+ const [result] = objectPopulateToPaths(traversedPopulate);
25
+ return result;
26
+ })// Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items
27
+ .intercept(isStringArray, async (visitor, options, populate, { recurse })=>{
28
+ const paths = await Promise.all(populate.map((subClause)=>recurse(visitor, options, subClause)));
29
+ return paths.filter((item)=>!isNil(item));
30
+ })// for wildcard, generate custom utilities to modify the values
31
+ .parse(isWildcard, ()=>({
32
+ /**
33
+ * Since value is '*', we don't need to transform it
34
+ */ transform: identity,
35
+ /**
36
+ * '*' isn't a key/value structure, so regardless
37
+ * of the given key, it returns the data ('*')
38
+ */ get: (_key, data)=>data,
39
+ /**
40
+ * '*' isn't a key/value structure, so regardless
41
+ * of the given `key`, use `value` as the new `data`
42
+ */ set: (_key, value)=>value,
43
+ /**
44
+ * '*' isn't a key/value structure, but we need to simulate at least one to enable
45
+ * the data traversal. We're using '' since it represents a falsy string value
46
+ */ keys: constant([
47
+ ''
48
+ ]),
49
+ /**
50
+ * Removing '*' means setting it to undefined, regardless of the given key
51
+ */ remove: constant(undefined)
52
+ }))// Parse string values
53
+ .parse(isString, ()=>{
54
+ const tokenize = split('.');
55
+ const recompose = join('.');
56
+ return {
57
+ transform: trim,
58
+ remove (key, data) {
59
+ const [root] = tokenize(data);
60
+ return root === key ? undefined : data;
61
+ },
62
+ set (key, value, data) {
63
+ const [root] = tokenize(data);
64
+ if (root !== key) {
65
+ return data;
66
+ }
67
+ return isNil(value) || isEmpty(value) ? root : `${root}.${value}`;
68
+ },
69
+ keys (data) {
70
+ const v = first(tokenize(data));
71
+ return v ? [
72
+ v
73
+ ] : [];
74
+ },
75
+ get (key, data) {
76
+ const [root, ...rest] = tokenize(data);
77
+ return key === root ? recompose(rest) : undefined;
78
+ }
79
+ };
80
+ })// Parse object values
81
+ .parse(isObj, ()=>({
82
+ transform: cloneDeep,
83
+ remove (key, data) {
84
+ // eslint-disable-next-line no-unused-vars
85
+ const { [key]: ignored, ...rest } = data;
86
+ return rest;
87
+ },
88
+ set (key, value, data) {
89
+ return {
90
+ ...data,
91
+ [key]: value
92
+ };
93
+ },
94
+ keys (data) {
95
+ return Object.keys(data);
96
+ },
97
+ get (key, data) {
98
+ return data[key];
99
+ }
100
+ })).ignore(({ key, attribute })=>{
101
+ // we don't want to recurse using traversePopulate and instead let
102
+ // the visitors recurse with the appropriate traversal (sort, filters, etc...)
103
+ return [
104
+ 'sort',
105
+ 'filters',
106
+ 'fields'
107
+ ].includes(key) && !attribute;
108
+ }).on(// Handle recursion on populate."populate"
109
+ isKeyword('populate'), async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse })=>{
110
+ const parent = {
111
+ key,
112
+ path,
113
+ schema,
114
+ attribute
115
+ };
116
+ const newValue = await recurse(visitor, {
117
+ schema,
118
+ path,
119
+ getModel,
120
+ parent
121
+ }, value);
122
+ set(key, newValue);
123
+ }).on(isKeyword('on'), async ({ key, visitor, path, value, getModel, parent }, { set, recurse })=>{
124
+ const newOn = {};
125
+ if (!isObj(value)) {
126
+ return;
127
+ }
128
+ for (const [uid, subPopulate] of Object.entries(value)){
129
+ const model = getModel(uid);
130
+ const newPath = {
131
+ ...path,
132
+ raw: `${path.raw}[${uid}]`
133
+ };
134
+ newOn[uid] = await recurse(visitor, {
135
+ schema: model,
136
+ path: newPath,
137
+ getModel,
138
+ parent
139
+ }, subPopulate);
140
+ }
141
+ set(key, newOn);
142
+ })// Handle populate on relation
143
+ .onRelation(async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse })=>{
144
+ if (isNil(value)) {
145
+ return;
146
+ }
147
+ const parent = {
148
+ key,
149
+ path,
150
+ schema,
151
+ attribute
152
+ };
153
+ if (isMorphToRelationalAttribute(attribute)) {
154
+ // Don't traverse values that cannot be parsed
155
+ if (!isObject(value) || !('on' in value && isObject(value?.on))) {
156
+ return;
157
+ }
158
+ // If there is a populate fragment defined, traverse it
159
+ const newValue = await recurse(visitor, {
160
+ schema,
161
+ path,
162
+ getModel,
163
+ parent
164
+ }, {
165
+ on: value?.on
166
+ });
167
+ set(key, newValue);
168
+ return;
169
+ }
170
+ const targetSchemaUID = attribute.target;
171
+ const targetSchema = getModel(targetSchemaUID);
172
+ const newValue = await recurse(visitor, {
173
+ schema: targetSchema,
174
+ path,
175
+ getModel,
176
+ parent
177
+ }, value);
178
+ set(key, newValue);
179
+ })// Handle populate on media
180
+ .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set })=>{
181
+ if (isNil(value)) {
182
+ return;
183
+ }
184
+ const parent = {
185
+ key,
186
+ path,
187
+ schema,
188
+ attribute
189
+ };
190
+ const targetSchemaUID = 'plugin::upload.file';
191
+ const targetSchema = getModel(targetSchemaUID);
192
+ const newValue = await recurse(visitor, {
193
+ schema: targetSchema,
194
+ path,
195
+ getModel,
196
+ parent
197
+ }, value);
198
+ set(key, newValue);
199
+ })// Handle populate on components
200
+ .onComponent(async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set })=>{
201
+ if (isNil(value)) {
202
+ return;
203
+ }
204
+ const parent = {
205
+ key,
206
+ path,
207
+ schema,
208
+ attribute
209
+ };
210
+ const targetSchema = getModel(attribute.component);
211
+ const newValue = await recurse(visitor, {
212
+ schema: targetSchema,
213
+ path,
214
+ getModel,
215
+ parent
216
+ }, value);
217
+ set(key, newValue);
218
+ })// Handle populate on dynamic zones
219
+ .onDynamicZone(async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse })=>{
220
+ if (isNil(value) || !isObject(value)) {
221
+ return;
222
+ }
223
+ const parent = {
224
+ key,
225
+ path,
226
+ schema,
227
+ attribute
228
+ };
229
+ // Handle fragment syntax
230
+ if ('on' in value && value.on) {
231
+ const newOn = await recurse(visitor, {
232
+ schema,
233
+ path,
234
+ getModel,
235
+ parent
236
+ }, {
237
+ on: value.on
238
+ });
239
+ set(key, newOn);
240
+ }
241
+ });
242
+ var traverseQueryPopulate = curry(populate.traverse);
243
+ const objectPopulateToPaths = (input)=>{
244
+ const paths = [];
245
+ function traverse(currentObj, parentPath) {
246
+ for (const [key, value] of Object.entries(currentObj)){
247
+ const currentPath = parentPath ? `${parentPath}.${key}` : key;
248
+ if (value === true) {
249
+ paths.push(currentPath);
250
+ } else {
251
+ traverse(value.populate, currentPath);
252
+ }
253
+ }
254
+ }
255
+ traverse(input, '');
256
+ return paths;
257
+ };
258
+ const pathsToObjectPopulate = (input)=>{
259
+ const result = {};
260
+ function traverse(object, keys) {
261
+ const [first, ...rest] = keys;
262
+ if (rest.length === 0) {
263
+ object[first] = true;
264
+ } else {
265
+ if (!object[first] || typeof object[first] === 'boolean') {
266
+ object[first] = {
267
+ populate: {}
268
+ };
269
+ }
270
+ traverse(object[first].populate, rest);
271
+ }
272
+ }
273
+ input.forEach((clause)=>traverse(result, clause.split('.')));
274
+ return result;
275
+ };
276
+
277
+ export { traverseQueryPopulate as default };
278
+ //# sourceMappingURL=query-populate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-populate.mjs","sources":["../../src/traverse/query-populate.ts"],"sourcesContent":["import {\n curry,\n isString,\n isArray,\n isEmpty,\n split,\n isObject,\n trim,\n constant,\n isNil,\n identity,\n cloneDeep,\n join,\n first,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const [result] = objectPopulateToPaths(traversedPopulate);\n\n return result;\n })\n // Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const paths = await Promise.all(\n populate.map((subClause) => recurse(visitor, options, subClause))\n );\n\n return paths.filter((item) => !isNil(item));\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = split('.');\n const recompose = join('.');\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n .ignore(({ key, attribute }) => {\n // we don't want to recurse using traversePopulate and instead let\n // the visitors recurse with the appropriate traversal (sort, filters, etc...)\n return ['sort', 'filters', 'fields'].includes(key) && !attribute;\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, newValue);\n\n return;\n }\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (isNil(value) || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string) {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n traverse((value as { populate: PopulateObject }).populate, currentPath);\n }\n }\n }\n\n traverse(input, '');\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n"],"names":["isKeyword","keyword","key","attribute","isWildcard","value","isPopulateString","isString","isStringArray","isArray","every","isObj","isObject","populate","traverseFactory","intercept","visitor","options","recurse","populateObject","pathsToObjectPopulate","traversedPopulate","result","objectPopulateToPaths","paths","Promise","all","map","subClause","filter","item","isNil","parse","transform","identity","get","_key","data","set","keys","constant","remove","undefined","tokenize","split","recompose","join","trim","root","isEmpty","v","first","rest","cloneDeep","ignored","Object","ignore","includes","on","path","schema","getModel","parent","newValue","newOn","uid","subPopulate","entries","model","newPath","raw","onRelation","isMorphToRelationalAttribute","targetSchemaUID","target","targetSchema","onMedia","onComponent","component","onDynamicZone","curry","traverse","input","currentObj","parentPath","currentPath","push","object","length","forEach","clause"],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var factory = require('./factory.js');
5
+
6
+ const ORDERS = {
7
+ asc: 'asc',
8
+ desc: 'desc'
9
+ };
10
+ const ORDER_VALUES = Object.values(ORDERS);
11
+ const isSortOrder = (value)=>ORDER_VALUES.includes(value.toLowerCase());
12
+ const isStringArray = (value)=>Array.isArray(value) && value.every(fp.isString);
13
+ const isObjectArray = (value)=>Array.isArray(value) && value.every(fp.isObject);
14
+ const isNestedSorts = (value)=>fp.isString(value) && value.split(',').length > 1;
15
+ const isObj = (value)=>fp.isObject(value);
16
+ const sort = factory().intercept(// String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose
17
+ isNestedSorts, async (visitor, options, sort, { recurse })=>{
18
+ return Promise.all(sort.split(',').map(fp.trim).map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((part)=>!fp.isEmpty(part)).join(','));
19
+ }).intercept(// Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items
20
+ isStringArray, async (visitor, options, sort, { recurse })=>{
21
+ return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!fp.isEmpty(nestedSort)));
22
+ }).intercept(// Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items
23
+ isObjectArray, async (visitor, options, sort, { recurse })=>{
24
+ return Promise.all(sort.map((nestedSort)=>recurse(visitor, options, nestedSort))).then((res)=>res.filter((nestedSort)=>!fp.isEmpty(nestedSort)));
25
+ })// Parse string values
26
+ .parse(fp.isString, ()=>{
27
+ const tokenize = fp.pipe(fp.split('.'), fp.map(fp.split(':')), fp.flatten);
28
+ const recompose = (parts)=>{
29
+ if (parts.length === 0) {
30
+ return undefined;
31
+ }
32
+ return parts.reduce((acc, part)=>{
33
+ if (fp.isEmpty(part)) {
34
+ return acc;
35
+ }
36
+ if (acc === '') {
37
+ return part;
38
+ }
39
+ return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;
40
+ }, '');
41
+ };
42
+ return {
43
+ transform: fp.trim,
44
+ remove (key, data) {
45
+ const [root] = tokenize(data);
46
+ return root === key ? undefined : data;
47
+ },
48
+ set (key, value, data) {
49
+ const [root] = tokenize(data);
50
+ if (root !== key) {
51
+ return data;
52
+ }
53
+ return fp.isNil(value) ? root : `${root}.${value}`;
54
+ },
55
+ keys (data) {
56
+ const v = fp.first(tokenize(data));
57
+ return v ? [
58
+ v
59
+ ] : [];
60
+ },
61
+ get (key, data) {
62
+ const [root, ...rest] = tokenize(data);
63
+ return key === root ? recompose(rest) : undefined;
64
+ }
65
+ };
66
+ })// Parse object values
67
+ .parse(isObj, ()=>({
68
+ transform: fp.cloneDeep,
69
+ remove (key, data) {
70
+ // eslint-disable-next-line no-unused-vars
71
+ const { [key]: ignored, ...rest } = data;
72
+ return rest;
73
+ },
74
+ set (key, value, data) {
75
+ return {
76
+ ...data,
77
+ [key]: value
78
+ };
79
+ },
80
+ keys (data) {
81
+ return Object.keys(data);
82
+ },
83
+ get (key, data) {
84
+ return data[key];
85
+ }
86
+ }))// Handle deep sort on relation
87
+ .onRelation(async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse })=>{
88
+ const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
89
+ if (isMorphRelation) {
90
+ return;
91
+ }
92
+ const parent = {
93
+ key,
94
+ path,
95
+ schema,
96
+ attribute
97
+ };
98
+ const targetSchemaUID = attribute.target;
99
+ const targetSchema = getModel(targetSchemaUID);
100
+ const newValue = await recurse(visitor, {
101
+ schema: targetSchema,
102
+ path,
103
+ getModel,
104
+ parent
105
+ }, value);
106
+ set(key, newValue);
107
+ })// Handle deep sort on media
108
+ .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set })=>{
109
+ const parent = {
110
+ key,
111
+ path,
112
+ schema,
113
+ attribute
114
+ };
115
+ const targetSchemaUID = 'plugin::upload.file';
116
+ const targetSchema = getModel(targetSchemaUID);
117
+ const newValue = await recurse(visitor, {
118
+ schema: targetSchema,
119
+ path,
120
+ getModel,
121
+ parent
122
+ }, value);
123
+ set(key, newValue);
124
+ })// Handle deep sort on components
125
+ .onComponent(async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set })=>{
126
+ const parent = {
127
+ key,
128
+ path,
129
+ schema,
130
+ attribute
131
+ };
132
+ const targetSchema = getModel(attribute.component);
133
+ const newValue = await recurse(visitor, {
134
+ schema: targetSchema,
135
+ path,
136
+ getModel,
137
+ parent
138
+ }, value);
139
+ set(key, newValue);
140
+ });
141
+ var traverseQuerySort = fp.curry(sort.traverse);
142
+
143
+ module.exports = traverseQuerySort;
144
+ //# sourceMappingURL=query-sort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-sort.js","sources":["../../src/traverse/query-sort.ts"],"sourcesContent":["import {\n curry,\n isString,\n isObject,\n map,\n trim,\n split,\n isEmpty,\n flatten,\n pipe,\n isNil,\n first,\n cloneDeep,\n} from 'lodash/fp';\n\nimport 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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"}