@strapi/content-manager 5.56.0 → 5.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dist/admin/components/ConfigurationForm/Form.js +3 -3
  2. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Form.mjs +2 -2
  4. package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
  5. package/dist/admin/components/RelativeTime.js +9 -0
  6. package/dist/admin/components/RelativeTime.js.map +1 -1
  7. package/dist/admin/components/RelativeTime.mjs +10 -1
  8. package/dist/admin/components/RelativeTime.mjs.map +1 -1
  9. package/dist/admin/features/DocumentRBAC.js +0 -3
  10. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  11. package/dist/admin/features/DocumentRBAC.mjs +1 -4
  12. package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
  13. package/dist/admin/history/components/VersionContent.js +3 -3
  14. package/dist/admin/history/components/VersionContent.js.map +1 -1
  15. package/dist/admin/history/components/VersionContent.mjs +2 -2
  16. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  17. package/dist/admin/history/pages/History.js +2 -1
  18. package/dist/admin/history/pages/History.js.map +1 -1
  19. package/dist/admin/history/pages/History.mjs +3 -2
  20. package/dist/admin/history/pages/History.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/EditViewPage.js +2 -2
  22. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  23. package/dist/admin/pages/EditView/EditViewPage.mjs +2 -2
  24. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/components/DocumentActions.js +37 -2
  26. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  27. package/dist/admin/pages/EditView/components/DocumentActions.mjs +37 -3
  28. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +1 -0
  30. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +1 -0
  32. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +3 -3
  34. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +2 -2
  36. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +30 -2
  38. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +31 -4
  40. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +14 -2
  42. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +14 -2
  44. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/utils/data.js +3 -3
  46. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  47. package/dist/admin/pages/EditView/utils/data.mjs +2 -2
  48. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  49. package/dist/admin/pages/ListView/ListViewPage.js +4 -3
  50. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  51. package/dist/admin/pages/ListView/ListViewPage.mjs +4 -3
  52. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  53. package/dist/admin/preview/pages/Preview.js +2 -1
  54. package/dist/admin/preview/pages/Preview.js.map +1 -1
  55. package/dist/admin/preview/pages/Preview.mjs +3 -2
  56. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  57. package/dist/admin/services/documents.js +3 -2
  58. package/dist/admin/services/documents.js.map +1 -1
  59. package/dist/admin/services/documents.mjs +2 -2
  60. package/dist/admin/services/documents.mjs.map +1 -1
  61. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +2 -1
  62. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +19 -2
  63. package/dist/admin/src/services/documents.d.ts +10 -2
  64. package/dist/admin/translations/en.json.js +2 -0
  65. package/dist/admin/translations/en.json.js.map +1 -1
  66. package/dist/admin/translations/en.json.mjs +2 -0
  67. package/dist/admin/translations/en.json.mjs.map +1 -1
  68. package/dist/admin/utils/validation.js +3 -3
  69. package/dist/admin/utils/validation.js.map +1 -1
  70. package/dist/admin/utils/validation.mjs +2 -2
  71. package/dist/admin/utils/validation.mjs.map +1 -1
  72. package/dist/server/controllers/collection-types.js +4 -4
  73. package/dist/server/controllers/collection-types.js.map +1 -1
  74. package/dist/server/controllers/collection-types.mjs +4 -4
  75. package/dist/server/controllers/collection-types.mjs.map +1 -1
  76. package/dist/server/controllers/content-types.js +5 -7
  77. package/dist/server/controllers/content-types.js.map +1 -1
  78. package/dist/server/controllers/content-types.mjs +5 -7
  79. package/dist/server/controllers/content-types.mjs.map +1 -1
  80. package/dist/server/controllers/relations.js +19 -15
  81. package/dist/server/controllers/relations.js.map +1 -1
  82. package/dist/server/controllers/relations.mjs +17 -13
  83. package/dist/server/controllers/relations.mjs.map +1 -1
  84. package/dist/server/controllers/utils/clone.js +3 -4
  85. package/dist/server/controllers/utils/clone.js.map +1 -1
  86. package/dist/server/controllers/utils/clone.mjs +4 -5
  87. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  88. package/dist/server/controllers/validation/index.js +1 -1
  89. package/dist/server/controllers/validation/index.mjs +1 -1
  90. package/dist/server/history/controllers/history-version.js +3 -3
  91. package/dist/server/history/controllers/history-version.js.map +1 -1
  92. package/dist/server/history/controllers/history-version.mjs +3 -3
  93. package/dist/server/history/controllers/history-version.mjs.map +1 -1
  94. package/dist/server/history/services/history.js +4 -4
  95. package/dist/server/history/services/history.js.map +1 -1
  96. package/dist/server/history/services/history.mjs +4 -4
  97. package/dist/server/history/services/history.mjs.map +1 -1
  98. package/dist/server/history/services/lifecycles.js +8 -8
  99. package/dist/server/history/services/lifecycles.js.map +1 -1
  100. package/dist/server/history/services/lifecycles.mjs +3 -3
  101. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  102. package/dist/server/history/services/utils.js +7 -10
  103. package/dist/server/history/services/utils.js.map +1 -1
  104. package/dist/server/history/services/utils.mjs +5 -8
  105. package/dist/server/history/services/utils.mjs.map +1 -1
  106. package/dist/server/mcp/permissions.js +2 -2
  107. package/dist/server/mcp/permissions.js.map +1 -1
  108. package/dist/server/mcp/permissions.mjs +2 -2
  109. package/dist/server/mcp/permissions.mjs.map +1 -1
  110. package/dist/server/mcp/register-content-manager-mcp-tools.js +7 -5
  111. package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
  112. package/dist/server/mcp/register-content-manager-mcp-tools.mjs +7 -5
  113. package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
  114. package/dist/server/preview/controllers/previewScript.js +30 -15
  115. package/dist/server/preview/controllers/validation/preview.js +3 -3
  116. package/dist/server/preview/controllers/validation/preview.js.map +1 -1
  117. package/dist/server/preview/controllers/validation/preview.mjs +3 -3
  118. package/dist/server/preview/controllers/validation/preview.mjs.map +1 -1
  119. package/dist/server/services/components.js +3 -3
  120. package/dist/server/services/components.js.map +1 -1
  121. package/dist/server/services/components.mjs +3 -3
  122. package/dist/server/services/components.mjs.map +1 -1
  123. package/dist/server/services/content-structure.js +2 -2
  124. package/dist/server/services/content-structure.js.map +1 -1
  125. package/dist/server/services/content-structure.mjs +2 -2
  126. package/dist/server/services/content-structure.mjs.map +1 -1
  127. package/dist/server/services/content-types.js +3 -3
  128. package/dist/server/services/content-types.js.map +1 -1
  129. package/dist/server/services/content-types.mjs +3 -3
  130. package/dist/server/services/content-types.mjs.map +1 -1
  131. package/dist/server/services/data-mapper.js +3 -3
  132. package/dist/server/services/data-mapper.js.map +1 -1
  133. package/dist/server/services/data-mapper.mjs +3 -3
  134. package/dist/server/services/data-mapper.mjs.map +1 -1
  135. package/dist/server/services/document-manager.js +6 -6
  136. package/dist/server/services/document-manager.js.map +1 -1
  137. package/dist/server/services/document-manager.mjs +6 -6
  138. package/dist/server/services/document-manager.mjs.map +1 -1
  139. package/dist/server/services/document-metadata.js +29 -31
  140. package/dist/server/services/document-metadata.js.map +1 -1
  141. package/dist/server/services/document-metadata.mjs +29 -31
  142. package/dist/server/services/document-metadata.mjs.map +1 -1
  143. package/dist/server/services/metrics.js +3 -3
  144. package/dist/server/services/metrics.js.map +1 -1
  145. package/dist/server/services/metrics.mjs +3 -3
  146. package/dist/server/services/metrics.mjs.map +1 -1
  147. package/dist/server/services/permission-checker.js +2 -2
  148. package/dist/server/services/permission-checker.js.map +1 -1
  149. package/dist/server/services/permission-checker.mjs +1 -1
  150. package/dist/server/services/permission-checker.mjs.map +1 -1
  151. package/dist/server/services/permission.js +2 -3
  152. package/dist/server/services/permission.js.map +1 -1
  153. package/dist/server/services/permission.mjs +2 -3
  154. package/dist/server/services/permission.mjs.map +1 -1
  155. package/dist/server/services/populate-builder.js +4 -4
  156. package/dist/server/services/populate-builder.js.map +1 -1
  157. package/dist/server/services/populate-builder.mjs +4 -4
  158. package/dist/server/services/populate-builder.mjs.map +1 -1
  159. package/dist/server/services/utils/configuration/attributes.js +1 -2
  160. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  161. package/dist/server/services/utils/configuration/attributes.mjs +2 -3
  162. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  163. package/dist/server/services/utils/configuration/settings.js +4 -7
  164. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  165. package/dist/server/services/utils/configuration/settings.mjs +2 -5
  166. package/dist/server/services/utils/configuration/settings.mjs.map +1 -1
  167. package/dist/server/services/utils/draft.js +8 -7
  168. package/dist/server/services/utils/draft.js.map +1 -1
  169. package/dist/server/services/utils/draft.mjs +6 -5
  170. package/dist/server/services/utils/draft.mjs.map +1 -1
  171. package/dist/server/services/utils/populate.js +10 -11
  172. package/dist/server/services/utils/populate.js.map +1 -1
  173. package/dist/server/services/utils/populate.mjs +9 -10
  174. package/dist/server/services/utils/populate.mjs.map +1 -1
  175. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  176. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  177. package/dist/server/src/history/services/utils.d.ts +2 -2
  178. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  179. package/dist/server/src/index.d.ts +1 -1
  180. package/dist/server/src/index.d.ts.map +1 -1
  181. package/dist/server/src/mcp/permissions.d.ts +1 -1
  182. package/dist/server/src/mcp/permissions.d.ts.map +1 -1
  183. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +3 -1
  184. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  185. package/dist/server/src/mcp/types.d.ts +2 -2
  186. package/dist/server/src/services/content-types.d.ts.map +1 -1
  187. package/dist/server/src/services/data-mapper.d.ts +1 -1
  188. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  189. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  190. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  191. package/dist/server/src/services/index.d.ts +1 -1
  192. package/dist/server/src/services/index.d.ts.map +1 -1
  193. package/dist/server/src/services/metrics.d.ts.map +1 -1
  194. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  195. package/dist/server/src/services/permission.d.ts.map +1 -1
  196. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  197. package/dist/server/src/services/utils/configuration/index.d.ts +10 -1
  198. package/dist/server/src/services/utils/configuration/index.d.ts.map +1 -1
  199. package/dist/server/src/services/utils/configuration/settings.d.ts +10 -1
  200. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  201. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  202. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  203. package/package.json +6 -6
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var populate = require('./utils/populate.js');
5
5
 
6
6
  /**
@@ -38,10 +38,10 @@ var populate = require('./utils/populate.js');
38
38
  toMany: true,
39
39
  toOne: true
40
40
  }) {
41
- if (!fp.isNil(toMany)) {
41
+ if (toMany != null) {
42
42
  deepPopulateOptions.countMany = toMany;
43
43
  }
44
- if (!fp.isNil(toOne)) {
44
+ if (toOne != null) {
45
45
  deepPopulateOptions.countOne = toOne;
46
46
  }
47
47
  return builder;
@@ -61,7 +61,7 @@ var populate = require('./utils/populate.js');
61
61
  */ withPopulateOverride (overrides) {
62
62
  const prev = getInitialPopulate;
63
63
  // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations
64
- getInitialPopulate = async ()=>fp.merge(await prev() || {}, overrides);
64
+ getInitialPopulate = async ()=>_.merge({}, await prev() || {}, overrides);
65
65
  return builder;
66
66
  },
