@strapi/content-manager 5.56.0 → 5.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) 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 +40 -8
  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 +41 -9
  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/services/relations.js +3 -0
  62. package/dist/admin/services/relations.js.map +1 -1
  63. package/dist/admin/services/relations.mjs +3 -0
  64. package/dist/admin/services/relations.mjs.map +1 -1
  65. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +2 -1
  66. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +19 -2
  67. package/dist/admin/src/services/documents.d.ts +10 -2
  68. package/dist/admin/translations/en.json.js +2 -0
  69. package/dist/admin/translations/en.json.js.map +1 -1
  70. package/dist/admin/translations/en.json.mjs +2 -0
  71. package/dist/admin/translations/en.json.mjs.map +1 -1
  72. package/dist/admin/utils/validation.js +3 -3
  73. package/dist/admin/utils/validation.js.map +1 -1
  74. package/dist/admin/utils/validation.mjs +2 -2
  75. package/dist/admin/utils/validation.mjs.map +1 -1
  76. package/dist/server/controllers/collection-types.js +4 -4
  77. package/dist/server/controllers/collection-types.js.map +1 -1
  78. package/dist/server/controllers/collection-types.mjs +4 -4
  79. package/dist/server/controllers/collection-types.mjs.map +1 -1
  80. package/dist/server/controllers/content-types.js +5 -7
  81. package/dist/server/controllers/content-types.js.map +1 -1
  82. package/dist/server/controllers/content-types.mjs +5 -7
  83. package/dist/server/controllers/content-types.mjs.map +1 -1
  84. package/dist/server/controllers/relations.js +19 -15
  85. package/dist/server/controllers/relations.js.map +1 -1
  86. package/dist/server/controllers/relations.mjs +17 -13
  87. package/dist/server/controllers/relations.mjs.map +1 -1
  88. package/dist/server/controllers/utils/clone.js +3 -4
  89. package/dist/server/controllers/utils/clone.js.map +1 -1
  90. package/dist/server/controllers/utils/clone.mjs +4 -5
  91. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  92. package/dist/server/controllers/validation/index.js +1 -1
  93. package/dist/server/controllers/validation/index.mjs +1 -1
  94. package/dist/server/history/controllers/history-version.js +3 -3
  95. package/dist/server/history/controllers/history-version.js.map +1 -1
  96. package/dist/server/history/controllers/history-version.mjs +3 -3
  97. package/dist/server/history/controllers/history-version.mjs.map +1 -1
  98. package/dist/server/history/entitlements.js +26 -0
  99. package/dist/server/history/entitlements.js.map +1 -0
  100. package/dist/server/history/entitlements.mjs +24 -0
  101. package/dist/server/history/entitlements.mjs.map +1 -0
  102. package/dist/server/history/index.js +3 -0
  103. package/dist/server/history/index.js.map +1 -1
  104. package/dist/server/history/index.mjs +3 -0
  105. package/dist/server/history/index.mjs.map +1 -1
  106. package/dist/server/history/services/history.js +4 -4
  107. package/dist/server/history/services/history.js.map +1 -1
  108. package/dist/server/history/services/history.mjs +4 -4
  109. package/dist/server/history/services/history.mjs.map +1 -1
  110. package/dist/server/history/services/lifecycles.js +8 -8
  111. package/dist/server/history/services/lifecycles.js.map +1 -1
  112. package/dist/server/history/services/lifecycles.mjs +3 -3
  113. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  114. package/dist/server/history/services/utils.js +26 -18
  115. package/dist/server/history/services/utils.js.map +1 -1
  116. package/dist/server/history/services/utils.mjs +23 -17
  117. package/dist/server/history/services/utils.mjs.map +1 -1
  118. package/dist/server/mcp/permissions.js +2 -2
  119. package/dist/server/mcp/permissions.js.map +1 -1
  120. package/dist/server/mcp/permissions.mjs +2 -2
  121. package/dist/server/mcp/permissions.mjs.map +1 -1
  122. package/dist/server/mcp/register-content-manager-mcp-tools.js +7 -5
  123. package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
  124. package/dist/server/mcp/register-content-manager-mcp-tools.mjs +7 -5
  125. package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
  126. package/dist/server/preview/controllers/previewScript.js +30 -15
  127. package/dist/server/preview/controllers/validation/preview.js +3 -3
  128. package/dist/server/preview/controllers/validation/preview.js.map +1 -1
  129. package/dist/server/preview/controllers/validation/preview.mjs +3 -3
  130. package/dist/server/preview/controllers/validation/preview.mjs.map +1 -1
  131. package/dist/server/services/components.js +3 -3
  132. package/dist/server/services/components.js.map +1 -1
  133. package/dist/server/services/components.mjs +3 -3
  134. package/dist/server/services/components.mjs.map +1 -1
  135. package/dist/server/services/content-structure.js +2 -2
  136. package/dist/server/services/content-structure.js.map +1 -1
  137. package/dist/server/services/content-structure.mjs +2 -2
  138. package/dist/server/services/content-structure.mjs.map +1 -1
  139. package/dist/server/services/content-types.js +3 -3
  140. package/dist/server/services/content-types.js.map +1 -1
  141. package/dist/server/services/content-types.mjs +3 -3
  142. package/dist/server/services/content-types.mjs.map +1 -1
  143. package/dist/server/services/data-mapper.js +3 -3
  144. package/dist/server/services/data-mapper.js.map +1 -1
  145. package/dist/server/services/data-mapper.mjs +3 -3
  146. package/dist/server/services/data-mapper.mjs.map +1 -1
  147. package/dist/server/services/document-manager.js +6 -6
  148. package/dist/server/services/document-manager.js.map +1 -1
  149. package/dist/server/services/document-manager.mjs +6 -6
  150. package/dist/server/services/document-manager.mjs.map +1 -1
  151. package/dist/server/services/document-metadata.js +29 -31
  152. package/dist/server/services/document-metadata.js.map +1 -1
  153. package/dist/server/services/document-metadata.mjs +29 -31
  154. package/dist/server/services/document-metadata.mjs.map +1 -1
  155. package/dist/server/services/metrics.js +3 -3
  156. package/dist/server/services/metrics.js.map +1 -1
  157. package/dist/server/services/metrics.mjs +3 -3
  158. package/dist/server/services/metrics.mjs.map +1 -1
  159. package/dist/server/services/permission-checker.js +2 -2
  160. package/dist/server/services/permission-checker.js.map +1 -1
  161. package/dist/server/services/permission-checker.mjs +1 -1
  162. package/dist/server/services/permission-checker.mjs.map +1 -1
  163. package/dist/server/services/permission.js +2 -3
  164. package/dist/server/services/permission.js.map +1 -1
  165. package/dist/server/services/permission.mjs +2 -3
  166. package/dist/server/services/permission.mjs.map +1 -1
  167. package/dist/server/services/populate-builder.js +4 -4
  168. package/dist/server/services/populate-builder.js.map +1 -1
  169. package/dist/server/services/populate-builder.mjs +4 -4
  170. package/dist/server/services/populate-builder.mjs.map +1 -1
  171. package/dist/server/services/utils/configuration/attributes.js +1 -2
  172. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  173. package/dist/server/services/utils/configuration/attributes.mjs +2 -3
  174. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  175. package/dist/server/services/utils/configuration/settings.js +4 -7
  176. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  177. package/dist/server/services/utils/configuration/settings.mjs +2 -5
  178. package/dist/server/services/utils/configuration/settings.mjs.map +1 -1
  179. package/dist/server/services/utils/draft.js +8 -7
  180. package/dist/server/services/utils/draft.js.map +1 -1
  181. package/dist/server/services/utils/draft.mjs +6 -5
  182. package/dist/server/services/utils/draft.mjs.map +1 -1
  183. package/dist/server/services/utils/populate.js +10 -11
  184. package/dist/server/services/utils/populate.js.map +1 -1
  185. package/dist/server/services/utils/populate.mjs +9 -10
  186. package/dist/server/services/utils/populate.mjs.map +1 -1
  187. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  188. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  189. package/dist/server/src/history/entitlements.d.ts +9 -0
  190. package/dist/server/src/history/entitlements.d.ts.map +1 -0
  191. package/dist/server/src/history/index.d.ts.map +1 -1
  192. package/dist/server/src/history/services/utils.d.ts +8 -2
  193. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  194. package/dist/server/src/index.d.ts +1 -1
  195. package/dist/server/src/index.d.ts.map +1 -1
  196. package/dist/server/src/mcp/permissions.d.ts +1 -1
  197. package/dist/server/src/mcp/permissions.d.ts.map +1 -1
  198. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +3 -1
  199. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  200. package/dist/server/src/mcp/types.d.ts +2 -2
  201. package/dist/server/src/services/content-types.d.ts.map +1 -1
  202. package/dist/server/src/services/data-mapper.d.ts +1 -1
  203. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  204. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  205. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  206. package/dist/server/src/services/index.d.ts +1 -1
  207. package/dist/server/src/services/index.d.ts.map +1 -1
  208. package/dist/server/src/services/metrics.d.ts.map +1 -1
  209. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  210. package/dist/server/src/services/permission.d.ts.map +1 -1
  211. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  212. package/dist/server/src/services/utils/configuration/index.d.ts +10 -1
  213. package/dist/server/src/services/utils/configuration/index.d.ts.map +1 -1
  214. package/dist/server/src/services/utils/configuration/settings.d.ts +10 -1
  215. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  216. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  217. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  218. package/dist/shared/contracts/relations.d.ts +1 -0
  219. package/dist/shared/contracts/relations.d.ts.map +1 -1
  220. package/package.json +7 -7