67
67
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"populate-builder.js","sources":["../../../server/src/services/populate-builder.ts"],"sourcesContent":["import { isNil, merge } from 'lodash/fp';\nimport type { UID } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: UID.Schema) => {\n let getInitialPopulate = async (): Promise<undefined | Populate> => {\n return undefined;\n };\n const deepPopulateOptions = {\n countMany: false,\n countOne: false,\n maxLevel: -1,\n };\n\n const builder = {\n /**\n * Populates all attribute fields present in a query.\n * @param query - Strapi query object\n */\n populateFromQuery(query: object) {\n getInitialPopulate = async () => getQueryPopulate(uid, query);\n return builder;\n },\n\n /**\n * Populate relations as count.\n * @param [options]\n * @param [options.toMany] - Populate XtoMany relations as count if true.\n * @param [options.toOne] - Populate XtoOne relations as count if true.\n */\n countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n if (!isNil(toMany)) {\n deepPopulateOptions.countMany = toMany;\n }\n if (!isNil(toOne)) {\n deepPopulateOptions.countOne = toOne;\n }\n return builder;\n },\n\n /**\n * Populate relations deeply, up to a certain level.\n * @param [level=Infinity] - Max level of nested populate.\n */\n populateDeep(level = Infinity) {\n deepPopulateOptions.maxLevel = level;\n return builder;\n },\n\n /**\n * Override the populate for specific attributes, taking precedence over\n * query-derived or deep populate defaults.\n *\n * @param overrides - Populate overrides to merge (e.g. { localizations: { fields: ['locale'] } })\n */\n withPopulateOverride(overrides: Record<string, any>) {\n const prev = getInitialPopulate;\n // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations\n getInitialPopulate = async () => merge((await prev()) || {}, overrides);\n return builder;\n },\n\n /**\n * Construct the populate object based on the builder options.\n * @returns Populate object\n */\n async build() {\n const initialPopulate = await getInitialPopulate();\n\n if (deepPopulateOptions.maxLevel === -1) {\n return initialPopulate;\n }\n\n return getDeepPopulate(uid, {\n ...deepPopulateOptions,\n initialPopulate,\n });\n },\n };\n\n return builder;\n};\n\nexport default () => populateBuilder;\n"],"names":["populateBuilder","uid","getInitialPopulate","undefined","deepPopulateOptions","countMany","countOne","maxLevel","builder","populateFromQuery","query","getQueryPopulate","countRelations","toMany","toOne","isNil","populateDeep","level","Infinity","withPopulateOverride","overrides","prev","merge","build","initialPopulate","getDeepPopulate"],"mappings":";;;;;AAIA;;;;;;;;;IAUA,MAAMA,kBAAkB,CAACC,GAAAA,GAAAA;AACvB,IAAA,IAAIC,kBAAAA,GAAqB,UAAA;QACvB,OAAOC,SAAAA;AACT,IAAA,CAAA;AACA,IAAA,MAAMC,mBAAAA,GAAsB;QAC1BC,SAAAA,EAAW,KAAA;QACXC,QAAAA,EAAU,KAAA;AACVC,QAAAA,QAAAA,EAAU;AACZ,KAAA;AAEA,IAAA,MAAMC,OAAAA,GAAU;AACd;;;AAGC,QACDC,mBAAkBC,KAAa,EAAA;YAC7BR,kBAAAA,GAAqB,UAAYS,0BAAiBV,GAAAA,EAAKS,KAAAA,CAAAA;YACvD,OAAOF,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDI,gBAAe,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAG;YAAED,MAAAA,EAAQ,IAAA;YAAMC,KAAAA,EAAO;SAAM,EAAA;YAC9D,IAAI,CAACC,SAAMF,MAAAA,CAAAA,EAAS;AAClBT,gBAAAA,mBAAAA,CAAoBC,SAAS,GAAGQ,MAAAA;AAClC,YAAA;YACA,IAAI,CAACE,SAAMD,KAAAA,CAAAA,EAAQ;AACjBV,gBAAAA,mBAAAA,CAAoBE,QAAQ,GAAGQ,KAAAA;AACjC,YAAA;YACA,OAAON,OAAAA;AACT,QAAA,CAAA;AAEA;;;QAIAQ,YAAAA,CAAAA,CAAaC,QAAQC,QAAQ,EAAA;AAC3Bd,YAAAA,mBAAAA,CAAoBG,QAAQ,GAAGU,KAAAA;YAC/B,OAAOT,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDW,sBAAqBC,SAA8B,EAAA;AACjD,YAAA,MAAMC,IAAAA,GAAOnB,kBAAAA;;AAEbA,YAAAA,kBAAAA,GAAqB,UAAYoB,QAAAA,CAAO,MAAMD,IAAAA,EAAAA,IAAW,EAAC,EAAGD,SAAAA,CAAAA;YAC7D,OAAOZ,OAAAA;AACT,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMe,KAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,kBAAkB,MAAMtB,kBAAAA,EAAAA;AAE9B,YAAA,IAAIE,mBAAAA,CAAoBG,QAAQ,KAAK,EAAC,EAAG;gBACvC,OAAOiB,eAAAA;AACT,YAAA;AAEA,YAAA,OAAOC,yBAAgBxB,GAAAA,EAAK;AAC1B,gBAAA,GAAGG,mBAAmB;AACtBoB,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;IAEA,OAAOhB,OAAAA;AACT,CAAA;AAEA,wBAAe,CAAA,IAAMR,eAAc;;;;"}
1
+ {"version":3,"file":"populate-builder.js","sources":["../../../server/src/services/populate-builder.ts"],"sourcesContent":["import { merge } from 'lodash';\n\nimport type { UID } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: UID.Schema) => {\n let getInitialPopulate = async (): Promise<undefined | Populate> => {\n return undefined;\n };\n const deepPopulateOptions = {\n countMany: false,\n countOne: false,\n maxLevel: -1,\n };\n\n const builder = {\n /**\n * Populates all attribute fields present in a query.\n * @param query - Strapi query object\n */\n populateFromQuery(query: object) {\n getInitialPopulate = async () => getQueryPopulate(uid, query);\n return builder;\n },\n\n /**\n * Populate relations as count.\n * @param [options]\n * @param [options.toMany] - Populate XtoMany relations as count if true.\n * @param [options.toOne] - Populate XtoOne relations as count if true.\n */\n countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n if (toMany != null) {\n deepPopulateOptions.countMany = toMany;\n }\n if (toOne != null) {\n deepPopulateOptions.countOne = toOne;\n }\n return builder;\n },\n\n /**\n * Populate relations deeply, up to a certain level.\n * @param [level=Infinity] - Max level of nested populate.\n */\n populateDeep(level = Infinity) {\n deepPopulateOptions.maxLevel = level;\n return builder;\n },\n\n /**\n * Override the populate for specific attributes, taking precedence over\n * query-derived or deep populate defaults.\n *\n * @param overrides - Populate overrides to merge (e.g. { localizations: { fields: ['locale'] } })\n */\n withPopulateOverride(overrides: Record<string, any>) {\n const prev = getInitialPopulate;\n // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations\n getInitialPopulate = async () => merge({}, (await prev()) || {}, overrides);\n return builder;\n },\n\n /**\n * Construct the populate object based on the builder options.\n * @returns Populate object\n */\n async build() {\n const initialPopulate = await getInitialPopulate();\n\n if (deepPopulateOptions.maxLevel === -1) {\n return initialPopulate;\n }\n\n return getDeepPopulate(uid, {\n ...deepPopulateOptions,\n initialPopulate,\n });\n },\n };\n\n return builder;\n};\n\nexport default () => populateBuilder;\n"],"names":["populateBuilder","uid","getInitialPopulate","undefined","deepPopulateOptions","countMany","countOne","maxLevel","builder","populateFromQuery","query","getQueryPopulate","countRelations","toMany","toOne","populateDeep","level","Infinity","withPopulateOverride","overrides","prev","merge","build","initialPopulate","getDeepPopulate"],"mappings":";;;;;AAKA;;;;;;;;;IAUA,MAAMA,kBAAkB,CAACC,GAAAA,GAAAA;AACvB,IAAA,IAAIC,kBAAAA,GAAqB,UAAA;QACvB,OAAOC,SAAAA;AACT,IAAA,CAAA;AACA,IAAA,MAAMC,mBAAAA,GAAsB;QAC1BC,SAAAA,EAAW,KAAA;QACXC,QAAAA,EAAU,KAAA;AACVC,QAAAA,QAAAA,EAAU;AACZ,KAAA;AAEA,IAAA,MAAMC,OAAAA,GAAU;AACd;;;AAGC,QACDC,mBAAkBC,KAAa,EAAA;YAC7BR,kBAAAA,GAAqB,UAAYS,0BAAiBV,GAAAA,EAAKS,KAAAA,CAAAA;YACvD,OAAOF,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDI,gBAAe,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAG;YAAED,MAAAA,EAAQ,IAAA;YAAMC,KAAAA,EAAO;SAAM,EAAA;AAC9D,YAAA,IAAID,UAAU,IAAA,EAAM;AAClBT,gBAAAA,mBAAAA,CAAoBC,SAAS,GAAGQ,MAAAA;AAClC,YAAA;AACA,YAAA,IAAIC,SAAS,IAAA,EAAM;AACjBV,gBAAAA,mBAAAA,CAAoBE,QAAQ,GAAGQ,KAAAA;AACjC,YAAA;YACA,OAAON,OAAAA;AACT,QAAA,CAAA;AAEA;;;QAIAO,YAAAA,CAAAA,CAAaC,QAAQC,QAAQ,EAAA;AAC3Bb,YAAAA,mBAAAA,CAAoBG,QAAQ,GAAGS,KAAAA;YAC/B,OAAOR,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDU,sBAAqBC,SAA8B,EAAA;AACjD,YAAA,MAAMC,IAAAA,GAAOlB,kBAAAA;;YAEbA,kBAAAA,GAAqB,UAAYmB,QAAM,EAAC,EAAG,MAAOD,IAAAA,EAAAA,IAAW,EAAC,EAAGD,SAAAA,CAAAA;YACjE,OAAOX,OAAAA;AACT,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMc,KAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,kBAAkB,MAAMrB,kBAAAA,EAAAA;AAE9B,YAAA,IAAIE,mBAAAA,CAAoBG,QAAQ,KAAK,EAAC,EAAG;gBACvC,OAAOgB,eAAAA;AACT,YAAA;AAEA,YAAA,OAAOC,yBAAgBvB,GAAAA,EAAK;AAC1B,gBAAA,GAAGG,mBAAmB;AACtBmB,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;IAEA,OAAOf,OAAAA;AACT,CAAA;AAEA,wBAAe,CAAA,IAAMR,eAAc;;;;"}
@@ -1,4 +1,4 @@
1
- import { merge, isNil } from 'lodash/fp';
1
+ import { merge } from 'lodash';
2
2
  import { getQueryPopulate, getDeepPopulate } from './utils/populate.mjs';
3
3
 