@@ -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: {
@@ -1 +1 @@
1
- {"version":3,"file":"draft.mjs","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.mjs","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,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 index = require('../../utils/index.js');
6
6
 
@@ -27,12 +27,11 @@ var strapiUtils__namespace = /*#__PURE__*/_interopNamespace(strapiUtils);
27
27
  const { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation, isPrivateAttribute, hasDraftAndPublish } = strapiUtils__namespace.contentTypes;
28
28
  const { isAnyToMany } = strapiUtils__namespace.relations;
29
29
  const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils__namespace.contentTypes.constants;
30
- const isLocalizedContentType = (model)=>model.pluginOptions?.i18n?.localized === true;
31
30
  const isMorphToRelation = (attribute)=>isRelation(attribute) && attribute.relation.includes('morphTo');
32
- const isMedia = fp.propEq('type', 'media');
33
- const isRelation = fp.propEq('type', 'relation');
34
- const isComponent = fp.propEq('type', 'component');
35
- const isDynamicZone = fp.propEq('type', 'dynamiczone');
31
+ const isMedia = _.matchesProperty('type', 'media');
32
+ const isRelation = _.matchesProperty('type', 'relation');
33
+ const isComponent = _.matchesProperty('type', 'component');
34
+ const isDynamicZone = _.matchesProperty('type', 'dynamiczone');
36
35
  /**
37
36
  * Populate the model for relation
38
37
  * @param attribute - Attribute containing a relation
@@ -135,7 +134,7 @@ const isDynamicZone = fp.propEq('type', 'dynamiczone');
135
134
  if (!model) {
136
135
  return {};
137
136
  }
138
- return Object.keys(model.attributes).reduce((populateAcc, attributeName)=>fp.merge(populateAcc, getPopulateFor(attributeName, model, {
137
+ return Object.keys(model.attributes).reduce((populateAcc, attributeName)=>_.merge({}, populateAcc, getPopulateFor(attributeName, model, {
139
138
  // @ts-expect-error - improve types
140
139
  initialPopulate: initialPopulate?.[attributeName],
141
140
  countMany,
@@ -266,7 +265,7 @@ const getDeepPopulateDraftCount = (uid)=>{
266
265
  const fields = [
267
266
  'documentId'
268
267
  ];
269
- if (isLocalizedContentType(targetModel)) {
268
+ if (strapi.localization.isLocalizedContentType(targetModel) === true) {
270
269
  fields.push('locale');
271
270
  }
272
271
  populateAcc[attributeName] = {
@@ -307,7 +306,7 @@ const getDeepPopulateDraftCount = (uid)=>{
307
306
  }
308
307
  return acc;
309
308
  }, {});
310
- if (!fp.isEmpty(dzPopulateFragment)) {
309
+ if (!_.isEmpty(dzPopulateFragment)) {
311
310
  populateAcc[attributeName] = {
312
311
  on: dzPopulateFragment
313
312
  };
@@ -343,7 +342,7 @@ const getDeepPopulateDraftCount = (uid)=>{
343
342
  // Populate all relations, components and media
344
343
  if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {
345
344
  const populatePath = path.attribute.replace(/\./g, '.populate.');
346
- populateQuery = fp.merge(populateQuery, fp.set(populatePath, {}, {}));
345
+ populateQuery = _.merge({}, populateQuery, _.set({}, populatePath, {}));
347
346
  }
348
347
  }, {
349
348
  schema: strapi.getModel(uid),
@@ -374,7 +373,7 @@ const buildDeepPopulate = async (uid)=>{
374
373
  * - updatedAt: to support the modified state indicator in the UI
375
374
  */ const getPopulateForLocalizations = (model)=>{
376
375
  const modelSchema = strapi.getModel(model);
377
- if (modelSchema.pluginOptions?.i18n?.localized) {
376
+ if (strapi.localization.isLocalizedContentType(modelSchema) === true) {
378
377
  return {
379
378
  localizations: {
380
379
  fields: [
@@ -1 +1 @@
1
- {"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { merge, isEmpty, set, propEq } from 'lodash/fp';\nimport * as strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst {\n isVisibleAttribute,\n isScalarAttribute,\n getDoesAttributeRequireValidation,\n isPrivateAttribute,\n hasDraftAndPublish,\n} = strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isLocalizedContentType = (model: { pluginOptions?: unknown }) =>\n (model.pluginOptions as { i18n?: { localized?: boolean } } | undefined)?.i18n?.localized === true;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = propEq('type', 'media');\nconst isRelation = propEq('type', 'relation');\nconst isComponent = propEq('type', 'component');\nconst isDynamicZone = propEq('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n // Use initialPopulate when explicitly provided (including `false` to suppress population)\n if (initialPopulate !== undefined) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n): { on: { [key: string]: { populate: { [key: string]: boolean | object } } } } {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n): { [key: string]: boolean | object } => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst validationPopulateCache = new Map<string, Record<string, any>>();\n\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const cached = validationPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n const result = Object.entries(model.attributes).reduce(\n (populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n },\n {}\n );\n\n validationPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst draftCountPopulateCache = new Map<string, { populate: any; hasRelations: boolean }>();\n\nconst getDeepPopulateDraftCount = (uid: UID.Schema): { populate: any; hasRelations: boolean } => {\n const cached = draftCountPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return { populate: {}, hasRelations: false };\n }\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n // Skip relations to content types without draft & publish,\n // as they don't have a publishedAt attribute and can't have drafts\n if (!('target' in attribute)) {\n break;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n break;\n }\n\n // Self-referential relations are preserved on publish (see self-referential-relations.ts).\n if (attribute.target === uid) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n // Draft entries link to draft rows of related documents. Populate documentId/locale\n // so we can distinguish truly unpublished targets from published documents that\n // still have a draft row (those links are kept on publish for M2M, or remapped for xToOne).\n const fields: string[] = ['documentId'];\n if (isLocalizedContentType(targetModel)) {\n fields.push('locale');\n }\n populateAcc[attributeName] = {\n fields,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n const result = { populate, hasRelations };\n draftCountPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n populateQuery = merge(populateQuery, set(populatePath, {}, {}));\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst deepPopulateCache = new Map<string, object>();\n\nconst buildDeepPopulate = async (uid: UID.CollectionType) => {\n const cached = deepPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const result = await getService('populate-builder')(uid)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n deepPopulateCache.set(uid, result);\n\n return result;\n};\n\n/**\n * Restrict localizations populate to only metadata fields for localized content types.\n * Returns an empty object for non-localized content types.\n *\n * By default, localizations are deeply populated which includes all relations and\n * components for every locale — this is expensive and unnecessary for CM responses.\n * The CM only needs these fields from localizations:\n * - locale: to identify which locales exist\n * - documentId: to link to the localized document\n * - publishedAt: to determine published/draft status\n * - updatedAt: to support the modified state indicator in the UI\n */\nconst getPopulateForLocalizations = (model: UID.Schema) => {\n const modelSchema = strapi.getModel(model);\n if (\n (modelSchema as unknown as { pluginOptions: { i18n: { localized?: boolean } } }).pluginOptions\n ?.i18n?.localized\n ) {\n return { localizations: { fields: ['locale', 'documentId', 'publishedAt', 'updatedAt'] } };\n }\n\n return {};\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n getPopulateForLocalizations,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","isPrivateAttribute","hasDraftAndPublish","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isLocalizedContentType","model","pluginOptions","i18n","localized","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","propEq","isComponent","isDynamicZone","getPopulateForRelation","attributeName","countMany","countOne","initialPopulate","isManyRelation","undefined","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","validationPopulateCache","Map","cached","get","result","entries","fields","push","componentResult","length","componentsResult","set","draftCountPopulateCache","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","targetModel","target","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","schema","bind","deepPopulateCache","buildDeepPopulate","getService","populateDeep","countRelations","build","getPopulateForLocalizations","modelSchema","localizations"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAM,EACJA,kBAAkB,EAClBC,iBAAiB,EACjBC,iCAAiC,EACjCC,kBAAkB,EAClBC,kBAAkB,EACnB,GAAGC,uBAAYC,YAAY;AAC5B,MAAM,EAAEC,WAAW,EAAE,GAAGF,uBAAYG,SAAS;AAC7C,MAAM,EAAEC,sBAAsB,EAAE,GAAGJ,sBAAAA,CAAYC,YAAY,CAACI,SAAS;AAErE,MAAMC,sBAAAA,GAAyB,CAACC,KAAAA,GAC7BA,MAAMC,aAAa,EAAqDC,MAAMC,SAAAA,KAAc,IAAA;AAE/F,MAAMC,iBAAAA,GAAoB,CAACC,SAAAA,GACzBC,UAAAA,CAAWD,cAAcA,SAAAA,CAAUE,QAAQ,CAACC,QAAQ,CAAC,SAAA,CAAA;AACvD,MAAMC,OAAAA,GAAUC,UAAO,MAAA,EAAQ,OAAA,CAAA;AAC/B,MAAMJ,UAAAA,GAAaI,UAAO,MAAA,EAAQ,UAAA,CAAA;AAClC,MAAMC,WAAAA,GAAcD,UAAO,MAAA,EAAQ,WAAA,CAAA;AACnC,MAAME,aAAAA,GAAgBF,UAAO,MAAA,EAAQ,aAAA,CAAA;AAarC;;;;;;;AAOC,IACD,SAASG,sBAAAA,CACPR,SAAwC,EACxCL,KAAY,EACZc,aAAqB,EACrB,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,eAAe,EAAmB,EAAA;AAEzD,IAAA,MAAMC,iBAAiBvB,WAAAA,CAAYU,SAAAA,CAAAA;;AAGnC,IAAA,IAAIY,oBAAoBE,SAAAA,EAAW;QACjC,OAAOF,eAAAA;AACT,IAAA;;;AAIA,IAAA,IAAIH,kBAAkB,eAAA,EAAiB;QACrC,MAAMM,kBAAAA,GAAqBC,wBAAAA,CAAyBrB,KAAAA,CAAMsB,GAAG,CAAA;QAE7D,OAAO;AACLC,YAAAA,QAAAA,EAAUH,mBAAmBG;AAC/B,SAAA;AACF,IAAA;;IAGA,IAAI,CAACnC,kBAAAA,CAAmBY,KAAAA,EAAOc,aAAAA,CAAAA,EAAgB;QAC7C,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,IAAI,cAACI,IAAkBH,SAAAA,IAAe,CAACG,kBAAkBF,QAAAA,EAAW;QAClE,OAAO;YAAEQ,KAAAA,EAAO;AAAK,SAAA;AACvB,IAAA;IAEA,OAAO,IAAA;AACT;AAEA;;;;;AAKC,IACD,SAASC,gBAAAA,CACPpB,SAAuC,EACvCqB,OAAwB,EACxBC,KAAa,EAAA;;AAGb,IAAA,MAAMC,mBAAAA,GAAuBvB,CAAAA,SAAAA,CAAUwB,UAAU,IAAI,EAAE,EAAEC,MAAM,CAC7D,CAACC,GAAAA,EAAUC,gBAAiC;AAC1C,YAAA,GAAGD,GAAG;AACN,YAAA,CAACC,eAAe;gBACdT,QAAAA,EAAUU,eAAAA,CAAgBD,YAAAA,EAAcN,OAAAA,EAASC,KAAAA,GAAQ,CAAA;AAC3D;AACF,SAAA,GACA,EAAC,CAAA;IAGH,OAAO;QAAEO,EAAAA,EAAIN;AAAoB,KAAA;AACnC;AAEA;;;;;;;;;;IAWA,SAASO,eACPrB,aAAqB,EACrBd,KAAU,EACV0B,OAAwB,EACxBC,KAAa,EAAA;AAEb,IAAA,MAAMtB,SAAAA,GAAYL,KAAAA,CAAMoC,UAAU,CAACtB,aAAAA,CAAc;AAEjD,IAAA,OAAQT,UAAUgC,IAAI;QACpB,KAAK,UAAA;;YAEH,OAAO;AACL,gBAAA,CAACvB,aAAAA,GAAgBD,sBAAAA,CAAuBR,SAAAA,EAAWL,OAAOc,aAAAA,EAAeY,OAAAA;AAC3E,aAAA;QACF,KAAK,WAAA;YACH,OAAO;AACL,gBAAA,CAACZ,gBAAgB;AACfS,oBAAAA,QAAAA,EAAUU,eAAAA,CAAgB5B,SAAAA,CAAUiC,SAAS,EAAEZ,SAASC,KAAAA,GAAQ,CAAA;AAClE;AACF,aAAA;QACF,KAAK,OAAA;YACH,OAAO;AACL,gBAAA,CAACb,gBAAgB;oBACfS,QAAAA,EAAU;wBACRgB,MAAAA,EAAQ;AACV;AACF;AACF,aAAA;QACF,KAAK,aAAA;YACH,OAAO;AACL,gBAAA,CAACzB,aAAAA,GAAgBW,gBAAAA,CAAiBpB,SAAAA,EAAWqB,OAAAA,EAASC,KAAAA;AACxD,aAAA;AACF,QAAA;AACE,YAAA,OAAO,EAAC;AACZ;AACF;AAEA;;;;;IAMA,MAAMM,kBAAkB,CACtBX,GAAAA,EACA,EACEL,eAAAA,GAAkB,EAAS,EAC3BF,SAAAA,GAAY,KAAK,EACjBC,QAAAA,GAAW,KAAK,EAChBwB,QAAAA,GAAWC,QAAQ,EACH,GAAG,EAAE,EACvBd,KAAAA,GAAQ,CAAC,GAAA;AAET,IAAA,IAAIA,QAAQa,QAAAA,EAAU;AACpB,QAAA,OAAO,EAAC;AACV,IAAA;IAEA,MAAMxC,KAAAA,GAAQ0C,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAE9B,IAAA,IAAI,CAACtB,KAAAA,EAAO;AACV,QAAA,OAAO,EAAC;AACV,IAAA;AAEA,IAAA,OAAO4C,MAAAA,CAAOC,IAAI,CAAC7C,KAAAA,CAAMoC,UAAU,CAAA,CAAEN,MAAM,CACzC,CAACgB,aAAahC,aAAAA,GACZiC,QAAAA,CACED,WAAAA,EACAX,cAAAA,CACErB,eACAd,KAAAA,EACA;;YAEEiB,eAAAA,EAAiBA,eAAAA,GAAkBH,aAAAA,CAAc;AACjDC,YAAAA,SAAAA;AACAC,YAAAA,QAAAA;AACAwB,YAAAA;AACF,SAAA,EACAb,SAGN,EAAC,CAAA;AAEL;AAEA;;;;;IAMA,MAAMqB,0BAA0B,IAAIC,GAAAA,EAAAA;AAEpC,MAAM5B,2BAA2B,CAACC,GAAAA,GAAAA;IAChC,MAAM4B,MAAAA,GAASF,uBAAAA,CAAwBG,GAAG,CAAC7B,GAAAA,CAAAA;AAC3C,IAAA,IAAI4B,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAMlD,KAAAA,GAAQ0C,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAC9B,IAAA,IAAI,CAACtB,KAAAA,EAAO;AACV,QAAA,OAAO,EAAC;AACV,IAAA;AAEA,IAAA,MAAMoD,MAAAA,GAASR,MAAAA,CAAOS,OAAO,CAACrD,KAAAA,CAAMoC,UAAU,CAAA,CAAEN,MAAM,CACpD,CAACgB,WAAAA,EAAkB,CAAChC,eAAeT,SAAAA,CAAU,GAAA;AAC3C,QAAA,IAAIhB,kBAAkBgB,SAAAA,CAAAA,EAAY;;AAEhC,YAAA,IACEf,iCAAAA,CAAkCe,SAAAA,CAAAA,IAClC,CAACd,kBAAAA,CAAmBS,OAAOc,aAAAA,CAAAA,EAC3B;AACAgC,gBAAAA,WAAAA,CAAYQ,MAAM,GAAGR,WAAAA,CAAYQ,MAAM,IAAI,EAAE;gBAC7CR,WAAAA,CAAYQ,MAAM,CAACC,IAAI,CAACzC,aAAAA,CAAAA;AAC1B,YAAA;YACA,OAAOgC,WAAAA;AACT,QAAA;AAEA,QAAA,IAAIrC,QAAQJ,SAAAA,CAAAA,EAAY;AACtB,YAAA,IACEf,iCAAAA,CAAkCe,SAAAA,CAAAA,IAClC,CAACd,kBAAAA,CAAmBS,OAAOc,aAAAA,CAAAA,EAC3B;AACAgC,gBAAAA,WAAAA,CAAYvB,QAAQ,GAAGuB,WAAAA,CAAYvB,QAAQ,IAAI,EAAC;gBAChDuB,WAAAA,CAAYvB,QAAQ,CAACT,aAAAA,CAAc,GAAG;oBACpCS,QAAAA,EAAU;wBACRgB,MAAAA,EAAQ;AACV;AACF,iBAAA;gBACA,OAAOO,WAAAA;AACT,YAAA;AACF,QAAA;AAEA,QAAA,IAAInC,YAAYN,SAAAA,CAAAA,EAAY;;YAE1B,MAAMiC,SAAAA,GAAYjC,UAAUiC,SAAS;;AAGrC,YAAA,MAAMkB,kBAAkBnC,wBAAAA,CAAyBiB,SAAAA,CAAAA;AAEjD,YAAA,IAAIM,OAAOC,IAAI,CAACW,eAAAA,CAAAA,CAAiBC,MAAM,GAAG,CAAA,EAAG;AAC3CX,gBAAAA,WAAAA,CAAYvB,QAAQ,GAAGuB,WAAAA,CAAYvB,QAAQ,IAAI,EAAC;gBAChDuB,WAAAA,CAAYvB,QAAQ,CAACT,aAAAA,CAAc,GAAG0C,eAAAA;AACxC,YAAA;YAEA,OAAOV,WAAAA;AACT,QAAA;AAEA,QAAA,IAAIlC,cAAcP,SAAAA,CAAAA,EAAY;YAC5B,MAAMwB,UAAAA,GAAa,SAACxB,CAA2CwB,UAAU;;YAEzE,MAAM6B,gBAAAA,GAAmB,CAAC7B,UAAAA,IAAc,EAAE,EAAEC,MAAM,CAChD,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;;AAEJ,gBAAA,MAAMwB,kBAAkBnC,wBAAAA,CAAyBW,YAAAA,CAAAA;;AAGjD,gBAAA,IAAIY,OAAOC,IAAI,CAACW,eAAAA,CAAAA,CAAiBC,MAAM,GAAG,CAAA,EAAG;oBAC3C1B,GAAG,CAACC,aAAa,GAAGwB,eAAAA;AACtB,gBAAA;gBAEA,OAAOzB,GAAAA;AACT,YAAA,CAAA,EACA,EAAC,CAAA;;AAIH,YAAA,IAAIa,OAAOC,IAAI,CAACa,gBAAAA,CAAAA,CAAkBD,MAAM,GAAG,CAAA,EAAG;AAC5CX,gBAAAA,WAAAA,CAAYvB,QAAQ,GAAGuB,WAAAA,CAAYvB,QAAQ,IAAI,EAAC;gBAChDuB,WAAAA,CAAYvB,QAAQ,CAACT,aAAAA,CAAc,GAAG;oBAAEoB,EAAAA,EAAIwB;AAAiB,iBAAA;AAC/D,YAAA;AACF,QAAA;QAEA,OAAOZ,WAAAA;AACT,IAAA,CAAA,EACA,EAAC,CAAA;IAGHE,uBAAAA,CAAwBW,GAAG,CAACrC,GAAAA,EAAK8B,MAAAA,CAAAA;IACjC,OAAOA,MAAAA;AACT;AAEA;;;;;;;;IASA,MAAMQ,0BAA0B,IAAIX,GAAAA,EAAAA;AAEpC,MAAMY,4BAA4B,CAACvC,GAAAA,GAAAA;IACjC,MAAM4B,MAAAA,GAASU,uBAAAA,CAAwBT,GAAG,CAAC7B,GAAAA,CAAAA;AAC3C,IAAA,IAAI4B,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAMlD,KAAAA,GAAQ0C,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAC9B,IAAA,IAAI,CAACtB,KAAAA,EAAO;QACV,OAAO;AAAEuB,YAAAA,QAAAA,EAAU,EAAC;YAAGuC,YAAAA,EAAc;AAAM,SAAA;AAC7C,IAAA;AACA,IAAA,IAAIA,YAAAA,GAAe,KAAA;IAEnB,MAAMvC,QAAAA,GAAWqB,MAAAA,CAAOC,IAAI,CAAC7C,KAAAA,CAAMoC,UAAU,CAAA,CAAEN,MAAM,CAAC,CAACgB,WAAAA,EAAkBhC,aAAAA,GAAAA;AACvE,QAAA,MAAMT,SAAAA,GAA2CL,KAAAA,CAAMoC,UAAU,CAACtB,aAAAA,CAAc;AAEhF,QAAA,OAAQT,UAAUgC,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;;AAEf,oBAAA,MAAM0B,kBAAkB1D,SAAAA,CAAUE,QAAQ,CAACyD,WAAW,EAAA,CAAGC,UAAU,CAAC,OAAA,CAAA;AACpE,oBAAA,IAAIF,eAAAA,EAAiB;AACnB,wBAAA;AACF,oBAAA;;;AAIA,oBAAA,IAAI,EAAE,QAAA,IAAY1D,SAAQ,CAAA,EAAI;AAC5B,wBAAA;AACF,oBAAA;AAEA,oBAAA,MAAM6D,WAAAA,GAAcxB,MAAAA,CAAOC,QAAQ,CAACtC,UAAU8D,MAAM,CAAA;AACpD,oBAAA,IAAI,CAACD,WAAAA,IAAe,CAAC1E,kBAAAA,CAAmB0E,WAAAA,CAAAA,EAAc;AACpD,wBAAA;AACF,oBAAA;;oBAGA,IAAI7D,SAAAA,CAAU8D,MAAM,KAAK7C,GAAAA,EAAK;AAC5B,wBAAA;AACF,oBAAA;oBAEA,IAAIlC,kBAAAA,CAAmBY,OAAOc,aAAAA,CAAAA,EAAgB;;;;AAI5C,wBAAA,MAAMwC,MAAAA,GAAmB;AAAC,4BAAA;AAAa,yBAAA;AACvC,wBAAA,IAAIvD,uBAAuBmE,WAAAA,CAAAA,EAAc;AACvCZ,4BAAAA,MAAAA,CAAOC,IAAI,CAAC,QAAA,CAAA;AACd,wBAAA;wBACAT,WAAW,CAAChC,cAAc,GAAG;AAC3BwC,4BAAAA,MAAAA;4BACAc,OAAAA,EAAS;AAAE,gCAAA,CAACvE,yBAAyB;oCAAEwE,KAAAA,EAAO;AAAK;AAAE;AACvD,yBAAA;wBACAP,YAAAA,GAAe,IAAA;AACjB,oBAAA;AACA,oBAAA;AACF,gBAAA;YACA,KAAK,WAAA;AAAa,gBAAA;oBAChB,MAAM,EAAEvC,QAAQ,EAAEuC,YAAAA,EAAcQ,iBAAiB,EAAE,GAAGT,yBAAAA,CACpDxD,SAAAA,CAAUiC,SAAS,CAAA;AAErB,oBAAA,IAAIgC,iBAAAA,EAAmB;wBACrBxB,WAAW,CAAChC,cAAc,GAAG;AAC3BS,4BAAAA;AACF,yBAAA;wBACAuC,YAAAA,GAAe,IAAA;AACjB,oBAAA;AACA,oBAAA;AACF,gBAAA;YACA,KAAK,aAAA;AAAe,gBAAA;AAClB,oBAAA,MAAMS,qBAAqBlE,SAAAA,CAAUwB,UAAU,EAAEC,MAAAA,CAAO,CAACC,GAAAA,EAAKC,YAAAA,GAAAA;wBAC5D,MAAM,EAAET,UAAUiD,iBAAiB,EAAEV,cAAcW,qBAAqB,EAAE,GACxEZ,yBAAAA,CAA0B7B,YAAAA,CAAAA;AAE5B,wBAAA,IAAIyC,qBAAAA,EAAuB;4BACzBX,YAAAA,GAAe,IAAA;4BAEf,OAAO;AAAE,gCAAA,GAAG/B,GAAG;AAAE,gCAAA,CAACC,eAAe;oCAAET,QAAAA,EAAUiD;AAAkB;AAAE,6BAAA;AACnE,wBAAA;wBAEA,OAAOzC,GAAAA;AACT,oBAAA,CAAA,EAAG,EAAC,CAAA;oBAEJ,IAAI,CAAC2C,WAAQH,kBAAAA,CAAAA,EAAqB;wBAChCzB,WAAW,CAAChC,cAAc,GAAG;4BAAEoB,EAAAA,EAAIqC;AAAmB,yBAAA;AACxD,oBAAA;AACA,oBAAA;AACF,gBAAA;AAEF;QAEA,OAAOzB,WAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AAEJ,IAAA,MAAMM,MAAAA,GAAS;AAAE7B,QAAAA,QAAAA;AAAUuC,QAAAA;AAAa,KAAA;IACxCF,uBAAAA,CAAwBD,GAAG,CAACrC,GAAAA,EAAK8B,MAAAA,CAAAA;IACjC,OAAOA,MAAAA;AACT;AAEA;;IAGA,MAAMuB,gBAAAA,GAAmB,OAAOrD,GAAAA,EAAiBsD,KAAAA,GAAAA;AAC/C,IAAA,IAAIC,gBAA0B,EAAC;AAE/B,IAAA,MAAMpF,sBAAAA,CAAYqF,QAAQ,CAACC,oBAAoB;;;;;;;AAQ5C,QACD,CAAC,EAAE1E,SAAS,EAAE2E,IAAI,EAAO,GAAA;;AAEvB,QAAA,IAAI,CAAC3E,SAAAA,IAAaO,aAAAA,CAAcP,SAAAA,CAAAA,IAAcD,kBAAkBC,SAAAA,CAAAA,EAAY;AAC1E,YAAA;AACF,QAAA;;AAGA,QAAA,IAAIC,UAAAA,CAAWD,SAAAA,CAAAA,IAAcI,OAAAA,CAAQJ,SAAAA,CAAAA,IAAcM,YAAYN,SAAAA,CAAAA,EAAY;AACzE,YAAA,MAAM4E,eAAeD,IAAAA,CAAK3E,SAAS,CAAC6E,OAAO,CAAC,KAAA,EAAO,YAAA,CAAA;AACnDL,YAAAA,aAAAA,GAAgB9B,SAAM8B,aAAAA,EAAelB,MAAAA,CAAIsB,YAAAA,EAAc,IAAI,EAAC,CAAA,CAAA;AAC9D,QAAA;IACF,CAAA,EACA;QAAEE,MAAAA,EAAQzC,MAAAA,CAAOC,QAAQ,CAACrB,GAAAA,CAAAA;AAAMqB,QAAAA,QAAAA,EAAUD,MAAAA,CAAOC,QAAQ,CAACyC,IAAI,CAAC1C,MAAAA;KAAQ,EACvEkC,KAAAA,CAAAA;IAGF,OAAOC,aAAAA;AACT;AAEA,MAAMQ,oBAAoB,IAAIpC,GAAAA,EAAAA;AAE9B,MAAMqC,oBAAoB,OAAOhE,GAAAA,GAAAA;IAC/B,MAAM4B,MAAAA,GAASmC,iBAAAA,CAAkBlC,GAAG,CAAC7B,GAAAA,CAAAA;AACrC,IAAA,IAAI4B,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAME,MAAAA,GAAS,MAAMmC,gBAAAA,CAAW,kBAAA,CAAA,CAAoBjE,GAAAA,CAAAA,CACjDkE,YAAY,CAAC/C,QAAAA,CAAAA,CACbgD,cAAc,EAAA,CACdC,KAAK,EAAA;IAERL,iBAAAA,CAAkB1B,GAAG,CAACrC,GAAAA,EAAK8B,MAAAA,CAAAA;IAE3B,OAAOA,MAAAA;AACT;AAEA;;;;;;;;;;;IAYA,MAAMuC,8BAA8B,CAAC3F,KAAAA,GAAAA;IACnC,MAAM4F,WAAAA,GAAclD,MAAAA,CAAOC,QAAQ,CAAC3C,KAAAA,CAAAA;AACpC,IAAA,IACE,WAAC4F,CAAgF3F,aAAa,EAC1FC,MAAMC,SAAAA,EACV;QACA,OAAO;YAAE0F,aAAAA,EAAe;gBAAEvC,MAAAA,EAAQ;AAAC,oBAAA,QAAA;AAAU,oBAAA,YAAA;AAAc,oBAAA,aAAA;AAAe,oBAAA;AAAY;AAAC;AAAE,SAAA;AAC3F,IAAA;AAEA,IAAA,OAAO,EAAC;AACV;;;;;;;;;"}
1
+ {"version":3,"file":"populate.js","sources":["../../../../server/src/services/utils/populate.ts"],"sourcesContent":["import { set, merge, isEmpty, matchesProperty } from 'lodash';\n\nimport * as strapiUtils from '@strapi/utils';\nimport type { UID, Schema, Modules } from '@strapi/types';\nimport { getService } from '../../utils';\n\nconst {\n isVisibleAttribute,\n isScalarAttribute,\n getDoesAttributeRequireValidation,\n isPrivateAttribute,\n hasDraftAndPublish,\n} = strapiUtils.contentTypes;\nconst { isAnyToMany } = strapiUtils.relations;\nconst { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;\n\nconst isMorphToRelation = (attribute: any) =>\n isRelation(attribute) && attribute.relation.includes('morphTo');\nconst isMedia = matchesProperty('type', 'media');\nconst isRelation = matchesProperty('type', 'relation');\nconst isComponent = matchesProperty('type', 'component');\nconst isDynamicZone = matchesProperty('type', 'dynamiczone');\n\n// TODO: Import from @strapi/types when it's available there\ntype Model = Parameters<typeof isVisibleAttribute>[0];\nexport type Populate = Modules.EntityService.Params.Populate.Any<UID.Schema>;\n\ntype PopulateOptions = {\n initialPopulate?: Populate;\n countMany?: boolean;\n countOne?: boolean;\n maxLevel?: number;\n};\n\n/**\n * Populate the model for relation\n * @param attribute - Attribute containing a relation\n * @param attribute.relation - type of relation\n * @param model - Model of the populated entity\n * @param attributeName\n * @param options - Options to apply while populating\n */\nfunction getPopulateForRelation(\n attribute: Schema.Attribute.AnyAttribute,\n model: Model,\n attributeName: string,\n { countMany, countOne, initialPopulate }: PopulateOptions\n) {\n const isManyRelation = isAnyToMany(attribute);\n\n // Use initialPopulate when explicitly provided (including `false` to suppress population)\n if (initialPopulate !== undefined) {\n return initialPopulate;\n }\n\n // If populating localizations attribute, also include validatable fields\n // Mainly needed for bulk locale publishing, so the Client has all the information necessary to perform validations\n if (attributeName === 'localizations') {\n const validationPopulate = getPopulateForValidation(model.uid as UID.Schema);\n\n return {\n populate: validationPopulate.populate,\n };\n }\n\n // always populate createdBy, updatedBy, localizations etc.\n if (!isVisibleAttribute(model, attributeName)) {\n return true;\n }\n\n if ((isManyRelation && countMany) || (!isManyRelation && countOne)) {\n return { count: true };\n }\n\n return true;\n}\n\n/**\n * Populate the model for Dynamic Zone components\n * @param attribute - Attribute containing the components\n * @param attribute.components - IDs of components\n * @param options - Options to apply while populating\n */\nfunction getPopulateForDZ(\n attribute: Schema.Attribute.DynamicZone,\n options: PopulateOptions,\n level: number\n): { on: { [key: string]: { populate: { [key: string]: boolean | object } } } } {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => ({\n ...acc,\n [componentUID]: {\n populate: getDeepPopulate(componentUID, options, level + 1),\n },\n }),\n {}\n );\n\n return { on: populatedComponents };\n}\n\n/**\n * Get the populated value based on the type of the attribute\n * @param attributeName - Name of the attribute\n * @param model - Model of the populated entity\n * @param model.attributes\n * @param options - Options to apply while populating\n * @param options.countMany\n * @param options.countOne\n * @param options.maxLevel\n * @param level\n */\nfunction getPopulateFor(\n attributeName: string,\n model: any,\n options: PopulateOptions,\n level: number\n): { [key: string]: boolean | object } {\n const attribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation':\n // @ts-expect-error - TODO: support populate count typing\n return {\n [attributeName]: getPopulateForRelation(attribute, model, attributeName, options),\n };\n case 'component':\n return {\n [attributeName]: {\n populate: getDeepPopulate(attribute.component, options, level + 1),\n },\n };\n case 'media':\n return {\n [attributeName]: {\n populate: {\n folder: true,\n },\n },\n };\n case 'dynamiczone':\n return {\n [attributeName]: getPopulateForDZ(attribute, options, level),\n };\n default:\n return {};\n }\n}\n\n/**\n * Deeply populate a model based on UID\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst getDeepPopulate = (\n uid: UID.Schema,\n {\n initialPopulate = {} as any,\n countMany = false,\n countOne = false,\n maxLevel = Infinity,\n }: PopulateOptions = {},\n level = 1\n): { [key: string]: boolean | object } => {\n if (level > maxLevel) {\n return {};\n }\n\n const model = strapi.getModel(uid);\n\n if (!model) {\n return {};\n }\n\n return Object.keys(model.attributes).reduce(\n (populateAcc, attributeName: string) =>\n merge(\n {},\n populateAcc,\n getPopulateFor(\n attributeName,\n model,\n {\n // @ts-expect-error - improve types\n initialPopulate: initialPopulate?.[attributeName],\n countMany,\n countOne,\n maxLevel,\n },\n level\n )\n ),\n {}\n );\n};\n\n/**\n * Deeply populate a model based on UID. Only populating fields that require validation.\n * @param uid - Unique identifier of the model\n * @param options - Options to apply while populating\n * @param level - Current level of nested call\n */\nconst validationPopulateCache = new Map<string, Record<string, any>>();\n\nconst getPopulateForValidation = (uid: UID.Schema): Record<string, any> => {\n const cached = validationPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return {};\n }\n\n const result = Object.entries(model.attributes).reduce(\n (populateAcc: any, [attributeName, attribute]) => {\n if (isScalarAttribute(attribute)) {\n // If the scalar attribute requires validation, add it to the fields array\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.fields = populateAcc.fields || [];\n populateAcc.fields.push(attributeName);\n }\n return populateAcc;\n }\n\n if (isMedia(attribute)) {\n if (\n getDoesAttributeRequireValidation(attribute) &&\n !isPrivateAttribute(model, attributeName)\n ) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = {\n populate: {\n folder: true,\n },\n };\n return populateAcc;\n }\n }\n\n if (isComponent(attribute)) {\n // @ts-expect-error - should be a component\n const component = attribute.component;\n\n // Get the validation result for this component\n const componentResult = getPopulateForValidation(component);\n\n if (Object.keys(componentResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = componentResult;\n }\n\n return populateAcc;\n }\n\n if (isDynamicZone(attribute)) {\n const components = (attribute as Schema.Attribute.DynamicZone).components;\n // Handle dynamic zone components\n const componentsResult = (components || []).reduce(\n (acc, componentUID) => {\n // Get validation populate for this component\n const componentResult = getPopulateForValidation(componentUID);\n\n // Only include component if it has fields requiring validation\n if (Object.keys(componentResult).length > 0) {\n acc[componentUID] = componentResult;\n }\n\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Only add to populate if we have components requiring validation\n if (Object.keys(componentsResult).length > 0) {\n populateAcc.populate = populateAcc.populate || {};\n populateAcc.populate[attributeName] = { on: componentsResult };\n }\n }\n\n return populateAcc;\n },\n {}\n );\n\n validationPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * getDeepPopulateDraftCount works recursively on the attributes of a model\n * creating a populated object to count all the unpublished relations within the model\n * These relations can be direct to this content type or contained within components/dynamic zones\n * @param uid of the model\n * @returns result\n * @returns result.populate\n * @returns result.hasRelations\n */\nconst draftCountPopulateCache = new Map<string, { populate: any; hasRelations: boolean }>();\n\nconst getDeepPopulateDraftCount = (uid: UID.Schema): { populate: any; hasRelations: boolean } => {\n const cached = draftCountPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n if (!model) {\n return { populate: {}, hasRelations: false };\n }\n let hasRelations = false;\n\n const populate = Object.keys(model.attributes).reduce((populateAcc: any, attributeName) => {\n const attribute: Schema.Attribute.AnyAttribute = model.attributes[attributeName];\n\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n // Skip relations to content types without draft & publish,\n // as they don't have a publishedAt attribute and can't have drafts\n if (!('target' in attribute)) {\n break;\n }\n\n const targetModel = strapi.getModel(attribute.target);\n if (!targetModel || !hasDraftAndPublish(targetModel)) {\n break;\n }\n\n // Self-referential relations are preserved on publish (see self-referential-relations.ts).\n if (attribute.target === uid) {\n break;\n }\n\n if (isVisibleAttribute(model, attributeName)) {\n // Draft entries link to draft rows of related documents. Populate documentId/locale\n // so we can distinguish truly unpublished targets from published documents that\n // still have a draft row (those links are kept on publish for M2M, or remapped for xToOne).\n const fields: string[] = ['documentId'];\n if (strapi.localization.isLocalizedContentType(targetModel) === true) {\n fields.push('locale');\n }\n populateAcc[attributeName] = {\n fields,\n filters: { [PUBLISHED_AT_ATTRIBUTE]: { $null: true } },\n };\n hasRelations = true;\n }\n break;\n }\n case 'component': {\n const { populate, hasRelations: childHasRelations } = getDeepPopulateDraftCount(\n attribute.component\n );\n if (childHasRelations) {\n populateAcc[attributeName] = {\n populate,\n };\n hasRelations = true;\n }\n break;\n }\n case 'dynamiczone': {\n const dzPopulateFragment = attribute.components?.reduce((acc, componentUID) => {\n const { populate: componentPopulate, hasRelations: componentHasRelations } =\n getDeepPopulateDraftCount(componentUID);\n\n if (componentHasRelations) {\n hasRelations = true;\n\n return { ...acc, [componentUID]: { populate: componentPopulate } };\n }\n\n return acc;\n }, {});\n\n if (!isEmpty(dzPopulateFragment)) {\n populateAcc[attributeName] = { on: dzPopulateFragment };\n }\n break;\n }\n default:\n }\n\n return populateAcc;\n }, {});\n\n const result = { populate, hasRelations };\n draftCountPopulateCache.set(uid, result);\n return result;\n};\n\n/**\n * Create a Strapi populate object which populates all attribute fields of a Strapi query.\n */\nconst getQueryPopulate = async (uid: UID.Schema, query: object): Promise<Populate> => {\n let populateQuery: Populate = {};\n\n await strapiUtils.traverse.traverseQueryFilters(\n /**\n *\n * @param {Object} param0\n * @param {string} param0.key - Attribute name\n * @param {Object} param0.attribute - Attribute definition\n * @param {string} param0.path - Content Type path to the attribute\n * @returns\n */\n ({ attribute, path }: any) => {\n // TODO: handle dynamic zones and morph relations\n if (!attribute || isDynamicZone(attribute) || isMorphToRelation(attribute)) {\n return;\n }\n\n // Populate all relations, components and media\n if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {\n const populatePath = path.attribute.replace(/\\./g, '.populate.');\n populateQuery = merge({}, populateQuery, set({}, populatePath, {}));\n }\n },\n { schema: strapi.getModel(uid), getModel: strapi.getModel.bind(strapi) },\n query\n );\n\n return populateQuery;\n};\n\nconst deepPopulateCache = new Map<string, object>();\n\nconst buildDeepPopulate = async (uid: UID.CollectionType) => {\n const cached = deepPopulateCache.get(uid);\n if (cached) {\n return cached;\n }\n\n const result = await getService('populate-builder')(uid)\n .populateDeep(Infinity)\n .countRelations()\n .build();\n\n deepPopulateCache.set(uid, result);\n\n return result;\n};\n\n/**\n * Restrict localizations populate to only metadata fields for localized content types.\n * Returns an empty object for non-localized content types.\n *\n * By default, localizations are deeply populated which includes all relations and\n * components for every locale — this is expensive and unnecessary for CM responses.\n * The CM only needs these fields from localizations:\n * - locale: to identify which locales exist\n * - documentId: to link to the localized document\n * - publishedAt: to determine published/draft status\n * - updatedAt: to support the modified state indicator in the UI\n */\nconst getPopulateForLocalizations = (model: UID.Schema) => {\n const modelSchema = strapi.getModel(model);\n if (strapi.localization.isLocalizedContentType(modelSchema) === true) {\n return { localizations: { fields: ['locale', 'documentId', 'publishedAt', 'updatedAt'] } };\n }\n\n return {};\n};\n\nexport {\n getDeepPopulate,\n getDeepPopulateDraftCount,\n getPopulateForValidation,\n getQueryPopulate,\n buildDeepPopulate,\n getPopulateForLocalizations,\n};\n"],"names":["isVisibleAttribute","isScalarAttribute","getDoesAttributeRequireValidation","isPrivateAttribute","hasDraftAndPublish","strapiUtils","contentTypes","isAnyToMany","relations","PUBLISHED_AT_ATTRIBUTE","constants","isMorphToRelation","attribute","isRelation","relation","includes","isMedia","matchesProperty","isComponent","isDynamicZone","getPopulateForRelation","model","attributeName","countMany","countOne","initialPopulate","isManyRelation","undefined","validationPopulate","getPopulateForValidation","uid","populate","count","getPopulateForDZ","options","level","populatedComponents","components","reduce","acc","componentUID","getDeepPopulate","on","getPopulateFor","attributes","type","component","folder","maxLevel","Infinity","strapi","getModel","Object","keys","populateAcc","merge","validationPopulateCache","Map","cached","get","result","entries","fields","push","componentResult","length","componentsResult","set","draftCountPopulateCache","getDeepPopulateDraftCount","hasRelations","isMorphRelation","toLowerCase","startsWith","targetModel","target","localization","isLocalizedContentType","filters","$null","childHasRelations","dzPopulateFragment","componentPopulate","componentHasRelations","isEmpty","getQueryPopulate","query","populateQuery","traverse","traverseQueryFilters","path","populatePath","replace","schema","bind","deepPopulateCache","buildDeepPopulate","getService","populateDeep","countRelations","build","getPopulateForLocalizations","modelSchema","localizations"],"mappings":"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"}
@@ -1,16 +1,15 @@
1
- import { propEq, isEmpty, merge, set } from 'lodash/fp';
1
+ import { matchesProperty, isEmpty, merge, set } from 'lodash';
2
2
  import * as strapiUtils from '@strapi/utils';
3
3
  import { getService } from '../../utils/index.mjs';
4
4
 
5
5
  const { isVisibleAttribute, isScalarAttribute, getDoesAttributeRequireValidation, isPrivateAttribute, hasDraftAndPublish } = strapiUtils.contentTypes;
6
6
  const { isAnyToMany } = strapiUtils.relations;
7
7
  const { PUBLISHED_AT_ATTRIBUTE } = strapiUtils.contentTypes.constants;
8
- const isLocalizedContentType = (model)=>model.pluginOptions?.i18n?.localized === true;
9
8
  const isMorphToRelation = (attribute)=>isRelation(attribute) && attribute.relation.includes('morphTo');
10
- const isMedia = propEq('type', 'media');
11
- const isRelation = propEq('type', 'relation');
12
- const isComponent = propEq('type', 'component');
13
- const isDynamicZone = propEq('type', 'dynamiczone');
9
+ const isMedia = matchesProperty('type', 'media');
10
+ const isRelation = matchesProperty('type', 'relation');
11
+ const isComponent = matchesProperty('type', 'component');
12
+ const isDynamicZone = matchesProperty('type', 'dynamiczone');
14
13
  /**
15
14
  * Populate the model for relation
16
15
  * @param attribute - Attribute containing a relation
@@ -113,7 +112,7 @@ const isDynamicZone = propEq('type', 'dynamiczone');
113
112
  if (!model) {
114
113
  return {};
115
114
  }
116
- return Object.keys(model.attributes).reduce((populateAcc, attributeName)=>merge(populateAcc, getPopulateFor(attributeName, model, {
115
+ return Object.keys(model.attributes).reduce((populateAcc, attributeName)=>merge({}, populateAcc, getPopulateFor(attributeName, model, {
117
116
  // @ts-expect-error - improve types
118
117
  initialPopulate: initialPopulate?.[attributeName],
119
118
  countMany,
@@ -244,7 +243,7 @@ const getDeepPopulateDraftCount = (uid)=>{
244
243
  const fields = [
245
244
  'documentId'
246
245
  ];
247
- if (isLocalizedContentType(targetModel)) {
246
+ if (strapi.localization.isLocalizedContentType(targetModel) === true) {
248
247
  fields.push('locale');
249
248
  }
250
249
  populateAcc[attributeName] = {
@@ -321,7 +320,7 @@ const getDeepPopulateDraftCount = (uid)=>{
321
320
  // Populate all relations, components and media
322
321
  if (isRelation(attribute) || isMedia(attribute) || isComponent(attribute)) {
323
322
  const populatePath = path.attribute.replace(/\./g, '.populate.');
324
- populateQuery = merge(populateQuery, set(populatePath, {}, {}));
323
+ populateQuery = merge({}, populateQuery, set({}, populatePath, {}));
325
324
  }
326
325
  }, {
327
326
  schema: strapi.getModel(uid),
@@ -352,7 +351,7 @@ const buildDeepPopulate = async (uid)=>{
352
351
  * - updatedAt: to support the modified state indicator in the UI
353
352
  */ const getPopulateForLocalizations = (model)=>{
354
353
  const modelSchema = strapi.getModel(model);
355
- if (modelSchema.pluginOptions?.i18n?.localized) {
354
+ if (strapi.localization.isLocalizedContentType(modelSchema) === true) {
356
355
  return {
357
356
  localizations: {
358
357
  fields: [