4
4
  /**
@@ -36,10 +36,10 @@ import { getQueryPopulate, getDeepPopulate } from './utils/populate.mjs';
36
36
  toMany: true,
37
37
  toOne: true
38
38
  }) {
39
- if (!isNil(toMany)) {
39
+ if (toMany != null) {
40
40
  deepPopulateOptions.countMany = toMany;
41
41
  }
42
- if (!isNil(toOne)) {
42
+ if (toOne != null) {
43
43
  deepPopulateOptions.countOne = toOne;
44
44
  }
45
45
  return builder;
@@ -59,7 +59,7 @@ import { getQueryPopulate, getDeepPopulate } from './utils/populate.mjs';
59
59
  */ withPopulateOverride (overrides) {
60
60
  const prev = getInitialPopulate;
61
61
  // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations
62
- getInitialPopulate = async ()=>merge(await prev() || {}, overrides);
62
+ getInitialPopulate = async ()=>merge({}, await prev() || {}, overrides);
63
63
  return builder;
64
64
  },
65
65
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"populate-builder.mjs","sources":["../../../server/src/services/populate-builder.ts"],"sourcesContent":["import { isNil, merge } from 'lodash/fp';\nimport type { UID } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: UID.Schema) => {\n let getInitialPopulate = async (): Promise<undefined | Populate> => {\n return undefined;\n };\n const deepPopulateOptions = {\n countMany: false,\n countOne: false,\n maxLevel: -1,\n };\n\n const builder = {\n /**\n * Populates all attribute fields present in a query.\n * @param query - Strapi query object\n */\n populateFromQuery(query: object) {\n getInitialPopulate = async () => getQueryPopulate(uid, query);\n return builder;\n },\n\n /**\n * Populate relations as count.\n * @param [options]\n * @param [options.toMany] - Populate XtoMany relations as count if true.\n * @param [options.toOne] - Populate XtoOne relations as count if true.\n */\n countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n if (!isNil(toMany)) {\n deepPopulateOptions.countMany = toMany;\n }\n if (!isNil(toOne)) {\n deepPopulateOptions.countOne = toOne;\n }\n return builder;\n },\n\n /**\n * Populate relations deeply, up to a certain level.\n * @param [level=Infinity] - Max level of nested populate.\n */\n populateDeep(level = Infinity) {\n deepPopulateOptions.maxLevel = level;\n return builder;\n },\n\n /**\n * Override the populate for specific attributes, taking precedence over\n * query-derived or deep populate defaults.\n *\n * @param overrides - Populate overrides to merge (e.g. { localizations: { fields: ['locale'] } })\n */\n withPopulateOverride(overrides: Record<string, any>) {\n const prev = getInitialPopulate;\n // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations\n getInitialPopulate = async () => merge((await prev()) || {}, overrides);\n return builder;\n },\n\n /**\n * Construct the populate object based on the builder options.\n * @returns Populate object\n */\n async build() {\n const initialPopulate = await getInitialPopulate();\n\n if (deepPopulateOptions.maxLevel === -1) {\n return initialPopulate;\n }\n\n return getDeepPopulate(uid, {\n ...deepPopulateOptions,\n initialPopulate,\n });\n },\n };\n\n return builder;\n};\n\nexport default () => populateBuilder;\n"],"names":["populateBuilder","uid","getInitialPopulate","undefined","deepPopulateOptions","countMany","countOne","maxLevel","builder","populateFromQuery","query","getQueryPopulate","countRelations","toMany","toOne","isNil","populateDeep","level","Infinity","withPopulateOverride","overrides","prev","merge","build","initialPopulate","getDeepPopulate"],"mappings":";;;AAIA;;;;;;;;;IAUA,MAAMA,oBAAkB,CAACC,GAAAA,GAAAA;AACvB,IAAA,IAAIC,kBAAAA,GAAqB,UAAA;QACvB,OAAOC,SAAAA;AACT,IAAA,CAAA;AACA,IAAA,MAAMC,mBAAAA,GAAsB;QAC1BC,SAAAA,EAAW,KAAA;QACXC,QAAAA,EAAU,KAAA;AACVC,QAAAA,QAAAA,EAAU;AACZ,KAAA;AAEA,IAAA,MAAMC,OAAAA,GAAU;AACd;;;AAGC,QACDC,mBAAkBC,KAAa,EAAA;YAC7BR,kBAAAA,GAAqB,UAAYS,iBAAiBV,GAAAA,EAAKS,KAAAA,CAAAA;YACvD,OAAOF,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDI,gBAAe,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAG;YAAED,MAAAA,EAAQ,IAAA;YAAMC,KAAAA,EAAO;SAAM,EAAA;YAC9D,IAAI,CAACC,MAAMF,MAAAA,CAAAA,EAAS;AAClBT,gBAAAA,mBAAAA,CAAoBC,SAAS,GAAGQ,MAAAA;AAClC,YAAA;YACA,IAAI,CAACE,MAAMD,KAAAA,CAAAA,EAAQ;AACjBV,gBAAAA,mBAAAA,CAAoBE,QAAQ,GAAGQ,KAAAA;AACjC,YAAA;YACA,OAAON,OAAAA;AACT,QAAA,CAAA;AAEA;;;QAIAQ,YAAAA,CAAAA,CAAaC,QAAQC,QAAQ,EAAA;AAC3Bd,YAAAA,mBAAAA,CAAoBG,QAAQ,GAAGU,KAAAA;YAC/B,OAAOT,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDW,sBAAqBC,SAA8B,EAAA;AACjD,YAAA,MAAMC,IAAAA,GAAOnB,kBAAAA;;AAEbA,YAAAA,kBAAAA,GAAqB,UAAYoB,KAAAA,CAAO,MAAMD,IAAAA,EAAAA,IAAW,EAAC,EAAGD,SAAAA,CAAAA;YAC7D,OAAOZ,OAAAA;AACT,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMe,KAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,kBAAkB,MAAMtB,kBAAAA,EAAAA;AAE9B,YAAA,IAAIE,mBAAAA,CAAoBG,QAAQ,KAAK,EAAC,EAAG;gBACvC,OAAOiB,eAAAA;AACT,YAAA;AAEA,YAAA,OAAOC,gBAAgBxB,GAAAA,EAAK;AAC1B,gBAAA,GAAGG,mBAAmB;AACtBoB,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;IAEA,OAAOhB,OAAAA;AACT,CAAA;AAEA,sBAAe,CAAA,IAAMR,iBAAc;;;;"}
1
+ {"version":3,"file":"populate-builder.mjs","sources":["../../../server/src/services/populate-builder.ts"],"sourcesContent":["import { merge } from 'lodash';\n\nimport type { UID } from '@strapi/types';\nimport { type Populate, getDeepPopulate, getQueryPopulate } from './utils/populate';\n\n/**\n * Builder to create a Strapi populate object.\n *\n * @param uid - Content type UID\n *\n * @example\n * const populate = await populateBuilder('api::article.article').countRelations().build();\n * // populate = { article: { populate: { count: true } } }\n *\n */\nconst populateBuilder = (uid: UID.Schema) => {\n let getInitialPopulate = async (): Promise<undefined | Populate> => {\n return undefined;\n };\n const deepPopulateOptions = {\n countMany: false,\n countOne: false,\n maxLevel: -1,\n };\n\n const builder = {\n /**\n * Populates all attribute fields present in a query.\n * @param query - Strapi query object\n */\n populateFromQuery(query: object) {\n getInitialPopulate = async () => getQueryPopulate(uid, query);\n return builder;\n },\n\n /**\n * Populate relations as count.\n * @param [options]\n * @param [options.toMany] - Populate XtoMany relations as count if true.\n * @param [options.toOne] - Populate XtoOne relations as count if true.\n */\n countRelations({ toMany, toOne } = { toMany: true, toOne: true }) {\n if (toMany != null) {\n deepPopulateOptions.countMany = toMany;\n }\n if (toOne != null) {\n deepPopulateOptions.countOne = toOne;\n }\n return builder;\n },\n\n /**\n * Populate relations deeply, up to a certain level.\n * @param [level=Infinity] - Max level of nested populate.\n */\n populateDeep(level = Infinity) {\n deepPopulateOptions.maxLevel = level;\n return builder;\n },\n\n /**\n * Override the populate for specific attributes, taking precedence over\n * query-derived or deep populate defaults.\n *\n * @param overrides - Populate overrides to merge (e.g. { localizations: { fields: ['locale'] } })\n */\n withPopulateOverride(overrides: Record<string, any>) {\n const prev = getInitialPopulate;\n // merge(base, overrides): overrides win for overlapping keys, so e.g. localizations\n getInitialPopulate = async () => merge({}, (await prev()) || {}, overrides);\n return builder;\n },\n\n /**\n * Construct the populate object based on the builder options.\n * @returns Populate object\n */\n async build() {\n const initialPopulate = await getInitialPopulate();\n\n if (deepPopulateOptions.maxLevel === -1) {\n return initialPopulate;\n }\n\n return getDeepPopulate(uid, {\n ...deepPopulateOptions,\n initialPopulate,\n });\n },\n };\n\n return builder;\n};\n\nexport default () => populateBuilder;\n"],"names":["populateBuilder","uid","getInitialPopulate","undefined","deepPopulateOptions","countMany","countOne","maxLevel","builder","populateFromQuery","query","getQueryPopulate","countRelations","toMany","toOne","populateDeep","level","Infinity","withPopulateOverride","overrides","prev","merge","build","initialPopulate","getDeepPopulate"],"mappings":";;;AAKA;;;;;;;;;IAUA,MAAMA,oBAAkB,CAACC,GAAAA,GAAAA;AACvB,IAAA,IAAIC,kBAAAA,GAAqB,UAAA;QACvB,OAAOC,SAAAA;AACT,IAAA,CAAA;AACA,IAAA,MAAMC,mBAAAA,GAAsB;QAC1BC,SAAAA,EAAW,KAAA;QACXC,QAAAA,EAAU,KAAA;AACVC,QAAAA,QAAAA,EAAU;AACZ,KAAA;AAEA,IAAA,MAAMC,OAAAA,GAAU;AACd;;;AAGC,QACDC,mBAAkBC,KAAa,EAAA;YAC7BR,kBAAAA,GAAqB,UAAYS,iBAAiBV,GAAAA,EAAKS,KAAAA,CAAAA;YACvD,OAAOF,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDI,gBAAe,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAG;YAAED,MAAAA,EAAQ,IAAA;YAAMC,KAAAA,EAAO;SAAM,EAAA;AAC9D,YAAA,IAAID,UAAU,IAAA,EAAM;AAClBT,gBAAAA,mBAAAA,CAAoBC,SAAS,GAAGQ,MAAAA;AAClC,YAAA;AACA,YAAA,IAAIC,SAAS,IAAA,EAAM;AACjBV,gBAAAA,mBAAAA,CAAoBE,QAAQ,GAAGQ,KAAAA;AACjC,YAAA;YACA,OAAON,OAAAA;AACT,QAAA,CAAA;AAEA;;;QAIAO,YAAAA,CAAAA,CAAaC,QAAQC,QAAQ,EAAA;AAC3Bb,YAAAA,mBAAAA,CAAoBG,QAAQ,GAAGS,KAAAA;YAC/B,OAAOR,OAAAA;AACT,QAAA,CAAA;AAEA;;;;;AAKC,QACDU,sBAAqBC,SAA8B,EAAA;AACjD,YAAA,MAAMC,IAAAA,GAAOlB,kBAAAA;;YAEbA,kBAAAA,GAAqB,UAAYmB,MAAM,EAAC,EAAG,MAAOD,IAAAA,EAAAA,IAAW,EAAC,EAAGD,SAAAA,CAAAA;YACjE,OAAOX,OAAAA;AACT,QAAA,CAAA;AAEA;;;AAGC,QACD,MAAMc,KAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,kBAAkB,MAAMrB,kBAAAA,EAAAA;AAE9B,YAAA,IAAIE,mBAAAA,CAAoBG,QAAQ,KAAK,EAAC,EAAG;gBACvC,OAAOgB,eAAAA;AACT,YAAA;AAEA,YAAA,OAAOC,gBAAgBvB,GAAAA,EAAK;AAC1B,gBAAA,GAAGG,mBAAmB;AACtBmB,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;IAEA,OAAOf,OAAAA;AACT,CAAA;AAEA,sBAAe,CAAA,IAAMR,iBAAc;;;;"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var _ = require('lodash');
4
- var fp = require('lodash/fp');
5
4
  var strapiUtils = require('@strapi/utils');
6
5
 
7
6
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -167,7 +166,7 @@ const getDefaultMainField = (schema)=>findFirstStringAttribute(schema) || 'id';
167
166
  */ const getSortableAttributes = (schema)=>{
168
167
  const validAttributes = Object.keys(schema.attributes).filter((key)=>isListable(schema, key));
169
168
  const model = strapi.getModel(schema.uid);
170
- const nonVisibleWritableAttributes = fp.intersection(getNonVisibleAttributes(model), getWritableAttributes(model));
169
+ const nonVisibleWritableAttributes = _.intersection(getWritableAttributes(model), getNonVisibleAttributes(model));
171
170
  const identifierField = ___default.default.has(schema.attributes, 'documentId') ? 'documentId' : 'id';
172
171
  return [
173
172
  identifierField,
@@ -1 +1 @@
1
- {"version":3,"file":"attributes.js","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _ from 'lodash';\nimport { intersection } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getNonVisibleAttributes(model),\n getWritableAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
1
+ {"version":3,"file":"attributes.js","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- import _ from 'lodash';
2
- import { intersection } from 'lodash/fp';
1
+ import _, { intersection } from 'lodash';
3
2
  import { contentTypes } from '@strapi/utils';
4
3
 
5
4
  const { getNonVisibleAttributes, getWritableAttributes } = contentTypes;
@@ -161,7 +160,7 @@ const getDefaultMainField = (schema)=>findFirstStringAttribute(schema) || 'id';
161
160
  */ const getSortableAttributes = (schema)=>{
162
161
  const validAttributes = Object.keys(schema.attributes).filter((key)=>isListable(schema, key));
163
162
  const model = strapi.getModel(schema.uid);
164
- const nonVisibleWritableAttributes = intersection(getNonVisibleAttributes(model), getWritableAttributes(model));
163
+ const nonVisibleWritableAttributes = intersection(getWritableAttributes(model), getNonVisibleAttributes(model));
165
164
  const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';
166
165
  return [
167
166
  identifierField,
@@ -1 +1 @@
1
- {"version":3,"file":"attributes.mjs","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _ from 'lodash';\nimport { intersection } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getNonVisibleAttributes(model),\n getWritableAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
1
+ {"version":3,"file":"attributes.mjs","sources":["../../../../../server/src/services/utils/configuration/attributes.ts"],"sourcesContent":["import _, { intersection } from 'lodash';\n\nimport { contentTypes as contentTypesUtils } from '@strapi/utils';\n\nconst { getNonVisibleAttributes, getWritableAttributes } = contentTypesUtils;\nconst { PUBLISHED_AT_ATTRIBUTE, CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } =\n contentTypesUtils.constants;\n\nconst NON_SORTABLES = ['component', 'json', 'media', 'richtext', 'dynamiczone', 'blocks'];\nconst SORTABLE_RELATIONS = ['oneToOne', 'manyToOne'];\n\nconst NON_LISTABLES = ['json', 'password', 'richtext', 'dynamiczone', 'blocks'];\nconst LISTABLE_RELATIONS = ['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany'];\n\n// hidden fields are fields that are configured to be hidden from list, and edit views\nconst isHidden = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const isHidden = _.get(schema, ['config', 'attributes', name, 'hidden'], false);\n if (isHidden === true) {\n return true;\n }\n\n return false;\n};\n\nconst isListable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n const attribute = schema.attributes[name];\n if (NON_LISTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !LISTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSortable = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (schema.modelType === 'component' && name === 'id') return false;\n\n const attribute = schema.attributes[name];\n if (NON_SORTABLES.includes(attribute.type)) {\n return false;\n }\n\n if (isRelation(attribute) && !SORTABLE_RELATIONS.includes(attribute.relationType)) {\n return false;\n }\n\n return true;\n};\n\nconst isSearchable = (schema: any, name: any) => {\n return isSortable(schema, name);\n};\n\nconst isVisible = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (isTimestamp(schema, name) || name === 'id' || name === 'documentId') {\n return false;\n }\n\n if (isPublicationField(name)) {\n return false;\n }\n\n if (isCreatorField(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst isPublicationField = (name: any) => PUBLISHED_AT_ATTRIBUTE === name;\n\nconst isTimestamp = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const timestamps = contentTypesUtils.getTimestamps(schema);\n if (!timestamps || !Array.isArray(timestamps)) {\n return false;\n }\n\n if (timestamps.includes(name)) {\n return true;\n }\n};\n\nconst isCreatorField = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n const creatorFields = contentTypesUtils.getCreatorFields(schema);\n if (!creatorFields || !Array.isArray(creatorFields)) {\n return false;\n }\n\n if (creatorFields.includes(name)) {\n return true;\n }\n};\n\nconst isRelation = (attribute: any) => attribute.type === 'relation';\n\nconst hasRelationAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return isRelation(schema.attributes[name]);\n};\n\nconst hasEditableAttribute = (schema: any, name: any) => {\n if (!_.has(schema.attributes, name)) {\n return false;\n }\n\n if (isHidden(schema, name)) {\n return false;\n }\n\n if (!isVisible(schema, name)) {\n return false;\n }\n\n return true;\n};\n\nconst findFirstStringAttribute = (schema: any) => {\n return Object.keys(schema.attributes || {}).find((key) => {\n const { type } = schema.attributes[key];\n return type === 'string' && key !== 'id';\n });\n};\n\nconst getDefaultMainField = (schema: any) => findFirstStringAttribute(schema) || 'id';\n\n/**\n * Returns list of all sortable attributes for a given content type schema\n * TODO V5: Refactor non visible fields to be a part of content-manager schema so we can use isSortable instead\n * @param {*} schema\n * @returns\n */\nconst getSortableAttributes = (schema: any) => {\n const validAttributes = Object.keys(schema.attributes).filter((key) => isListable(schema, key));\n\n const model = strapi.getModel(schema.uid);\n const nonVisibleWritableAttributes = intersection(\n getWritableAttributes(model),\n getNonVisibleAttributes(model)\n );\n\n const identifierField = _.has(schema.attributes, 'documentId') ? 'documentId' : 'id';\n return [\n identifierField,\n ...validAttributes,\n ...nonVisibleWritableAttributes,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n ];\n};\n\nexport {\n isSortable,\n isVisible,\n isSearchable,\n isRelation,\n isListable,\n hasEditableAttribute,\n hasRelationAttribute,\n getDefaultMainField,\n getSortableAttributes,\n};\n"],"names":["getNonVisibleAttributes","getWritableAttributes","contentTypesUtils","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","NON_SORTABLES","SORTABLE_RELATIONS","NON_LISTABLES","LISTABLE_RELATIONS","isHidden","schema","name","_","has","attributes","get","isListable","attribute","includes","type","isRelation","relationType","isSortable","modelType","isSearchable","isVisible","isTimestamp","isPublicationField","isCreatorField","timestamps","getTimestamps","Array","isArray","creatorFields","getCreatorFields","hasRelationAttribute","hasEditableAttribute","findFirstStringAttribute","Object","keys","find","key","getDefaultMainField","getSortableAttributes","validAttributes","filter","model","strapi","getModel","uid","nonVisibleWritableAttributes","intersection","identifierField"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var strapiUtils = require('@strapi/utils');
5
5
  var qs = require('qs');
6
6
  var attributes = require('./attributes.js');
@@ -26,10 +26,7 @@ const settingsFields = [
26
26
  'defaultSortOrder',
27
27
  'relationOpenMode'
28
28
  ];
29
- const getModelSettings = fp.pipe([
30
- fp.propOr({}, 'config.settings'),
31
- fp.pick(settingsFields)
32
- ]);
29
+ const getModelSettings = (model)=>_.pick(_.get(model, 'config.settings', {}), settingsFields);
33
30
  async function isValidDefaultSort(schema, value) {
34
31
  const parsedValue = qs__default.default.parse(value);
35
32
  const omitNonSortableAttributes = ({ schema, key }, { remove })=>{
@@ -43,7 +40,7 @@ async function isValidDefaultSort(schema, value) {
43
40
  getModel: strapi.getModel.bind(strapi)
44
41
  }, parsedValue);
45
42
  // If any of the keys has been removed, the sort attribute is not valid
46
- return fp.isEqual(parsedValue, sanitizedValue);
43
+ return _.isEqual(parsedValue, sanitizedValue);
47
44
  }
48
45
  const createDefaultSettings = async (schema)=>{
49
46
  const defaultField = attributes.getDefaultMainField(schema);
@@ -56,7 +53,7 @@ const createDefaultSettings = async (schema)=>{
56
53
  };
57
54
  };
58
55
  const syncSettings = async (configuration, schema)=>{
59
- if (fp.isEmpty(configuration.settings)) return createDefaultSettings(schema);
56
+ if (_.isEmpty(configuration.settings)) return createDefaultSettings(schema);
60
57
  const defaultField = attributes.getDefaultMainField(schema);
61
58
  const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
62
59
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sources":["../../../../../server/src/services/utils/configuration/settings.ts"],"sourcesContent":["import { isEmpty, pick, pipe, propOr, isEqual } from 'lodash/fp';\nimport { traverse } from '@strapi/utils';\nimport qs from 'qs';\nimport { isSortable, getDefaultMainField, getSortableAttributes } from './attributes';\n\n/** General settings */\nconst DEFAULT_SETTINGS = {\n bulkable: true,\n filterable: true,\n searchable: true,\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\nconst settingsFields = [\n 'searchable',\n 'filterable',\n 'bulkable',\n 'pageSize',\n 'mainField',\n 'defaultSortBy',\n 'defaultSortOrder',\n 'relationOpenMode',\n];\n\nconst getModelSettings = pipe([propOr({}, 'config.settings'), pick(settingsFields)]);\n\nasync function isValidDefaultSort(schema: any, value: any) {\n const parsedValue = qs.parse(value);\n\n const omitNonSortableAttributes = ({ schema, key }: any, { remove }: any) => {\n const sortableAttributes = getSortableAttributes(schema);\n if (!sortableAttributes.includes(key)) {\n remove(key);\n }\n };\n\n const sanitizedValue = await traverse.traverseQuerySort(\n omitNonSortableAttributes,\n { schema, getModel: strapi.getModel.bind(strapi) },\n parsedValue\n );\n\n // If any of the keys has been removed, the sort attribute is not valid\n return isEqual(parsedValue, sanitizedValue);\n}\n\nconst createDefaultSettings = async (schema: any) => {\n const defaultField = getDefaultMainField(schema);\n\n return {\n ...DEFAULT_SETTINGS,\n mainField: defaultField,\n defaultSortBy: defaultField,\n defaultSortOrder: 'ASC',\n ...getModelSettings(schema),\n };\n};\n\nconst syncSettings = async (configuration: any, schema: any) => {\n if (isEmpty(configuration.settings)) return createDefaultSettings(schema);\n\n const defaultField = getDefaultMainField(schema);\n\n const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};\n\n return {\n ...configuration.settings,\n mainField: isSortable(schema, mainField) ? mainField : defaultField,\n defaultSortBy: (await isValidDefaultSort(schema, defaultSortBy)) ? defaultSortBy : defaultField,\n };\n};\n\nexport { isValidDefaultSort, createDefaultSettings, syncSettings };\n"],"names":["DEFAULT_SETTINGS","bulkable","filterable","searchable","pageSize","relationOpenMode","settingsFields","getModelSettings","pipe","propOr","pick","isValidDefaultSort","schema","value","parsedValue","qs","parse","omitNonSortableAttributes","key","remove","sortableAttributes","getSortableAttributes","includes","sanitizedValue","traverse","traverseQuerySort","getModel","strapi","bind","isEqual","createDefaultSettings","defaultField","getDefaultMainField","mainField","defaultSortBy","defaultSortOrder","syncSettings","configuration","isEmpty","settings","isSortable"],"mappings":";;;;;;;;;;;AAKA,wBACA,MAAMA,gBAAAA,GAAmB;IACvBC,QAAAA,EAAU,IAAA;IACVC,UAAAA,EAAY,IAAA;IACZC,UAAAA,EAAY,IAAA;IACZC,QAAAA,EAAU,EAAA;IACVC,gBAAAA,EAAkB;AACpB,CAAA;AAEA,MAAMC,cAAAA,GAAiB;AACrB,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,eAAA;AACA,IAAA,kBAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,mBAAmBC,OAAAA,CAAK;AAACC,IAAAA,SAAAA,CAAO,EAAC,EAAG,iBAAA,CAAA;IAAoBC,OAAAA,CAAKJ,cAAAA;AAAgB,CAAA,CAAA;AAEnF,eAAeK,kBAAAA,CAAmBC,MAAW,EAAEC,KAAU,EAAA;IACvD,MAAMC,WAAAA,GAAcC,mBAAAA,CAAGC,KAAK,CAACH,KAAAA,CAAAA;IAE7B,MAAMI,yBAAAA,GAA4B,CAAC,EAAEL,MAAM,EAAEM,GAAG,EAAO,EAAE,EAAEC,MAAM,EAAO,GAAA;AACtE,QAAA,MAAMC,qBAAqBC,gCAAAA,CAAsBT,MAAAA,CAAAA;AACjD,QAAA,IAAI,CAACQ,kBAAAA,CAAmBE,QAAQ,CAACJ,GAAAA,CAAAA,EAAM;YACrCC,MAAAA,CAAOD,GAAAA,CAAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMK,cAAAA,GAAiB,MAAMC,oBAAAA,CAASC,iBAAiB,CACrDR,yBAAAA,EACA;AAAEL,QAAAA,MAAAA;AAAQc,QAAAA,QAAAA,EAAUC,MAAAA,CAAOD,QAAQ,CAACE,IAAI,CAACD,MAAAA;KAAQ,EACjDb,WAAAA,CAAAA;;AAIF,IAAA,OAAOe,WAAQf,WAAAA,EAAaS,cAAAA,CAAAA;AAC9B;AAEA,MAAMO,wBAAwB,OAAOlB,MAAAA,GAAAA;AACnC,IAAA,MAAMmB,eAAeC,8BAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,OAAO;AACL,QAAA,GAAGZ,gBAAgB;QACnBiC,SAAAA,EAAWF,YAAAA;QACXG,aAAAA,EAAeH,YAAAA;QACfI,gBAAAA,EAAkB,KAAA;AAClB,QAAA,GAAG5B,iBAAiBK,MAAAA;AACtB,KAAA;AACF;AAEA,MAAMwB,YAAAA,GAAe,OAAOC,aAAAA,EAAoBzB,MAAAA,GAAAA;AAC9C,IAAA,IAAI0B,UAAAA,CAAQD,aAAAA,CAAcE,QAAQ,CAAA,EAAG,OAAOT,qBAAAA,CAAsBlB,MAAAA,CAAAA;AAElE,IAAA,MAAMmB,eAAeC,8BAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,MAAM,EAAEqB,SAAAA,GAAYF,YAAY,EAAEG,aAAAA,GAAgBH,YAAY,EAAE,GAAGM,aAAAA,CAAcE,QAAQ,IAAI,EAAC;IAE9F,OAAO;AACL,QAAA,GAAGF,cAAcE,QAAQ;QACzBN,SAAAA,EAAWO,qBAAAA,CAAW5B,MAAAA,EAAQqB,SAAAA,CAAAA,GAAaA,SAAAA,GAAYF,YAAAA;AACvDG,QAAAA,aAAAA,EAAe,MAAOvB,kBAAAA,CAAmBC,MAAAA,EAAQsB,iBAAkBA,aAAAA,GAAgBH;AACrF,KAAA;AACF;;;;;;"}
1
+ {"version":3,"file":"settings.js","sources":["../../../../../server/src/services/utils/configuration/settings.ts"],"sourcesContent":["import { get, pick, isEmpty, isEqual } from 'lodash';\n\nimport { traverse } from '@strapi/utils';\nimport qs from 'qs';\nimport { isSortable, getDefaultMainField, getSortableAttributes } from './attributes';\n\n/** General settings */\nconst DEFAULT_SETTINGS = {\n bulkable: true,\n filterable: true,\n searchable: true,\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\nconst settingsFields = [\n 'searchable',\n 'filterable',\n 'bulkable',\n 'pageSize',\n 'mainField',\n 'defaultSortBy',\n 'defaultSortOrder',\n 'relationOpenMode',\n];\n\nconst getModelSettings = (model: unknown) =>\n pick(get(model, 'config.settings', {}), settingsFields);\n\nasync function isValidDefaultSort(schema: any, value: any) {\n const parsedValue = qs.parse(value);\n\n const omitNonSortableAttributes = ({ schema, key }: any, { remove }: any) => {\n const sortableAttributes = getSortableAttributes(schema);\n if (!sortableAttributes.includes(key)) {\n remove(key);\n }\n };\n\n const sanitizedValue = await traverse.traverseQuerySort(\n omitNonSortableAttributes,\n { schema, getModel: strapi.getModel.bind(strapi) },\n parsedValue\n );\n\n // If any of the keys has been removed, the sort attribute is not valid\n return isEqual(parsedValue, sanitizedValue);\n}\n\nconst createDefaultSettings = async (schema: any) => {\n const defaultField = getDefaultMainField(schema);\n\n return {\n ...DEFAULT_SETTINGS,\n mainField: defaultField,\n defaultSortBy: defaultField,\n defaultSortOrder: 'ASC',\n ...getModelSettings(schema),\n };\n};\n\nconst syncSettings = async (configuration: any, schema: any) => {\n if (isEmpty(configuration.settings)) return createDefaultSettings(schema);\n\n const defaultField = getDefaultMainField(schema);\n\n const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};\n\n return {\n ...configuration.settings,\n mainField: isSortable(schema, mainField) ? mainField : defaultField,\n defaultSortBy: (await isValidDefaultSort(schema, defaultSortBy)) ? defaultSortBy : defaultField,\n };\n};\n\nexport { isValidDefaultSort, createDefaultSettings, syncSettings };\n"],"names":["DEFAULT_SETTINGS","bulkable","filterable","searchable","pageSize","relationOpenMode","settingsFields","getModelSettings","model","pick","get","isValidDefaultSort","schema","value","parsedValue","qs","parse","omitNonSortableAttributes","key","remove","sortableAttributes","getSortableAttributes","includes","sanitizedValue","traverse","traverseQuerySort","getModel","strapi","bind","isEqual","createDefaultSettings","defaultField","getDefaultMainField","mainField","defaultSortBy","defaultSortOrder","syncSettings","configuration","isEmpty","settings","isSortable"],"mappings":";;;;;;;;;;;AAMA,wBACA,MAAMA,gBAAAA,GAAmB;IACvBC,QAAAA,EAAU,IAAA;IACVC,UAAAA,EAAY,IAAA;IACZC,UAAAA,EAAY,IAAA;IACZC,QAAAA,EAAU,EAAA;IACVC,gBAAAA,EAAkB;AACpB,CAAA;AAEA,MAAMC,cAAAA,GAAiB;AACrB,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,eAAA;AACA,IAAA,kBAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,gBAAAA,GAAmB,CAACC,KAAAA,GACxBC,MAAAA,CAAKC,MAAIF,KAAAA,EAAO,iBAAA,EAAmB,EAAC,CAAA,EAAIF,cAAAA,CAAAA;AAE1C,eAAeK,kBAAAA,CAAmBC,MAAW,EAAEC,KAAU,EAAA;IACvD,MAAMC,WAAAA,GAAcC,mBAAAA,CAAGC,KAAK,CAACH,KAAAA,CAAAA;IAE7B,MAAMI,yBAAAA,GAA4B,CAAC,EAAEL,MAAM,EAAEM,GAAG,EAAO,EAAE,EAAEC,MAAM,EAAO,GAAA;AACtE,QAAA,MAAMC,qBAAqBC,gCAAAA,CAAsBT,MAAAA,CAAAA;AACjD,QAAA,IAAI,CAACQ,kBAAAA,CAAmBE,QAAQ,CAACJ,GAAAA,CAAAA,EAAM;YACrCC,MAAAA,CAAOD,GAAAA,CAAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMK,cAAAA,GAAiB,MAAMC,oBAAAA,CAASC,iBAAiB,CACrDR,yBAAAA,EACA;AAAEL,QAAAA,MAAAA;AAAQc,QAAAA,QAAAA,EAAUC,MAAAA,CAAOD,QAAQ,CAACE,IAAI,CAACD,MAAAA;KAAQ,EACjDb,WAAAA,CAAAA;;AAIF,IAAA,OAAOe,UAAQf,WAAAA,EAAaS,cAAAA,CAAAA;AAC9B;AAEA,MAAMO,wBAAwB,OAAOlB,MAAAA,GAAAA;AACnC,IAAA,MAAMmB,eAAeC,8BAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,OAAO;AACL,QAAA,GAAGZ,gBAAgB;QACnBiC,SAAAA,EAAWF,YAAAA;QACXG,aAAAA,EAAeH,YAAAA;QACfI,gBAAAA,EAAkB,KAAA;AAClB,QAAA,GAAG5B,iBAAiBK,MAAAA;AACtB,KAAA;AACF;AAEA,MAAMwB,YAAAA,GAAe,OAAOC,aAAAA,EAAoBzB,MAAAA,GAAAA;AAC9C,IAAA,IAAI0B,SAAAA,CAAQD,aAAAA,CAAcE,QAAQ,CAAA,EAAG,OAAOT,qBAAAA,CAAsBlB,MAAAA,CAAAA;AAElE,IAAA,MAAMmB,eAAeC,8BAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,MAAM,EAAEqB,SAAAA,GAAYF,YAAY,EAAEG,aAAAA,GAAgBH,YAAY,EAAE,GAAGM,aAAAA,CAAcE,QAAQ,IAAI,EAAC;IAE9F,OAAO;AACL,QAAA,GAAGF,cAAcE,QAAQ;QACzBN,SAAAA,EAAWO,qBAAAA,CAAW5B,MAAAA,EAAQqB,SAAAA,CAAAA,GAAaA,SAAAA,GAAYF,YAAAA;AACvDG,QAAAA,aAAAA,EAAe,MAAOvB,kBAAAA,CAAmBC,MAAAA,EAAQsB,iBAAkBA,aAAAA,GAAgBH;AACrF,KAAA;AACF;;;;;;"}
@@ -1,4 +1,4 @@
1
- import { pipe, propOr, pick, isEqual, isEmpty } from 'lodash/fp';
1
+ import { isEqual, isEmpty, pick, get } from 'lodash';
2
2
  import { traverse } from '@strapi/utils';
3
3
  import qs from 'qs';
4
4
  import { getDefaultMainField, isSortable, getSortableAttributes } from './attributes.mjs';
@@ -20,10 +20,7 @@ const settingsFields = [
20
20
  'defaultSortOrder',
21
21
  'relationOpenMode'
22
22
  ];
23
- const getModelSettings = pipe([
24
- propOr({}, 'config.settings'),
25
- pick(settingsFields)
26
- ]);
23
+ const getModelSettings = (model)=>pick(get(model, 'config.settings', {}), settingsFields);
27
24
  async function isValidDefaultSort(schema, value) {
28
25
  const parsedValue = qs.parse(value);
29
26
  const omitNonSortableAttributes = ({ schema, key }, { remove })=>{
@@ -1 +1 @@
1
- {"version":3,"file":"settings.mjs","sources":["../../../../../server/src/services/utils/configuration/settings.ts"],"sourcesContent":["import { isEmpty, pick, pipe, propOr, isEqual } from 'lodash/fp';\nimport { traverse } from '@strapi/utils';\nimport qs from 'qs';\nimport { isSortable, getDefaultMainField, getSortableAttributes } from './attributes';\n\n/** General settings */\nconst DEFAULT_SETTINGS = {\n bulkable: true,\n filterable: true,\n searchable: true,\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\nconst settingsFields = [\n 'searchable',\n 'filterable',\n 'bulkable',\n 'pageSize',\n 'mainField',\n 'defaultSortBy',\n 'defaultSortOrder',\n 'relationOpenMode',\n];\n\nconst getModelSettings = pipe([propOr({}, 'config.settings'), pick(settingsFields)]);\n\nasync function isValidDefaultSort(schema: any, value: any) {\n const parsedValue = qs.parse(value);\n\n const omitNonSortableAttributes = ({ schema, key }: any, { remove }: any) => {\n const sortableAttributes = getSortableAttributes(schema);\n if (!sortableAttributes.includes(key)) {\n remove(key);\n }\n };\n\n const sanitizedValue = await traverse.traverseQuerySort(\n omitNonSortableAttributes,\n { schema, getModel: strapi.getModel.bind(strapi) },\n parsedValue\n );\n\n // If any of the keys has been removed, the sort attribute is not valid\n return isEqual(parsedValue, sanitizedValue);\n}\n\nconst createDefaultSettings = async (schema: any) => {\n const defaultField = getDefaultMainField(schema);\n\n return {\n ...DEFAULT_SETTINGS,\n mainField: defaultField,\n defaultSortBy: defaultField,\n defaultSortOrder: 'ASC',\n ...getModelSettings(schema),\n };\n};\n\nconst syncSettings = async (configuration: any, schema: any) => {\n if (isEmpty(configuration.settings)) return createDefaultSettings(schema);\n\n const defaultField = getDefaultMainField(schema);\n\n const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};\n\n return {\n ...configuration.settings,\n mainField: isSortable(schema, mainField) ? mainField : defaultField,\n defaultSortBy: (await isValidDefaultSort(schema, defaultSortBy)) ? defaultSortBy : defaultField,\n };\n};\n\nexport { isValidDefaultSort, createDefaultSettings, syncSettings };\n"],"names":["DEFAULT_SETTINGS","bulkable","filterable","searchable","pageSize","relationOpenMode","settingsFields","getModelSettings","pipe","propOr","pick","isValidDefaultSort","schema","value","parsedValue","qs","parse","omitNonSortableAttributes","key","remove","sortableAttributes","getSortableAttributes","includes","sanitizedValue","traverse","traverseQuerySort","getModel","strapi","bind","isEqual","createDefaultSettings","defaultField","getDefaultMainField","mainField","defaultSortBy","defaultSortOrder","syncSettings","configuration","isEmpty","settings","isSortable"],"mappings":";;;;;AAKA,wBACA,MAAMA,gBAAAA,GAAmB;IACvBC,QAAAA,EAAU,IAAA;IACVC,UAAAA,EAAY,IAAA;IACZC,UAAAA,EAAY,IAAA;IACZC,QAAAA,EAAU,EAAA;IACVC,gBAAAA,EAAkB;AACpB,CAAA;AAEA,MAAMC,cAAAA,GAAiB;AACrB,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,eAAA;AACA,IAAA,kBAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,mBAAmBC,IAAAA,CAAK;AAACC,IAAAA,MAAAA,CAAO,EAAC,EAAG,iBAAA,CAAA;IAAoBC,IAAAA,CAAKJ,cAAAA;AAAgB,CAAA,CAAA;AAEnF,eAAeK,kBAAAA,CAAmBC,MAAW,EAAEC,KAAU,EAAA;IACvD,MAAMC,WAAAA,GAAcC,EAAAA,CAAGC,KAAK,CAACH,KAAAA,CAAAA;IAE7B,MAAMI,yBAAAA,GAA4B,CAAC,EAAEL,MAAM,EAAEM,GAAG,EAAO,EAAE,EAAEC,MAAM,EAAO,GAAA;AACtE,QAAA,MAAMC,qBAAqBC,qBAAAA,CAAsBT,MAAAA,CAAAA;AACjD,QAAA,IAAI,CAACQ,kBAAAA,CAAmBE,QAAQ,CAACJ,GAAAA,CAAAA,EAAM;YACrCC,MAAAA,CAAOD,GAAAA,CAAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMK,cAAAA,GAAiB,MAAMC,QAAAA,CAASC,iBAAiB,CACrDR,yBAAAA,EACA;AAAEL,QAAAA,MAAAA;AAAQc,QAAAA,QAAAA,EAAUC,MAAAA,CAAOD,QAAQ,CAACE,IAAI,CAACD,MAAAA;KAAQ,EACjDb,WAAAA,CAAAA;;AAIF,IAAA,OAAOe,QAAQf,WAAAA,EAAaS,cAAAA,CAAAA;AAC9B;AAEA,MAAMO,wBAAwB,OAAOlB,MAAAA,GAAAA;AACnC,IAAA,MAAMmB,eAAeC,mBAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,OAAO;AACL,QAAA,GAAGZ,gBAAgB;QACnBiC,SAAAA,EAAWF,YAAAA;QACXG,aAAAA,EAAeH,YAAAA;QACfI,gBAAAA,EAAkB,KAAA;AAClB,QAAA,GAAG5B,iBAAiBK,MAAAA;AACtB,KAAA;AACF;AAEA,MAAMwB,YAAAA,GAAe,OAAOC,aAAAA,EAAoBzB,MAAAA,GAAAA;AAC9C,IAAA,IAAI0B,OAAAA,CAAQD,aAAAA,CAAcE,QAAQ,CAAA,EAAG,OAAOT,qBAAAA,CAAsBlB,MAAAA,CAAAA;AAElE,IAAA,MAAMmB,eAAeC,mBAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,MAAM,EAAEqB,SAAAA,GAAYF,YAAY,EAAEG,aAAAA,GAAgBH,YAAY,EAAE,GAAGM,aAAAA,CAAcE,QAAQ,IAAI,EAAC;IAE9F,OAAO;AACL,QAAA,GAAGF,cAAcE,QAAQ;QACzBN,SAAAA,EAAWO,UAAAA,CAAW5B,MAAAA,EAAQqB,SAAAA,CAAAA,GAAaA,SAAAA,GAAYF,YAAAA;AACvDG,QAAAA,aAAAA,EAAe,MAAOvB,kBAAAA,CAAmBC,MAAAA,EAAQsB,iBAAkBA,aAAAA,GAAgBH;AACrF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"settings.mjs","sources":["../../../../../server/src/services/utils/configuration/settings.ts"],"sourcesContent":["import { get, pick, isEmpty, isEqual } from 'lodash';\n\nimport { traverse } from '@strapi/utils';\nimport qs from 'qs';\nimport { isSortable, getDefaultMainField, getSortableAttributes } from './attributes';\n\n/** General settings */\nconst DEFAULT_SETTINGS = {\n bulkable: true,\n filterable: true,\n searchable: true,\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\nconst settingsFields = [\n 'searchable',\n 'filterable',\n 'bulkable',\n 'pageSize',\n 'mainField',\n 'defaultSortBy',\n 'defaultSortOrder',\n 'relationOpenMode',\n];\n\nconst getModelSettings = (model: unknown) =>\n pick(get(model, 'config.settings', {}), settingsFields);\n\nasync function isValidDefaultSort(schema: any, value: any) {\n const parsedValue = qs.parse(value);\n\n const omitNonSortableAttributes = ({ schema, key }: any, { remove }: any) => {\n const sortableAttributes = getSortableAttributes(schema);\n if (!sortableAttributes.includes(key)) {\n remove(key);\n }\n };\n\n const sanitizedValue = await traverse.traverseQuerySort(\n omitNonSortableAttributes,\n { schema, getModel: strapi.getModel.bind(strapi) },\n parsedValue\n );\n\n // If any of the keys has been removed, the sort attribute is not valid\n return isEqual(parsedValue, sanitizedValue);\n}\n\nconst createDefaultSettings = async (schema: any) => {\n const defaultField = getDefaultMainField(schema);\n\n return {\n ...DEFAULT_SETTINGS,\n mainField: defaultField,\n defaultSortBy: defaultField,\n defaultSortOrder: 'ASC',\n ...getModelSettings(schema),\n };\n};\n\nconst syncSettings = async (configuration: any, schema: any) => {\n if (isEmpty(configuration.settings)) return createDefaultSettings(schema);\n\n const defaultField = getDefaultMainField(schema);\n\n const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};\n\n return {\n ...configuration.settings,\n mainField: isSortable(schema, mainField) ? mainField : defaultField,\n defaultSortBy: (await isValidDefaultSort(schema, defaultSortBy)) ? defaultSortBy : defaultField,\n };\n};\n\nexport { isValidDefaultSort, createDefaultSettings, syncSettings };\n"],"names":["DEFAULT_SETTINGS","bulkable","filterable","searchable","pageSize","relationOpenMode","settingsFields","getModelSettings","model","pick","get","isValidDefaultSort","schema","value","parsedValue","qs","parse","omitNonSortableAttributes","key","remove","sortableAttributes","getSortableAttributes","includes","sanitizedValue","traverse","traverseQuerySort","getModel","strapi","bind","isEqual","createDefaultSettings","defaultField","getDefaultMainField","mainField","defaultSortBy","defaultSortOrder","syncSettings","configuration","isEmpty","settings","isSortable"],"mappings":";;;;;AAMA,wBACA,MAAMA,gBAAAA,GAAmB;IACvBC,QAAAA,EAAU,IAAA;IACVC,UAAAA,EAAY,IAAA;IACZC,UAAAA,EAAY,IAAA;IACZC,QAAAA,EAAU,EAAA;IACVC,gBAAAA,EAAkB;AACpB,CAAA;AAEA,MAAMC,cAAAA,GAAiB;AACrB,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,eAAA;AACA,IAAA,kBAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,gBAAAA,GAAmB,CAACC,KAAAA,GACxBC,IAAAA,CAAKC,IAAIF,KAAAA,EAAO,iBAAA,EAAmB,EAAC,CAAA,EAAIF,cAAAA,CAAAA;AAE1C,eAAeK,kBAAAA,CAAmBC,MAAW,EAAEC,KAAU,EAAA;IACvD,MAAMC,WAAAA,GAAcC,EAAAA,CAAGC,KAAK,CAACH,KAAAA,CAAAA;IAE7B,MAAMI,yBAAAA,GAA4B,CAAC,EAAEL,MAAM,EAAEM,GAAG,EAAO,EAAE,EAAEC,MAAM,EAAO,GAAA;AACtE,QAAA,MAAMC,qBAAqBC,qBAAAA,CAAsBT,MAAAA,CAAAA;AACjD,QAAA,IAAI,CAACQ,kBAAAA,CAAmBE,QAAQ,CAACJ,GAAAA,CAAAA,EAAM;YACrCC,MAAAA,CAAOD,GAAAA,CAAAA;AACT,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMK,cAAAA,GAAiB,MAAMC,QAAAA,CAASC,iBAAiB,CACrDR,yBAAAA,EACA;AAAEL,QAAAA,MAAAA;AAAQc,QAAAA,QAAAA,EAAUC,MAAAA,CAAOD,QAAQ,CAACE,IAAI,CAACD,MAAAA;KAAQ,EACjDb,WAAAA,CAAAA;;AAIF,IAAA,OAAOe,QAAQf,WAAAA,EAAaS,cAAAA,CAAAA;AAC9B;AAEA,MAAMO,wBAAwB,OAAOlB,MAAAA,GAAAA;AACnC,IAAA,MAAMmB,eAAeC,mBAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,OAAO;AACL,QAAA,GAAGZ,gBAAgB;QACnBiC,SAAAA,EAAWF,YAAAA;QACXG,aAAAA,EAAeH,YAAAA;QACfI,gBAAAA,EAAkB,KAAA;AAClB,QAAA,GAAG5B,iBAAiBK,MAAAA;AACtB,KAAA;AACF;AAEA,MAAMwB,YAAAA,GAAe,OAAOC,aAAAA,EAAoBzB,MAAAA,GAAAA;AAC9C,IAAA,IAAI0B,OAAAA,CAAQD,aAAAA,CAAcE,QAAQ,CAAA,EAAG,OAAOT,qBAAAA,CAAsBlB,MAAAA,CAAAA;AAElE,IAAA,MAAMmB,eAAeC,mBAAAA,CAAoBpB,MAAAA,CAAAA;IAEzC,MAAM,EAAEqB,SAAAA,GAAYF,YAAY,EAAEG,aAAAA,GAAgBH,YAAY,EAAE,GAAGM,aAAAA,CAAcE,QAAQ,IAAI,EAAC;IAE9F,OAAO;AACL,QAAA,GAAGF,cAAcE,QAAQ;QACzBN,SAAAA,EAAWO,UAAAA,CAAW5B,MAAAA,EAAQqB,SAAAA,CAAAA,GAAaA,SAAAA,GAAYF,YAAAA;AACvDG,QAAAA,aAAAA,EAAe,MAAOvB,kBAAAA,CAAmBC,MAAAA,EAAQsB,iBAAkBA,aAAAA,GAAgBH;AACrF,KAAA;AACF;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var strapiUtils = require('@strapi/utils');
5
5
  var draftRelations = require('./draft-relations.js');
6
6
 
@@ -25,7 +25,6 @@ function _interopNamespace(e) {
25
25
  var strapiUtils__namespace = /*#__PURE__*/_interopNamespace(strapiUtils);
26
26
 
27
27
  const { isVisibleAttribute, hasDraftAndPublish } = strapiUtils__namespace.contentTypes;
28
- const isLocalizedContentType = (model)=>model.pluginOptions?.i18n?.localized === true;
29
28
  const toPublishedDocumentKey = (documentId, locale)=>`${documentId}:${locale ?? ''}`;
30
29
  const mergeCollectedLinks = (left, right)=>({
31
30
  m2mLinks: [
@@ -69,8 +68,8 @@ const collectDraftRelationLinks = (strapi, entity, uid, documentLocale)=>{
69
68
  if (attribute.target === uid || !isVisibleAttribute(model, attributeName)) {
70
69
  return collected;
71
70
  }
72
- const targetIsLocalized = isLocalizedContentType(targetModel);
73
- const relatedEntries = fp.castArray(value);
71
+ const targetIsLocalized = strapi.localization.isLocalizedContentType(targetModel);
72
+ const relatedEntries = _.castArray(value);
74
73
  const links = relatedEntries.map((entry)=>toDraftRelationLink(entry, attribute.target, targetIsLocalized, locale)).filter((link)=>link !== null);
75
74
  if (links.length === 0) {
76
75
  return collected;
@@ -94,7 +93,7 @@ const collectDraftRelationLinks = (strapi, entity, uid, documentLocale)=>{
94
93
  }
95
94
  case 'component':
96
95
  {
97
- return fp.castArray(value).reduce((componentCollected, componentValue)=>mergeCollectedLinks(componentCollected, collectDraftRelationLinks(strapi, componentValue, attribute.component, locale)), collected);
96
+ return _.castArray(value).reduce((componentCollected, componentValue)=>mergeCollectedLinks(componentCollected, collectDraftRelationLinks(strapi, componentValue, attribute.component, locale)), collected);
98
97
  }
99
98
  case 'dynamiczone':
100
99
  {
@@ -122,14 +121,16 @@ const countLinksToUnpublishedDocuments = async (strapi, links)=>{
122
121
  }, new Map());
123
122
  const counts = await Promise.all(Array.from(linksByTarget.entries()).map(async ([targetUid, targetLinks])=>{
124
123
  const targetModel = strapi.getModel(targetUid);
125
- const targetIsLocalized = isLocalizedContentType(targetModel);
124
+ const targetIsLocalized = strapi.localization.isLocalizedContentType(targetModel);
126
125
  const documentIds = [
127
126
  ...new Set(targetLinks.map((link)=>link.documentId))
128
127
  ];
129
128
  const publishedRows = await strapi.db.query(targetUid).findMany({
130
- select: [
129
+ select: targetIsLocalized === true ? [
131
130
  'documentId',
132
131
  'locale'
132
+ ] : [
133
+ 'documentId'
133
134
  ],
134
135
  where: {
135
136
  documentId: {
@@ -1 +1 @@
1
- {"version":3,"file":"draft.js","sources":["../../../../server/src/services/utils/draft.ts"],"sourcesContent":["import { castArray } from 'lodash/fp';\nimport * as strapiUtils from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\n\nimport { type DraftRelationCounts, isBidirectionalManyToMany } from './draft-relations';\n\nconst { isVisibleAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;\n\nconst isLocalizedContentType = (model: { pluginOptions?: unknown }) =>\n (model.pluginOptions as { i18n?: { localized?: boolean } } | undefined)?.i18n?.localized === true;\n\ntype DraftRelationLinkRef = {\n targetUid: UID.Schema;\n documentId: string;\n locale?: string | null;\n};\n\ntype CollectedDraftRelationLinks = {\n m2mLinks: DraftRelationLinkRef[];\n xToOneLinks: DraftRelationLinkRef[];\n};\n\nconst toPublishedDocumentKey = (documentId: string, locale?: string | null) =>\n `${documentId}:${locale ?? ''}`;\n\nconst mergeCollectedLinks = (\n left: CollectedDraftRelationLinks,\n right: CollectedDraftRelationLinks\n): CollectedDraftRelationLinks => ({\n m2mLinks: [...left.m2mLinks, ...right.m2mLinks],\n xToOneLinks: [...left.xToOneLinks, ...right.xToOneLinks],\n});\n\nconst toDraftRelationLink = (\n entry: { documentId?: string; locale?: string | null },\n targetUid: UID.Schema,\n targetIsLocalized: boolean,\n documentLocale?: string | null\n): DraftRelationLinkRef | null => {\n if (!entry?.documentId) {\n return null;\n }\n\n return {\n targetUid,\n documentId: entry.documentId,\n locale: targetIsLocalized ? (entry.locale ?? documentLocale) : null,\n };\n};\n\nconst collectDraftRelationLinks = (\n strapi: Core.Strapi,\n entity: any,\n uid: UID.Schema,\n documentLocale?: string | null\n): CollectedDraftRelationLinks => {\n const model = strapi.getModel(uid);\n const locale = entity.locale ?? documentLocale;\n\n return Object.keys(model.attributes).reduce(\n (collected, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const value = entity[attributeName];\n\n if (!value) {\n return collected;\n }\n\n switch (attribute.type) {\n case 'relation': {\n if (!('target' in attribute)) {\n return collected;\n }\n\n const targetModel = strapi.getModel(attribute.target as UID.Schema);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n return collected;\n }\n\n if (attribute.target === uid || !isVisibleAttribute(model, attributeName)) {\n return collected;\n }\n\n const targetIsLocalized = isLocalizedContentType(targetModel);\n const relatedEntries = castArray(value);\n const links = relatedEntries\n .map((entry) => toDraftRelationLink(entry, attribute.target, targetIsLocalized, locale))\n .filter((link): link is DraftRelationLinkRef => link !== null);\n\n if (links.length === 0) {\n return collected;\n }\n\n if (isBidirectionalManyToMany(attribute)) {\n return {\n ...collected,\n m2mLinks: [...collected.m2mLinks, ...links],\n };\n }\n\n return {\n ...collected,\n xToOneLinks: [...collected.xToOneLinks, ...links],\n };\n }\n case 'component': {\n return castArray(value).reduce(\n (componentCollected, componentValue) =>\n mergeCollectedLinks(\n componentCollected,\n collectDraftRelationLinks(strapi, componentValue, attribute.component, locale)\n ),\n collected\n );\n }\n case 'dynamiczone': {\n return value.reduce((zoneCollected: CollectedDraftRelationLinks, componentValue: any) => {\n return mergeCollectedLinks(\n zoneCollected,\n collectDraftRelationLinks(strapi, componentValue, componentValue.__component, locale)\n );\n }, collected);\n }\n default:\n return collected;\n }\n },\n { m2mLinks: [], xToOneLinks: [] } as CollectedDraftRelationLinks\n );\n};\n\nconst countLinksToUnpublishedDocuments = async (\n strapi: Core.Strapi,\n links: DraftRelationLinkRef[]\n) => {\n if (links.length === 0) {\n return 0;\n }\n\n const linksByTarget = links.reduce<Map<UID.Schema, DraftRelationLinkRef[]>>((acc, link) => {\n const targetLinks = acc.get(link.targetUid) ?? [];\n targetLinks.push(link);\n acc.set(link.targetUid, targetLinks);\n return acc;\n }, new Map());\n\n const counts = await Promise.all(\n Array.from(linksByTarget.entries()).map(async ([targetUid, targetLinks]) => {\n const targetModel = strapi.getModel(targetUid);\n const targetIsLocalized = isLocalizedContentType(targetModel);\n const documentIds = [...new Set(targetLinks.map((link) => link.documentId))];\n\n const publishedRows = await strapi.db.query(targetUid).findMany({\n select: ['documentId', 'locale'],\n where: {\n documentId: { $in: documentIds },\n publishedAt: { $notNull: true },\n },\n });\n\n if (!targetIsLocalized) {\n const publishedDocumentIds = new Set(publishedRows.map((row) => row.documentId));\n\n return targetLinks.filter((link) => !publishedDocumentIds.has(link.documentId)).length;\n }\n\n const publishedDocumentKeys = new Set(\n publishedRows.map((row) => toPublishedDocumentKey(row.documentId, row.locale))\n );\n\n return targetLinks.filter(\n (link) => !publishedDocumentKeys.has(toPublishedDocumentKey(link.documentId, link.locale))\n ).length;\n })\n );\n\n return counts.reduce((total, count) => total + count, 0);\n};\n\n/**\n * sumDraftCounts works recursively on the attributes of a model counting draft relations\n * that matter for publish warnings.\n *\n * - unpublishedRelations: xToOne / oneToMany style links stripped from the published version\n * - draftM2mLinks: bidirectional manyToMany links to documents without a published version\n */\nconst sumDraftCounts = async (\n strapi: Core.Strapi,\n entity: any,\n uid: UID.Schema\n): Promise<DraftRelationCounts> => {\n const { m2mLinks, xToOneLinks } = collectDraftRelationLinks(strapi, entity, uid);\n\n const [draftM2mLinks, unpublishedRelations] = await Promise.all([\n countLinksToUnpublishedDocuments(strapi, m2mLinks),\n countLinksToUnpublishedDocuments(strapi, xToOneLinks),\n ]);\n\n return {\n unpublishedRelations,\n draftM2mLinks,\n };\n};\n\nexport { sumDraftCounts };\n"],"names":["isVisibleAttribute","hasDraftAndPublish","strapiUtils","contentTypes","isLocalizedContentType","model","pluginOptions","i18n","localized","toPublishedDocumentKey","documentId","locale","mergeCollectedLinks","left","right","m2mLinks","xToOneLinks","toDraftRelationLink","entry","targetUid","targetIsLocalized","documentLocale","collectDraftRelationLinks","strapi","entity","uid","getModel","Object","keys","attributes","reduce","collected","attributeName","attribute","value","type","targetModel","target","relatedEntries","castArray","links","map","filter","link","length","isBidirectionalManyToMany","componentCollected","componentValue","component","zoneCollected","__component","countLinksToUnpublishedDocuments","linksByTarget","acc","targetLinks","get","push","set","Map","counts","Promise","all","Array","from","entries","documentIds","Set","publishedRows","db","query","findMany","select","where","$in","publishedAt","$notNull","publishedDocumentIds","row","has","publishedDocumentKeys","total","count","sumDraftCounts","draftM2mLinks","unpublishedRelations"],"mappings":"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"}
1
+ {"version":3,"file":"draft.js","sources":["../../../../server/src/services/utils/draft.ts"],"sourcesContent":["import { castArray } from 'lodash';\n\nimport * as strapiUtils from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\n\nimport { type DraftRelationCounts, isBidirectionalManyToMany } from './draft-relations';\n\nconst { isVisibleAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;\n\ntype DraftRelationLinkRef = {\n targetUid: UID.Schema;\n documentId: string;\n locale?: string | null;\n};\n\ntype CollectedDraftRelationLinks = {\n m2mLinks: DraftRelationLinkRef[];\n xToOneLinks: DraftRelationLinkRef[];\n};\n\nconst toPublishedDocumentKey = (documentId: string, locale?: string | null) =>\n `${documentId}:${locale ?? ''}`;\n\nconst mergeCollectedLinks = (\n left: CollectedDraftRelationLinks,\n right: CollectedDraftRelationLinks\n): CollectedDraftRelationLinks => ({\n m2mLinks: [...left.m2mLinks, ...right.m2mLinks],\n xToOneLinks: [...left.xToOneLinks, ...right.xToOneLinks],\n});\n\nconst toDraftRelationLink = (\n entry: { documentId?: string; locale?: string | null },\n targetUid: UID.Schema,\n targetIsLocalized: boolean,\n documentLocale?: string | null\n): DraftRelationLinkRef | null => {\n if (!entry?.documentId) {\n return null;\n }\n\n return {\n targetUid,\n documentId: entry.documentId,\n locale: targetIsLocalized ? (entry.locale ?? documentLocale) : null,\n };\n};\n\nconst collectDraftRelationLinks = (\n strapi: Core.Strapi,\n entity: any,\n uid: UID.Schema,\n documentLocale?: string | null\n): CollectedDraftRelationLinks => {\n const model = strapi.getModel(uid);\n const locale = entity.locale ?? documentLocale;\n\n return Object.keys(model.attributes).reduce(\n (collected, attributeName) => {\n const attribute: any = model.attributes[attributeName];\n const value = entity[attributeName];\n\n if (!value) {\n return collected;\n }\n\n switch (attribute.type) {\n case 'relation': {\n if (!('target' in attribute)) {\n return collected;\n }\n\n const targetModel = strapi.getModel(attribute.target as UID.Schema);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n return collected;\n }\n\n if (attribute.target === uid || !isVisibleAttribute(model, attributeName)) {\n return collected;\n }\n\n const targetIsLocalized = strapi.localization.isLocalizedContentType(targetModel);\n const relatedEntries = castArray(value);\n const links = relatedEntries\n .map((entry) => toDraftRelationLink(entry, attribute.target, targetIsLocalized, locale))\n .filter((link): link is DraftRelationLinkRef => link !== null);\n\n if (links.length === 0) {\n return collected;\n }\n\n if (isBidirectionalManyToMany(attribute)) {\n return {\n ...collected,\n m2mLinks: [...collected.m2mLinks, ...links],\n };\n }\n\n return {\n ...collected,\n xToOneLinks: [...collected.xToOneLinks, ...links],\n };\n }\n case 'component': {\n return castArray(value).reduce(\n (componentCollected, componentValue) =>\n mergeCollectedLinks(\n componentCollected,\n collectDraftRelationLinks(strapi, componentValue, attribute.component, locale)\n ),\n collected\n );\n }\n case 'dynamiczone': {\n return value.reduce((zoneCollected: CollectedDraftRelationLinks, componentValue: any) => {\n return mergeCollectedLinks(\n zoneCollected,\n collectDraftRelationLinks(strapi, componentValue, componentValue.__component, locale)\n );\n }, collected);\n }\n default:\n return collected;\n }\n },\n { m2mLinks: [], xToOneLinks: [] } as CollectedDraftRelationLinks\n );\n};\n\nconst countLinksToUnpublishedDocuments = async (\n strapi: Core.Strapi,\n links: DraftRelationLinkRef[]\n) => {\n if (links.length === 0) {\n return 0;\n }\n\n const linksByTarget = links.reduce<Map<UID.Schema, DraftRelationLinkRef[]>>((acc, link) => {\n const targetLinks = acc.get(link.targetUid) ?? [];\n targetLinks.push(link);\n acc.set(link.targetUid, targetLinks);\n return acc;\n }, new Map());\n\n const counts = await Promise.all(\n Array.from(linksByTarget.entries()).map(async ([targetUid, targetLinks]) => {\n const targetModel = strapi.getModel(targetUid);\n const targetIsLocalized = strapi.localization.isLocalizedContentType(targetModel);\n const documentIds = [...new Set(targetLinks.map((link) => link.documentId))];\n\n const publishedRows = await strapi.db.query(targetUid).findMany({\n select: targetIsLocalized === true ? ['documentId', 'locale'] : ['documentId'],\n where: {\n documentId: { $in: documentIds },\n publishedAt: { $notNull: true },\n },\n });\n\n if (!targetIsLocalized) {\n const publishedDocumentIds = new Set(publishedRows.map((row) => row.documentId));\n\n return targetLinks.filter((link) => !publishedDocumentIds.has(link.documentId)).length;\n }\n\n const publishedDocumentKeys = new Set(\n publishedRows.map((row) => toPublishedDocumentKey(row.documentId, row.locale))\n );\n\n return targetLinks.filter(\n (link) => !publishedDocumentKeys.has(toPublishedDocumentKey(link.documentId, link.locale))\n ).length;\n })\n );\n\n return counts.reduce((total, count) => total + count, 0);\n};\n\n/**\n * sumDraftCounts works recursively on the attributes of a model counting draft relations\n * that matter for publish warnings.\n *\n * - unpublishedRelations: xToOne / oneToMany style links stripped from the published version\n * - draftM2mLinks: bidirectional manyToMany links to documents without a published version\n */\nconst sumDraftCounts = async (\n strapi: Core.Strapi,\n entity: any,\n uid: UID.Schema\n): Promise<DraftRelationCounts> => {\n const { m2mLinks, xToOneLinks } = collectDraftRelationLinks(strapi, entity, uid);\n\n const [draftM2mLinks, unpublishedRelations] = await Promise.all([\n countLinksToUnpublishedDocuments(strapi, m2mLinks),\n countLinksToUnpublishedDocuments(strapi, xToOneLinks),\n ]);\n\n return {\n unpublishedRelations,\n draftM2mLinks,\n };\n};\n\nexport { sumDraftCounts };\n"],"names":["isVisibleAttribute","hasDraftAndPublish","strapiUtils","contentTypes","toPublishedDocumentKey","documentId","locale","mergeCollectedLinks","left","right","m2mLinks","xToOneLinks","toDraftRelationLink","entry","targetUid","targetIsLocalized","documentLocale","collectDraftRelationLinks","strapi","entity","uid","model","getModel","Object","keys","attributes","reduce","collected","attributeName","attribute","value","type","targetModel","target","localization","isLocalizedContentType","relatedEntries","castArray","links","map","filter","link","length","isBidirectionalManyToMany","componentCollected","componentValue","component","zoneCollected","__component","countLinksToUnpublishedDocuments","linksByTarget","acc","targetLinks","get","push","set","Map","counts","Promise","all","Array","from","entries","documentIds","Set","publishedRows","db","query","findMany","select","where","$in","publishedAt","$notNull","publishedDocumentIds","row","has","publishedDocumentKeys","total","count","sumDraftCounts","draftM2mLinks","unpublishedRelations"],"mappings":"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"}
@@ -1,9 +1,8 @@
1
- import { castArray } from 'lodash/fp';
1
+ import { castArray } from 'lodash';
2
2
  import * as strapiUtils from '@strapi/utils';
3
3
  import { isBidirectionalManyToMany } from './draft-relations.mjs';
4
4
 
5
5
  const { isVisibleAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;
6
- const isLocalizedContentType = (model)=>model.pluginOptions?.i18n?.localized === true;
7
6
  const toPublishedDocumentKey = (documentId, locale)=>`${documentId}:${locale ?? ''}`;
8
7
  const mergeCollectedLinks = (left, right)=>({
9
8
  m2mLinks: [
@@ -47,7 +46,7 @@ const collectDraftRelationLinks = (strapi, entity, uid, documentLocale)=>{
47
46
  if (attribute.target === uid || !isVisibleAttribute(model, attributeName)) {
48
47
  return collected;
49
48
  }
50
- const targetIsLocalized = isLocalizedContentType(targetModel);
49
+ const targetIsLocalized = strapi.localization.isLocalizedContentType(targetModel);
51
50
  const relatedEntries = castArray(value);
52
51
  const links = relatedEntries.map((entry)=>toDraftRelationLink(entry, attribute.target, targetIsLocalized, locale)).filter((link)=>link !== null);
53
52
  if (links.length === 0) {
@@ -100,14 +99,16 @@ const countLinksToUnpublishedDocuments = async (strapi, links)=>{
100
99
  }, new Map());
101
100
  const counts = await Promise.all(Array.from(linksByTarget.entries()).map(async ([targetUid, targetLinks])=>{
102
101
  const targetModel = strapi.getModel(targetUid);
103
- const targetIsLocalized = isLocalizedContentType(targetModel);
102
+ const targetIsLocalized = strapi.localization.isLocalizedContentType(targetModel);
104
103
  const documentIds = [
105
104
  ...new Set(targetLinks.map((link)=>link.documentId))
106
105
  ];
107
106
  const publishedRows = await strapi.db.query(targetUid).findMany({
108
- select: [
107
+ select: targetIsLocalized === true ? [
109
108
  'documentId',
110
109
  'locale'
110
+ ] : [
111
+ 'documentId'
111
112
  ],
112
113
  where: {
113
114
  documentId: {