@strapi/core 5.55.1 → 5.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/dist/Strapi.d.ts +1 -0
  2. package/dist/Strapi.d.ts.map +1 -1
  3. package/dist/Strapi.js +6 -3
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +6 -3
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/configuration/get-dirs.js +2 -2
  8. package/dist/configuration/get-dirs.js.map +1 -1
  9. package/dist/configuration/get-dirs.mjs +2 -2
  10. package/dist/configuration/get-dirs.mjs.map +1 -1
  11. package/dist/configuration/index.d.ts +1 -2
  12. package/dist/configuration/index.d.ts.map +1 -1
  13. package/dist/configuration/index.js +1 -2
  14. package/dist/configuration/index.js.map +1 -1
  15. package/dist/configuration/index.mjs +2 -3
  16. package/dist/configuration/index.mjs.map +1 -1
  17. package/dist/core-api/controller/collection-type.js +3 -3
  18. package/dist/core-api/controller/collection-type.js.map +1 -1
  19. package/dist/core-api/controller/collection-type.mjs +1 -1
  20. package/dist/core-api/controller/collection-type.mjs.map +1 -1
  21. package/dist/core-api/controller/index.js +2 -2
  22. package/dist/core-api/controller/index.js.map +1 -1
  23. package/dist/core-api/controller/index.mjs +2 -2
  24. package/dist/core-api/controller/index.mjs.map +1 -1
  25. package/dist/core-api/controller/single-type.js +2 -2
  26. package/dist/core-api/controller/single-type.js.map +1 -1
  27. package/dist/core-api/controller/single-type.mjs +1 -1
  28. package/dist/core-api/controller/single-type.mjs.map +1 -1
  29. package/dist/core-api/controller/transform.d.ts +1 -4
  30. package/dist/core-api/controller/transform.d.ts.map +1 -1
  31. package/dist/core-api/controller/transform.js +8 -8
  32. package/dist/core-api/controller/transform.js.map +1 -1
  33. package/dist/core-api/controller/transform.mjs +5 -5
  34. package/dist/core-api/controller/transform.mjs.map +1 -1
  35. package/dist/core-api/routes/index.js +1 -1
  36. package/dist/core-api/routes/index.js.map +1 -1
  37. package/dist/core-api/routes/index.mjs +1 -1
  38. package/dist/core-api/routes/index.mjs.map +1 -1
  39. package/dist/core-api/service/pagination.js +9 -9
  40. package/dist/core-api/service/pagination.js.map +1 -1
  41. package/dist/core-api/service/pagination.mjs +7 -7
  42. package/dist/core-api/service/pagination.mjs.map +1 -1
  43. package/dist/domain/content-type/index.d.ts.map +1 -1
  44. package/dist/domain/content-type/index.js +1 -2
  45. package/dist/domain/content-type/index.js.map +1 -1
  46. package/dist/domain/content-type/index.mjs +1 -2
  47. package/dist/domain/content-type/index.mjs.map +1 -1
  48. package/dist/ee/index.js +4 -4
  49. package/dist/ee/index.js.map +1 -1
  50. package/dist/ee/index.mjs +3 -3
  51. package/dist/ee/index.mjs.map +1 -1
  52. package/dist/factories.d.ts.map +1 -1
  53. package/dist/factories.js +3 -2
  54. package/dist/factories.js.map +1 -1
  55. package/dist/factories.mjs +3 -2
  56. package/dist/factories.mjs.map +1 -1
  57. package/dist/index.js +1 -1
  58. package/dist/index.mjs +1 -1
  59. package/dist/loaders/apis.d.ts.map +1 -1
  60. package/dist/loaders/apis.js +1 -2
  61. package/dist/loaders/apis.js.map +1 -1
  62. package/dist/loaders/apis.mjs +1 -2
  63. package/dist/loaders/apis.mjs.map +1 -1
  64. package/dist/loaders/plugins/get-enabled-plugins.d.ts +1 -1
  65. package/dist/loaders/plugins/get-enabled-plugins.d.ts.map +1 -1
  66. package/dist/loaders/plugins/get-enabled-plugins.js +6 -5
  67. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  68. package/dist/loaders/plugins/get-enabled-plugins.mjs +6 -5
  69. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  70. package/dist/loaders/plugins/get-user-plugins-config.js +2 -2
  71. package/dist/loaders/plugins/get-user-plugins-config.js.map +1 -1
  72. package/dist/loaders/plugins/get-user-plugins-config.mjs +2 -2
  73. package/dist/loaders/plugins/get-user-plugins-config.mjs.map +1 -1
  74. package/dist/loaders/plugins/index.js +9 -12
  75. package/dist/loaders/plugins/index.js.map +1 -1
  76. package/dist/loaders/plugins/index.mjs +9 -12
  77. package/dist/loaders/plugins/index.mjs.map +1 -1
  78. package/dist/middlewares/body.js +2 -2
  79. package/dist/middlewares/body.js.map +1 -1
  80. package/dist/middlewares/body.mjs +2 -2
  81. package/dist/middlewares/body.mjs.map +1 -1
  82. package/dist/middlewares/public.js +2 -2
  83. package/dist/middlewares/public.js.map +1 -1
  84. package/dist/middlewares/public.mjs +2 -2
  85. package/dist/middlewares/public.mjs.map +1 -1
  86. package/dist/middlewares/responses.d.ts.map +1 -1
  87. package/dist/middlewares/responses.js +1 -3
  88. package/dist/middlewares/responses.js.map +1 -1
  89. package/dist/middlewares/responses.mjs +1 -3
  90. package/dist/middlewares/responses.mjs.map +1 -1
  91. package/dist/middlewares/security.d.ts.map +1 -1
  92. package/dist/middlewares/security.js +3 -3
  93. package/dist/middlewares/security.js.map +1 -1
  94. package/dist/middlewares/security.mjs +3 -3
  95. package/dist/middlewares/security.mjs.map +1 -1
  96. package/dist/middlewares/session.js +2 -2
  97. package/dist/middlewares/session.js.map +1 -1
  98. package/dist/middlewares/session.mjs +2 -2
  99. package/dist/middlewares/session.mjs.map +1 -1
  100. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
  101. package/dist/migrations/database/5.0.0-discard-drafts.js +1 -2
  102. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  103. package/dist/migrations/database/5.0.0-discard-drafts.mjs +1 -2
  104. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  105. package/dist/migrations/i18n.d.ts.map +1 -1
  106. package/dist/migrations/i18n.js +6 -4
  107. package/dist/migrations/i18n.js.map +1 -1
  108. package/dist/migrations/i18n.mjs +6 -4
  109. package/dist/migrations/i18n.mjs.map +1 -1
  110. package/dist/package.json.js +15 -15
  111. package/dist/package.json.mjs +15 -15
  112. package/dist/registries/apis.js +2 -2
  113. package/dist/registries/apis.js.map +1 -1
  114. package/dist/registries/apis.mjs +2 -2
  115. package/dist/registries/apis.mjs.map +1 -1
  116. package/dist/registries/components.js +2 -2
  117. package/dist/registries/components.js.map +1 -1
  118. package/dist/registries/components.mjs +2 -2
  119. package/dist/registries/components.mjs.map +1 -1
  120. package/dist/registries/content-types.d.ts +1 -1
  121. package/dist/registries/content-types.js +3 -3
  122. package/dist/registries/content-types.js.map +1 -1
  123. package/dist/registries/content-types.mjs +3 -3
  124. package/dist/registries/content-types.mjs.map +1 -1
  125. package/dist/registries/controllers.js +3 -3
  126. package/dist/registries/controllers.js.map +1 -1
  127. package/dist/registries/controllers.mjs +3 -3
  128. package/dist/registries/controllers.mjs.map +1 -1
  129. package/dist/registries/custom-fields.js +4 -4
  130. package/dist/registries/custom-fields.js.map +1 -1
  131. package/dist/registries/custom-fields.mjs +4 -4
  132. package/dist/registries/custom-fields.mjs.map +1 -1
  133. package/dist/registries/hooks.d.ts +1 -1
  134. package/dist/registries/hooks.js +2 -2
  135. package/dist/registries/hooks.js.map +1 -1
  136. package/dist/registries/hooks.mjs +2 -2
  137. package/dist/registries/hooks.mjs.map +1 -1
  138. package/dist/registries/middlewares.d.ts +1 -1
  139. package/dist/registries/middlewares.js +3 -3
  140. package/dist/registries/middlewares.js.map +1 -1
  141. package/dist/registries/middlewares.mjs +3 -3
  142. package/dist/registries/middlewares.mjs.map +1 -1
  143. package/dist/registries/modules.d.ts +1 -4
  144. package/dist/registries/modules.d.ts.map +1 -1
  145. package/dist/registries/modules.js +3 -3
  146. package/dist/registries/modules.js.map +1 -1
  147. package/dist/registries/modules.mjs +3 -3
  148. package/dist/registries/modules.mjs.map +1 -1
  149. package/dist/registries/plugins.js +2 -2
  150. package/dist/registries/plugins.js.map +1 -1
  151. package/dist/registries/plugins.mjs +2 -2
  152. package/dist/registries/plugins.mjs.map +1 -1
  153. package/dist/registries/policies.d.ts +1 -1
  154. package/dist/registries/policies.js +4 -4
  155. package/dist/registries/policies.js.map +1 -1
  156. package/dist/registries/policies.mjs +3 -3
  157. package/dist/registries/policies.mjs.map +1 -1
  158. package/dist/registries/services.js +3 -3
  159. package/dist/registries/services.js.map +1 -1
  160. package/dist/registries/services.mjs +3 -3
  161. package/dist/registries/services.mjs.map +1 -1
  162. package/dist/services/auth/index.js +3 -3
  163. package/dist/services/auth/index.js.map +1 -1
  164. package/dist/services/auth/index.mjs +3 -3
  165. package/dist/services/auth/index.mjs.map +1 -1
  166. package/dist/services/content-structure/index.js +1 -1
  167. package/dist/services/content-structure/index.js.map +1 -1
  168. package/dist/services/content-structure/index.mjs +1 -1
  169. package/dist/services/content-structure/index.mjs.map +1 -1
  170. package/dist/services/core-store.js +3 -3
  171. package/dist/services/core-store.js.map +1 -1
  172. package/dist/services/core-store.mjs +1 -1
  173. package/dist/services/core-store.mjs.map +1 -1
  174. package/dist/services/cron.d.ts.map +1 -1
  175. package/dist/services/cron.js +2 -4
  176. package/dist/services/cron.js.map +1 -1
  177. package/dist/services/cron.mjs +2 -4
  178. package/dist/services/cron.mjs.map +1 -1
  179. package/dist/services/document-service/attributes/index.js +2 -2
  180. package/dist/services/document-service/attributes/index.js.map +1 -1
  181. package/dist/services/document-service/attributes/index.mjs +1 -1
  182. package/dist/services/document-service/attributes/index.mjs.map +1 -1
  183. package/dist/services/document-service/attributes/transforms.js +3 -3
  184. package/dist/services/document-service/attributes/transforms.js.map +1 -1
  185. package/dist/services/document-service/attributes/transforms.mjs +2 -2
  186. package/dist/services/document-service/attributes/transforms.mjs.map +1 -1
  187. package/dist/services/document-service/components.d.ts.map +1 -1
  188. package/dist/services/document-service/components.js +13 -14
  189. package/dist/services/document-service/components.js.map +1 -1
  190. package/dist/services/document-service/components.mjs +12 -13
  191. package/dist/services/document-service/components.mjs.map +1 -1
  192. package/dist/services/document-service/draft-and-publish.js +65 -38
  193. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  194. package/dist/services/document-service/draft-and-publish.mjs +59 -32
  195. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  196. package/dist/services/document-service/entries.d.ts +2 -2
  197. package/dist/services/document-service/entries.d.ts.map +1 -1
  198. package/dist/services/document-service/entries.js +16 -8
  199. package/dist/services/document-service/entries.js.map +1 -1
  200. package/dist/services/document-service/entries.mjs +17 -9
  201. package/dist/services/document-service/entries.mjs.map +1 -1
  202. package/dist/services/document-service/first-published-at.js +7 -5
  203. package/dist/services/document-service/first-published-at.js.map +1 -1
  204. package/dist/services/document-service/first-published-at.mjs +7 -5
  205. package/dist/services/document-service/first-published-at.mjs.map +1 -1
  206. package/dist/services/document-service/internationalization.d.ts.map +1 -1
  207. package/dist/services/document-service/internationalization.js +37 -28
  208. package/dist/services/document-service/internationalization.js.map +1 -1
  209. package/dist/services/document-service/internationalization.mjs +33 -24
  210. package/dist/services/document-service/internationalization.mjs.map +1 -1
  211. package/dist/services/document-service/params.d.ts +1 -0
  212. package/dist/services/document-service/params.d.ts.map +1 -1
  213. package/dist/services/document-service/params.js +6 -4
  214. package/dist/services/document-service/params.js.map +1 -1
  215. package/dist/services/document-service/params.mjs +6 -5
  216. package/dist/services/document-service/params.mjs.map +1 -1
  217. package/dist/services/document-service/repository.d.ts.map +1 -1
  218. package/dist/services/document-service/repository.js +84 -61
  219. package/dist/services/document-service/repository.js.map +1 -1
  220. package/dist/services/document-service/repository.mjs +47 -24
  221. package/dist/services/document-service/repository.mjs.map +1 -1
  222. package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
  223. package/dist/services/document-service/transform/id-map.js +2 -1
  224. package/dist/services/document-service/transform/id-map.js.map +1 -1
  225. package/dist/services/document-service/transform/id-map.mjs +2 -1
  226. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  227. package/dist/services/document-service/transform/id-transform.js +2 -2
  228. package/dist/services/document-service/transform/id-transform.js.map +1 -1
  229. package/dist/services/document-service/transform/id-transform.mjs +1 -1
  230. package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
  231. package/dist/services/document-service/transform/query.d.ts +3 -1
  232. package/dist/services/document-service/transform/query.d.ts.map +1 -1
  233. package/dist/services/document-service/transform/query.js +12 -6
  234. package/dist/services/document-service/transform/query.js.map +1 -1
  235. package/dist/services/document-service/transform/query.mjs +11 -5
  236. package/dist/services/document-service/transform/query.mjs.map +1 -1
  237. package/dist/services/document-service/transform/relations/extract/data-ids.js +2 -2
  238. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  239. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +1 -1
  240. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  241. package/dist/services/document-service/transform/relations/transform/data-ids.js +2 -2
  242. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  243. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +1 -1
  244. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  245. package/dist/services/document-service/transform/relations/transform/default-locale.js +1 -1
  246. package/dist/services/document-service/transform/relations/transform/default-locale.js.map +1 -1
  247. package/dist/services/document-service/transform/relations/transform/default-locale.mjs +1 -1
  248. package/dist/services/document-service/transform/relations/transform/default-locale.mjs.map +1 -1
  249. package/dist/services/document-service/transform/relations/utils/dp.d.ts.map +1 -1
  250. package/dist/services/document-service/transform/relations/utils/dp.js +1 -2
  251. package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -1
  252. package/dist/services/document-service/transform/relations/utils/dp.mjs +1 -2
  253. package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -1
  254. package/dist/services/document-service/transform/relations/utils/i18n.d.ts +2 -2
  255. package/dist/services/document-service/transform/relations/utils/i18n.d.ts.map +1 -1
  256. package/dist/services/document-service/transform/relations/utils/i18n.js +2 -2
  257. package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -1
  258. package/dist/services/document-service/transform/relations/utils/i18n.mjs +2 -2
  259. package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -1
  260. package/dist/services/document-service/transform/relations/utils/map-relation.js +6 -6
  261. package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
  262. package/dist/services/document-service/transform/relations/utils/map-relation.mjs +3 -3
  263. package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
  264. package/dist/services/document-service/transform/relations/utils/xto-one.js +3 -3
  265. package/dist/services/document-service/transform/relations/utils/xto-one.js.map +1 -1
  266. package/dist/services/document-service/transform/relations/utils/xto-one.mjs +2 -2
  267. package/dist/services/document-service/transform/relations/utils/xto-one.mjs.map +1 -1
  268. package/dist/services/document-service/utils/bidirectional-relations.js +3 -3
  269. package/dist/services/document-service/utils/bidirectional-relations.js.map +1 -1
  270. package/dist/services/document-service/utils/bidirectional-relations.mjs +3 -3
  271. package/dist/services/document-service/utils/bidirectional-relations.mjs.map +1 -1
  272. package/dist/services/document-service/utils/clone-relations.js +3 -3
  273. package/dist/services/document-service/utils/clone-relations.js.map +1 -1
  274. package/dist/services/document-service/utils/clone-relations.mjs +3 -3
  275. package/dist/services/document-service/utils/clone-relations.mjs.map +1 -1
  276. package/dist/services/document-service/utils/self-referential-relations.js +4 -4
  277. package/dist/services/document-service/utils/self-referential-relations.js.map +1 -1
  278. package/dist/services/document-service/utils/self-referential-relations.mjs +4 -4
  279. package/dist/services/document-service/utils/self-referential-relations.mjs.map +1 -1
  280. package/dist/services/document-service/utils/unidirectional-relations.js +3 -3
  281. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  282. package/dist/services/document-service/utils/unidirectional-relations.mjs +3 -3
  283. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  284. package/dist/services/entity-validator/index.d.ts.map +1 -1
  285. package/dist/services/entity-validator/index.js +9 -10
  286. package/dist/services/entity-validator/index.js.map +1 -1
  287. package/dist/services/entity-validator/index.mjs +4 -5
  288. package/dist/services/entity-validator/index.mjs.map +1 -1
  289. package/dist/services/localization.d.ts +4 -0
  290. package/dist/services/localization.d.ts.map +1 -0
  291. package/dist/services/localization.js +51 -0
  292. package/dist/services/localization.js.map +1 -0
  293. package/dist/services/localization.mjs +49 -0
  294. package/dist/services/localization.mjs.map +1 -0
  295. package/dist/services/server/compose-endpoint.js +7 -7
  296. package/dist/services/server/compose-endpoint.js.map +1 -1
  297. package/dist/services/server/compose-endpoint.mjs +3 -3
  298. package/dist/services/server/compose-endpoint.mjs.map +1 -1
  299. package/dist/services/server/koa-methods.js +2 -2
  300. package/dist/services/server/koa-methods.js.map +1 -1
  301. package/dist/services/server/koa-methods.mjs +1 -1
  302. package/dist/services/server/koa-methods.mjs.map +1 -1
  303. package/dist/services/server/koa.d.ts.map +1 -1
  304. package/dist/services/server/koa.js +1 -2
  305. package/dist/services/server/koa.js.map +1 -1
  306. package/dist/services/server/koa.mjs +1 -2
  307. package/dist/services/server/koa.mjs.map +1 -1
  308. package/dist/services/server/middleware.d.ts.map +1 -1
  309. package/dist/services/server/middleware.js +1 -2
  310. package/dist/services/server/middleware.js.map +1 -1
  311. package/dist/services/server/middleware.mjs +1 -2
  312. package/dist/services/server/middleware.mjs.map +1 -1
  313. package/dist/services/server/routing.js +2 -2
  314. package/dist/services/server/routing.js.map +1 -1
  315. package/dist/services/server/routing.mjs +2 -2
  316. package/dist/services/server/routing.mjs.map +1 -1
  317. package/dist/services/utils/conditional-fields.d.ts +1 -1
  318. package/dist/services/utils/conditional-fields.d.ts.map +1 -1
  319. package/dist/services/utils/conditional-fields.js +2 -8
  320. package/dist/services/utils/conditional-fields.js.map +1 -1
  321. package/dist/services/utils/conditional-fields.mjs +2 -8
  322. package/dist/services/utils/conditional-fields.mjs.map +1 -1
  323. package/dist/services/utils/dynamic-zones.d.ts.map +1 -1
  324. package/dist/services/utils/dynamic-zones.js +2 -8
  325. package/dist/services/utils/dynamic-zones.js.map +1 -1
  326. package/dist/services/utils/dynamic-zones.mjs +2 -8
  327. package/dist/services/utils/dynamic-zones.mjs.map +1 -1
  328. package/dist/utils/cron.js +2 -2
  329. package/dist/utils/cron.js.map +1 -1
  330. package/dist/utils/cron.mjs +1 -1
  331. package/dist/utils/cron.mjs.map +1 -1
  332. package/dist/utils/filepath-to-prop-path.d.ts.map +1 -1
  333. package/dist/utils/filepath-to-prop-path.js +5 -12
  334. package/dist/utils/filepath-to-prop-path.js.map +1 -1
  335. package/dist/utils/filepath-to-prop-path.mjs +5 -11
  336. package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
  337. package/dist/utils/is-initialized.js +3 -3
  338. package/dist/utils/is-initialized.js.map +1 -1
  339. package/dist/utils/is-initialized.mjs +2 -2
  340. package/dist/utils/is-initialized.mjs.map +1 -1
  341. package/dist/utils/startup-logger.d.ts.map +1 -1
  342. package/dist/utils/startup-logger.js +2 -4
  343. package/dist/utils/startup-logger.js.map +1 -1
  344. package/dist/utils/startup-logger.mjs +2 -3
  345. package/dist/utils/startup-logger.mjs.map +1 -1
  346. package/dist/utils/transform-content-types-to-models.js +4 -4
  347. package/dist/utils/transform-content-types-to-models.js.map +1 -1
  348. package/dist/utils/transform-content-types-to-models.mjs +3 -3
  349. package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
  350. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"policies.mjs","sources":["../../src/registries/policies.ts"],"sourcesContent":["import { pickBy, has, castArray } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nconst PLUGIN_PREFIX = 'plugin::';\nconst API_PREFIX = 'api::';\n\ninterface PolicyInfo {\n name: string;\n config: unknown;\n}\n\ntype PolicyConfig = string | PolicyInfo;\n\ninterface NamespaceInfo {\n pluginName?: string;\n apiName?: string;\n}\n\nconst parsePolicy = (policy: string | PolicyInfo) => {\n if (typeof policy === 'string') {\n return { policyName: policy, config: {} };\n }\n\n const { name, config } = policy;\n return { policyName: name, config };\n};\n\nconst policiesRegistry = () => {\n const policies = new Map<string, Core.Policy>();\n\n const find = (name: string, namespaceInfo?: NamespaceInfo) => {\n const { pluginName, apiName } = namespaceInfo ?? {};\n\n // try to resolve a full name to avoid extra prefixing\n const policy = policies.get(name);\n\n if (policy) {\n return policy;\n }\n\n if (pluginName) {\n return policies.get(`${PLUGIN_PREFIX}${pluginName}.${name}`);\n }\n\n if (apiName) {\n return policies.get(`${API_PREFIX}${apiName}.${name}`);\n }\n };\n\n function resolveHandler(policyConfig: PolicyConfig, namespaceInfo?: NamespaceInfo): Core.Policy;\n function resolveHandler(\n policyConfig: PolicyConfig[],\n namespaceInfo?: NamespaceInfo\n ): Core.Policy[];\n function resolveHandler(\n policyConfig: PolicyConfig | PolicyConfig[],\n namespaceInfo?: NamespaceInfo\n ): Core.Policy | Core.Policy[] {\n if (Array.isArray(policyConfig)) {\n return policyConfig.map((config) => {\n return resolveHandler(config, namespaceInfo);\n });\n }\n\n const { policyName, config } = parsePolicy(policyConfig);\n\n const policy = find(policyName, namespaceInfo);\n\n if (!policy) {\n throw new Error(`Policy ${policyName} not found.`);\n }\n\n if (typeof policy === 'function') {\n return policy;\n }\n\n if (policy.validator) {\n policy.validator(config);\n }\n\n return policy.handler;\n }\n\n return {\n /**\n * Returns this list of registered policies uids\n */\n keys() {\n // Return an array so format stays the same as controllers, services, etc\n return Array.from(policies.keys());\n },\n\n /**\n * Returns the instance of a policy. Instantiate the policy if not already done\n */\n get(name: string, namespaceInfo?: NamespaceInfo) {\n return find(name, namespaceInfo);\n },\n /**\n * Checks if a policy is registered\n */\n has(name: string, namespaceInfo?: NamespaceInfo) {\n const res = find(name, namespaceInfo);\n return !!res;\n },\n\n /**\n * Returns a map with all the policies in a namespace\n */\n getAll(namespace: string) {\n return pickBy((_, uid) => hasNamespace(uid, namespace))(Object.fromEntries(policies));\n },\n\n /**\n * Registers a policy\n */\n set(uid: string, policy: Core.Policy) {\n policies.set(uid, policy);\n return this;\n },\n\n /**\n * Registers a map of policies for a specific namespace\n */\n add(namespace: string, newPolicies: Record<string, Core.Policy>) {\n for (const policyName of Object.keys(newPolicies)) {\n const policy = newPolicies[policyName];\n const uid = addNamespace(policyName, namespace);\n\n if (has(uid, policies)) {\n throw new Error(`Policy ${uid} has already been registered.`);\n }\n\n policies.set(uid, policy);\n }\n },\n\n /**\n * Resolves a list of policies\n */\n resolve(config: PolicyConfig | PolicyConfig[], namespaceInfo?: NamespaceInfo) {\n const { pluginName, apiName } = namespaceInfo ?? {};\n\n return castArray(config).map((policyConfig) => {\n return {\n handler: resolveHandler(policyConfig, { pluginName, apiName }),\n config: (typeof policyConfig === 'object' && policyConfig.config) || {},\n };\n });\n },\n };\n};\n\nexport default policiesRegistry;\n"],"names":["PLUGIN_PREFIX","API_PREFIX","parsePolicy","policy","policyName","config","name","policiesRegistry","policies","Map","find","namespaceInfo","pluginName","apiName","get","resolveHandler","policyConfig","Array","isArray","map","Error","validator","handler","keys","from","has","res","getAll","namespace","pickBy","_","uid","hasNamespace","Object","fromEntries","set","add","newPolicies","addNamespace","resolve","castArray"],"mappings":"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"}
1
+ {"version":3,"file":"policies.mjs","sources":["../../src/registries/policies.ts"],"sourcesContent":["import { castArray, has, pickBy } from 'lodash';\nimport type { Core } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nconst PLUGIN_PREFIX = 'plugin::';\nconst API_PREFIX = 'api::';\n\ninterface PolicyInfo {\n name: string;\n config: unknown;\n}\n\ntype PolicyConfig = string | PolicyInfo;\n\ninterface NamespaceInfo {\n pluginName?: string;\n apiName?: string;\n}\n\nconst parsePolicy = (policy: string | PolicyInfo) => {\n if (typeof policy === 'string') {\n return { policyName: policy, config: {} };\n }\n\n const { name, config } = policy;\n return { policyName: name, config };\n};\n\nconst policiesRegistry = () => {\n const policies = new Map<string, Core.Policy>();\n\n const find = (name: string, namespaceInfo?: NamespaceInfo) => {\n const { pluginName, apiName } = namespaceInfo ?? {};\n\n // try to resolve a full name to avoid extra prefixing\n const policy = policies.get(name);\n\n if (policy) {\n return policy;\n }\n\n if (pluginName) {\n return policies.get(`${PLUGIN_PREFIX}${pluginName}.${name}`);\n }\n\n if (apiName) {\n return policies.get(`${API_PREFIX}${apiName}.${name}`);\n }\n };\n\n function resolveHandler(policyConfig: PolicyConfig, namespaceInfo?: NamespaceInfo): Core.Policy;\n function resolveHandler(\n policyConfig: PolicyConfig[],\n namespaceInfo?: NamespaceInfo\n ): Core.Policy[];\n function resolveHandler(\n policyConfig: PolicyConfig | PolicyConfig[],\n namespaceInfo?: NamespaceInfo\n ): Core.Policy | Core.Policy[] {\n if (Array.isArray(policyConfig)) {\n return policyConfig.map((config) => {\n return resolveHandler(config, namespaceInfo);\n });\n }\n\n const { policyName, config } = parsePolicy(policyConfig);\n\n const policy = find(policyName, namespaceInfo);\n\n if (!policy) {\n throw new Error(`Policy ${policyName} not found.`);\n }\n\n if (typeof policy === 'function') {\n return policy;\n }\n\n if (policy.validator) {\n policy.validator(config);\n }\n\n return policy.handler;\n }\n\n return {\n /**\n * Returns this list of registered policies uids\n */\n keys() {\n // Return an array so format stays the same as controllers, services, etc\n return Array.from(policies.keys());\n },\n\n /**\n * Returns the instance of a policy. Instantiate the policy if not already done\n */\n get(name: string, namespaceInfo?: NamespaceInfo) {\n return find(name, namespaceInfo);\n },\n /**\n * Checks if a policy is registered\n */\n has(name: string, namespaceInfo?: NamespaceInfo) {\n const res = find(name, namespaceInfo);\n return !!res;\n },\n\n /**\n * Returns a map with all the policies in a namespace\n */\n getAll(namespace: string) {\n return pickBy(Object.fromEntries(policies), (_, uid) => hasNamespace(uid, namespace));\n },\n\n /**\n * Registers a policy\n */\n set(uid: string, policy: Core.Policy) {\n policies.set(uid, policy);\n return this;\n },\n\n /**\n * Registers a map of policies for a specific namespace\n */\n add(namespace: string, newPolicies: Record<string, Core.Policy>) {\n for (const policyName of Object.keys(newPolicies)) {\n const policy = newPolicies[policyName];\n const uid = addNamespace(policyName, namespace);\n\n if (has(policies, uid)) {\n throw new Error(`Policy ${uid} has already been registered.`);\n }\n\n policies.set(uid, policy);\n }\n },\n\n /**\n * Resolves a list of policies\n */\n resolve(config: PolicyConfig | PolicyConfig[], namespaceInfo?: NamespaceInfo) {\n const { pluginName, apiName } = namespaceInfo ?? {};\n\n return castArray(config).map((policyConfig) => {\n return {\n handler: resolveHandler(policyConfig, { pluginName, apiName }),\n config: (typeof policyConfig === 'object' && policyConfig.config) || {},\n };\n });\n },\n };\n};\n\nexport default policiesRegistry;\n"],"names":["PLUGIN_PREFIX","API_PREFIX","parsePolicy","policy","policyName","config","name","policiesRegistry","policies","Map","find","namespaceInfo","pluginName","apiName","get","resolveHandler","policyConfig","Array","isArray","map","Error","validator","handler","keys","from","has","res","getAll","namespace","pickBy","Object","fromEntries","_","uid","hasNamespace","set","add","newPolicies","addNamespace","resolve","castArray"],"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 namespace = require('./namespace.js');
5
5
 
6
6
  const servicesRegistry = (strapi)=>{
@@ -29,7 +29,7 @@ const servicesRegistry = (strapi)=>{
29
29
  /**
30
30
  * Returns a map with all the services in a namespace
31
31
  */ getAll (namespace$1) {
32
- const filteredServices = fp.pickBy((_, uid)=>namespace.hasNamespace(uid, namespace$1))(services);
32
+ const filteredServices = _.pickBy(services, (_, uid)=>namespace.hasNamespace(uid, namespace$1));
33
33
  // create lazy accessor to avoid instantiating the services;
34
34
  const map = {};
35
35
  for (const uid of Object.keys(filteredServices)){
@@ -55,7 +55,7 @@ const servicesRegistry = (strapi)=>{
55
55
  for (const serviceName of Object.keys(newServices)){
56
56
  const service = newServices[serviceName];
57
57
  const uid = namespace.addNamespace(serviceName, namespace$1);
58
- if (fp.has(uid, services)) {
58
+ if (_.has(services, uid)) {
59
59
  throw new Error(`Service ${uid} has already been registered.`);
60
60
  }
61
61
  services[uid] = service;
@@ -1 +1 @@
1
- {"version":3,"file":"services.js","sources":["../../src/registries/services.ts"],"sourcesContent":["import { pickBy, has } from 'lodash/fp';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ServiceFactory = (params: { strapi: Core.Strapi }) => Core.Service | Core.Service;\nexport type ServiceFactoryMap = Record<string, ServiceFactory>;\nexport type ServiceMap = Record<string, Core.Service>;\nexport type ServiceExtendFn = (service: Core.Service) => Core.Service;\n\nconst servicesRegistry = (strapi: Core.Strapi) => {\n const services: ServiceFactoryMap = {};\n const instantiatedServices: ServiceMap = {};\n\n return {\n /**\n * Returns this list of registered services uids\n */\n keys() {\n return Object.keys(services);\n },\n\n /**\n * Returns the instance of a service. Instantiate the service if not already done\n */\n get(uid: UID.Service) {\n if (instantiatedServices[uid]) {\n return instantiatedServices[uid];\n }\n\n const service = services[uid];\n if (service) {\n instantiatedServices[uid] = typeof service === 'function' ? service({ strapi }) : service;\n return instantiatedServices[uid];\n }\n },\n\n /**\n * Returns a map with all the services in a namespace\n */\n getAll(namespace: string): ServiceMap {\n const filteredServices = pickBy((_, uid) => hasNamespace(uid, namespace))(services);\n\n // create lazy accessor to avoid instantiating the services;\n const map = {};\n for (const uid of Object.keys(filteredServices)) {\n Object.defineProperty(map, uid, {\n enumerable: true,\n get: () => {\n return this.get(uid as UID.Service);\n },\n });\n }\n\n return map;\n },\n\n /**\n * Registers a service\n */\n set(uid: string, service: ServiceFactory) {\n services[uid] = service;\n delete instantiatedServices[uid];\n return this;\n },\n\n /**\n * Registers a map of services for a specific namespace\n */\n add(namespace: string, newServices: ServiceFactoryMap) {\n for (const serviceName of Object.keys(newServices)) {\n const service = newServices[serviceName];\n const uid = addNamespace(serviceName, namespace);\n\n if (has(uid, services)) {\n throw new Error(`Service ${uid} has already been registered.`);\n }\n services[uid] = service;\n }\n\n return this;\n },\n\n /**\n * Wraps a service to extend it\n */\n extend(uid: UID.Service, extendFn: ServiceExtendFn) {\n const currentService = this.get(uid);\n\n if (!currentService) {\n throw new Error(`Service ${uid} doesn't exist`);\n }\n\n const newService = extendFn(currentService);\n instantiatedServices[uid] = newService;\n\n return this;\n },\n };\n};\n\nexport default servicesRegistry;\n"],"names":["servicesRegistry","strapi","services","instantiatedServices","keys","Object","get","uid","service","getAll","namespace","filteredServices","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","add","newServices","serviceName","addNamespace","has","Error","extend","extendFn","currentService","newService"],"mappings":"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"}
1
+ {"version":3,"file":"services.js","sources":["../../src/registries/services.ts"],"sourcesContent":["import { has, pickBy } from 'lodash';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ServiceFactory = (params: { strapi: Core.Strapi }) => Core.Service | Core.Service;\nexport type ServiceFactoryMap = Record<string, ServiceFactory>;\nexport type ServiceMap = Record<string, Core.Service>;\nexport type ServiceExtendFn = (service: Core.Service) => Core.Service;\n\nconst servicesRegistry = (strapi: Core.Strapi) => {\n const services: ServiceFactoryMap = {};\n const instantiatedServices: ServiceMap = {};\n\n return {\n /**\n * Returns this list of registered services uids\n */\n keys() {\n return Object.keys(services);\n },\n\n /**\n * Returns the instance of a service. Instantiate the service if not already done\n */\n get(uid: UID.Service) {\n if (instantiatedServices[uid]) {\n return instantiatedServices[uid];\n }\n\n const service = services[uid];\n if (service) {\n instantiatedServices[uid] = typeof service === 'function' ? service({ strapi }) : service;\n return instantiatedServices[uid];\n }\n },\n\n /**\n * Returns a map with all the services in a namespace\n */\n getAll(namespace: string): ServiceMap {\n const filteredServices = pickBy(services, (_, uid) => hasNamespace(uid, namespace));\n\n // create lazy accessor to avoid instantiating the services;\n const map = {};\n for (const uid of Object.keys(filteredServices)) {\n Object.defineProperty(map, uid, {\n enumerable: true,\n get: () => {\n return this.get(uid as UID.Service);\n },\n });\n }\n\n return map;\n },\n\n /**\n * Registers a service\n */\n set(uid: string, service: ServiceFactory) {\n services[uid] = service;\n delete instantiatedServices[uid];\n return this;\n },\n\n /**\n * Registers a map of services for a specific namespace\n */\n add(namespace: string, newServices: ServiceFactoryMap) {\n for (const serviceName of Object.keys(newServices)) {\n const service = newServices[serviceName];\n const uid = addNamespace(serviceName, namespace);\n\n if (has(services, uid)) {\n throw new Error(`Service ${uid} has already been registered.`);\n }\n services[uid] = service;\n }\n\n return this;\n },\n\n /**\n * Wraps a service to extend it\n */\n extend(uid: UID.Service, extendFn: ServiceExtendFn) {\n const currentService = this.get(uid);\n\n if (!currentService) {\n throw new Error(`Service ${uid} doesn't exist`);\n }\n\n const newService = extendFn(currentService);\n instantiatedServices[uid] = newService;\n\n return this;\n },\n };\n};\n\nexport default servicesRegistry;\n"],"names":["servicesRegistry","strapi","services","instantiatedServices","keys","Object","get","uid","service","getAll","namespace","filteredServices","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","add","newServices","serviceName","addNamespace","has","Error","extend","extendFn","currentService","newService"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { has, pickBy } from 'lodash/fp';
1
+ import { has, pickBy } from 'lodash';
2
2
  import { addNamespace, hasNamespace } from './namespace.mjs';
3
3
 
4
4
  const servicesRegistry = (strapi)=>{
@@ -27,7 +27,7 @@ const servicesRegistry = (strapi)=>{
27
27
  /**
28
28
  * Returns a map with all the services in a namespace
29
29
  */ getAll (namespace) {
30
- const filteredServices = pickBy((_, uid)=>hasNamespace(uid, namespace))(services);
30
+ const filteredServices = pickBy(services, (_, uid)=>hasNamespace(uid, namespace));
31
31
  // create lazy accessor to avoid instantiating the services;
32
32
  const map = {};
33
33
  for (const uid of Object.keys(filteredServices)){
@@ -53,7 +53,7 @@ const servicesRegistry = (strapi)=>{
53
53
  for (const serviceName of Object.keys(newServices)){
54
54
  const service = newServices[serviceName];
55
55
  const uid = addNamespace(serviceName, namespace);
56
- if (has(uid, services)) {
56
+ if (has(services, uid)) {
57
57
  throw new Error(`Service ${uid} has already been registered.`);
58
58
  }
59
59
  services[uid] = service;
@@ -1 +1 @@
1
- {"version":3,"file":"services.mjs","sources":["../../src/registries/services.ts"],"sourcesContent":["import { pickBy, has } from 'lodash/fp';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ServiceFactory = (params: { strapi: Core.Strapi }) => Core.Service | Core.Service;\nexport type ServiceFactoryMap = Record<string, ServiceFactory>;\nexport type ServiceMap = Record<string, Core.Service>;\nexport type ServiceExtendFn = (service: Core.Service) => Core.Service;\n\nconst servicesRegistry = (strapi: Core.Strapi) => {\n const services: ServiceFactoryMap = {};\n const instantiatedServices: ServiceMap = {};\n\n return {\n /**\n * Returns this list of registered services uids\n */\n keys() {\n return Object.keys(services);\n },\n\n /**\n * Returns the instance of a service. Instantiate the service if not already done\n */\n get(uid: UID.Service) {\n if (instantiatedServices[uid]) {\n return instantiatedServices[uid];\n }\n\n const service = services[uid];\n if (service) {\n instantiatedServices[uid] = typeof service === 'function' ? service({ strapi }) : service;\n return instantiatedServices[uid];\n }\n },\n\n /**\n * Returns a map with all the services in a namespace\n */\n getAll(namespace: string): ServiceMap {\n const filteredServices = pickBy((_, uid) => hasNamespace(uid, namespace))(services);\n\n // create lazy accessor to avoid instantiating the services;\n const map = {};\n for (const uid of Object.keys(filteredServices)) {\n Object.defineProperty(map, uid, {\n enumerable: true,\n get: () => {\n return this.get(uid as UID.Service);\n },\n });\n }\n\n return map;\n },\n\n /**\n * Registers a service\n */\n set(uid: string, service: ServiceFactory) {\n services[uid] = service;\n delete instantiatedServices[uid];\n return this;\n },\n\n /**\n * Registers a map of services for a specific namespace\n */\n add(namespace: string, newServices: ServiceFactoryMap) {\n for (const serviceName of Object.keys(newServices)) {\n const service = newServices[serviceName];\n const uid = addNamespace(serviceName, namespace);\n\n if (has(uid, services)) {\n throw new Error(`Service ${uid} has already been registered.`);\n }\n services[uid] = service;\n }\n\n return this;\n },\n\n /**\n * Wraps a service to extend it\n */\n extend(uid: UID.Service, extendFn: ServiceExtendFn) {\n const currentService = this.get(uid);\n\n if (!currentService) {\n throw new Error(`Service ${uid} doesn't exist`);\n }\n\n const newService = extendFn(currentService);\n instantiatedServices[uid] = newService;\n\n return this;\n },\n };\n};\n\nexport default servicesRegistry;\n"],"names":["servicesRegistry","strapi","services","instantiatedServices","keys","Object","get","uid","service","getAll","namespace","filteredServices","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","add","newServices","serviceName","addNamespace","has","Error","extend","extendFn","currentService","newService"],"mappings":";;;AASA,MAAMA,mBAAmB,CAACC,MAAAA,GAAAA;AACxB,IAAA,MAAMC,WAA8B,EAAC;AACrC,IAAA,MAAMC,uBAAmC,EAAC;IAE1C,OAAO;AACL;;QAGAC,IAAAA,CAAAA,GAAAA;YACE,OAAOC,MAAAA,CAAOD,IAAI,CAACF,QAAAA,CAAAA;AACrB,QAAA,CAAA;AAEA;;AAEC,QACDI,KAAIC,GAAgB,EAAA;YAClB,IAAIJ,oBAAoB,CAACI,GAAAA,CAAI,EAAE;gBAC7B,OAAOJ,oBAAoB,CAACI,GAAAA,CAAI;AAClC,YAAA;YAEA,MAAMC,OAAAA,GAAUN,QAAQ,CAACK,GAAAA,CAAI;AAC7B,YAAA,IAAIC,OAAAA,EAAS;AACXL,gBAAAA,oBAAoB,CAACI,GAAAA,CAAI,GAAG,OAAOC,OAAAA,KAAY,aAAaA,OAAAA,CAAQ;AAAEP,oBAAAA;iBAAO,CAAA,GAAKO,OAAAA;gBAClF,OAAOL,oBAAoB,CAACI,GAAAA,CAAI;AAClC,YAAA;AACF,QAAA,CAAA;AAEA;;AAEC,QACDE,QAAOC,SAAiB,EAAA;AACtB,YAAA,MAAMC,mBAAmBC,MAAAA,CAAO,CAACC,GAAGN,GAAAA,GAAQO,YAAAA,CAAaP,KAAKG,SAAAA,CAAAA,CAAAA,CAAYR,QAAAA,CAAAA;;AAG1E,YAAA,MAAMa,MAAM,EAAC;AACb,YAAA,KAAK,MAAMR,GAAAA,IAAOF,MAAAA,CAAOD,IAAI,CAACO,gBAAAA,CAAAA,CAAmB;gBAC/CN,MAAAA,CAAOW,cAAc,CAACD,GAAAA,EAAKR,GAAAA,EAAK;oBAC9BU,UAAAA,EAAY,IAAA;oBACZX,GAAAA,EAAK,IAAA;wBACH,OAAO,IAAI,CAACA,GAAG,CAACC,GAAAA,CAAAA;AAClB,oBAAA;AACF,iBAAA,CAAA;AACF,YAAA;YAEA,OAAOQ,GAAAA;AACT,QAAA,CAAA;AAEA;;QAGAG,GAAAA,CAAAA,CAAIX,GAAW,EAAEC,OAAuB,EAAA;YACtCN,QAAQ,CAACK,IAAI,GAAGC,OAAAA;YAChB,OAAOL,oBAAoB,CAACI,GAAAA,CAAI;AAChC,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEA;;QAGAY,GAAAA,CAAAA,CAAIT,SAAiB,EAAEU,WAA8B,EAAA;AACnD,YAAA,KAAK,MAAMC,WAAAA,IAAehB,MAAAA,CAAOD,IAAI,CAACgB,WAAAA,CAAAA,CAAc;gBAClD,MAAMZ,OAAAA,GAAUY,WAAW,CAACC,WAAAA,CAAY;gBACxC,MAAMd,GAAAA,GAAMe,aAAaD,WAAAA,EAAaX,SAAAA,CAAAA;gBAEtC,IAAIa,GAAAA,CAAIhB,KAAKL,QAAAA,CAAAA,EAAW;AACtB,oBAAA,MAAM,IAAIsB,KAAAA,CAAM,CAAC,QAAQ,EAAEjB,GAAAA,CAAI,6BAA6B,CAAC,CAAA;AAC/D,gBAAA;gBACAL,QAAQ,CAACK,IAAI,GAAGC,OAAAA;AAClB,YAAA;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEA;;QAGAiB,MAAAA,CAAAA,CAAOlB,GAAgB,EAAEmB,QAAyB,EAAA;AAChD,YAAA,MAAMC,cAAAA,GAAiB,IAAI,CAACrB,GAAG,CAACC,GAAAA,CAAAA;AAEhC,YAAA,IAAI,CAACoB,cAAAA,EAAgB;AACnB,gBAAA,MAAM,IAAIH,KAAAA,CAAM,CAAC,QAAQ,EAAEjB,GAAAA,CAAI,cAAc,CAAC,CAAA;AAChD,YAAA;AAEA,YAAA,MAAMqB,aAAaF,QAAAA,CAASC,cAAAA,CAAAA;YAC5BxB,oBAAoB,CAACI,IAAI,GAAGqB,UAAAA;AAE5B,YAAA,OAAO,IAAI;AACb,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"services.mjs","sources":["../../src/registries/services.ts"],"sourcesContent":["import { has, pickBy } from 'lodash';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ServiceFactory = (params: { strapi: Core.Strapi }) => Core.Service | Core.Service;\nexport type ServiceFactoryMap = Record<string, ServiceFactory>;\nexport type ServiceMap = Record<string, Core.Service>;\nexport type ServiceExtendFn = (service: Core.Service) => Core.Service;\n\nconst servicesRegistry = (strapi: Core.Strapi) => {\n const services: ServiceFactoryMap = {};\n const instantiatedServices: ServiceMap = {};\n\n return {\n /**\n * Returns this list of registered services uids\n */\n keys() {\n return Object.keys(services);\n },\n\n /**\n * Returns the instance of a service. Instantiate the service if not already done\n */\n get(uid: UID.Service) {\n if (instantiatedServices[uid]) {\n return instantiatedServices[uid];\n }\n\n const service = services[uid];\n if (service) {\n instantiatedServices[uid] = typeof service === 'function' ? service({ strapi }) : service;\n return instantiatedServices[uid];\n }\n },\n\n /**\n * Returns a map with all the services in a namespace\n */\n getAll(namespace: string): ServiceMap {\n const filteredServices = pickBy(services, (_, uid) => hasNamespace(uid, namespace));\n\n // create lazy accessor to avoid instantiating the services;\n const map = {};\n for (const uid of Object.keys(filteredServices)) {\n Object.defineProperty(map, uid, {\n enumerable: true,\n get: () => {\n return this.get(uid as UID.Service);\n },\n });\n }\n\n return map;\n },\n\n /**\n * Registers a service\n */\n set(uid: string, service: ServiceFactory) {\n services[uid] = service;\n delete instantiatedServices[uid];\n return this;\n },\n\n /**\n * Registers a map of services for a specific namespace\n */\n add(namespace: string, newServices: ServiceFactoryMap) {\n for (const serviceName of Object.keys(newServices)) {\n const service = newServices[serviceName];\n const uid = addNamespace(serviceName, namespace);\n\n if (has(services, uid)) {\n throw new Error(`Service ${uid} has already been registered.`);\n }\n services[uid] = service;\n }\n\n return this;\n },\n\n /**\n * Wraps a service to extend it\n */\n extend(uid: UID.Service, extendFn: ServiceExtendFn) {\n const currentService = this.get(uid);\n\n if (!currentService) {\n throw new Error(`Service ${uid} doesn't exist`);\n }\n\n const newService = extendFn(currentService);\n instantiatedServices[uid] = newService;\n\n return this;\n },\n };\n};\n\nexport default servicesRegistry;\n"],"names":["servicesRegistry","strapi","services","instantiatedServices","keys","Object","get","uid","service","getAll","namespace","filteredServices","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","add","newServices","serviceName","addNamespace","has","Error","extend","extendFn","currentService","newService"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var assert = require('assert/strict');
4
- var fp = require('lodash/fp');
4
+ var _ = require('lodash');
5
5
  var strapiUtils = require('@strapi/utils');
6
6
 
7
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -10,9 +10,9 @@ var assert__default = /*#__PURE__*/_interopDefault(assert);
10
10
 
11
11
  const INVALID_STRATEGY_MSG = 'Invalid auth strategy. Expecting an object with properties {name: string, authenticate: function, verify: function}';
12
12
  const validStrategy = (strategy)=>{
13
- assert__default.default(fp.has('authenticate', strategy), INVALID_STRATEGY_MSG);
13
+ assert__default.default(_.has(strategy, 'authenticate'), INVALID_STRATEGY_MSG);
14
14
  assert__default.default(typeof strategy.authenticate === 'function', INVALID_STRATEGY_MSG);
15
- if (fp.has('verify', strategy)) {
15
+ if (_.has(strategy, 'verify')) {
16
16
  assert__default.default(typeof strategy.verify === 'function', INVALID_STRATEGY_MSG);
17
17
  }
18
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/auth/index.ts"],"sourcesContent":["import assert from 'assert/strict';\nimport { has } from 'lodash/fp';\n\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport type { ParameterizedContext } from 'koa';\n\ninterface AuthenticationResponse {\n authenticated?: boolean;\n credentials?: unknown;\n ability?: unknown;\n error?: Error | null;\n}\n\ninterface AuthenticationInfo {\n strategy: Strategy;\n credentials: unknown;\n ability: unknown;\n}\n\ninterface Strategy {\n name: string;\n authenticate: (ctx: ParameterizedContext) => Promise<AuthenticationResponse>;\n verify?: (auth: AuthenticationInfo, config: Core.RouteConfig['auth']) => Promise<any>;\n}\n\ninterface Authentication {\n register: (type: string, strategy: Strategy) => Authentication;\n authenticate: Core.MiddlewareHandler;\n verify: (auth: AuthenticationInfo, config?: Core.RouteConfig['auth']) => Promise<any>;\n}\n\nconst INVALID_STRATEGY_MSG =\n 'Invalid auth strategy. Expecting an object with properties {name: string, authenticate: function, verify: function}';\n\nconst validStrategy = (strategy: Strategy) => {\n assert(has('authenticate', strategy), INVALID_STRATEGY_MSG);\n assert(typeof strategy.authenticate === 'function', INVALID_STRATEGY_MSG);\n\n if (has('verify', strategy)) {\n assert(typeof strategy.verify === 'function', INVALID_STRATEGY_MSG);\n }\n};\n\nconst createAuthentication = (): Authentication => {\n const strategies: Record<string, Strategy[]> = {};\n\n return {\n register(type, strategy) {\n validStrategy(strategy);\n\n if (!strategies[type]) {\n strategies[type] = [];\n }\n\n strategies[type].push(strategy);\n\n return this;\n },\n\n async authenticate(ctx, next) {\n const route: Core.Route = ctx.state.route;\n\n // use route strategy\n const config = route?.config?.auth;\n\n if (config === false) {\n return next();\n }\n\n const routeStrategies = route.info.type ? strategies[route.info.type] : [];\n const configStrategies = (config?.strategies ?? routeStrategies ?? []) as Array<\n string | Strategy\n >;\n\n const strategiesToUse: Strategy[] = configStrategies.reduce(\n (acc, strategy: string | Strategy) => {\n // Resolve by strategy name\n if (typeof strategy === 'string') {\n const routeStrategy = routeStrategies.find((rs) => rs.name === strategy);\n\n if (routeStrategy) {\n acc.push(routeStrategy);\n }\n }\n\n // Use the given strategy as is\n else if (typeof strategy === 'object') {\n validStrategy(strategy);\n\n acc.push(strategy);\n }\n\n return acc;\n },\n [] as Strategy[]\n );\n\n for (const strategy of strategiesToUse) {\n const result = await strategy.authenticate(ctx);\n\n const { authenticated = false, credentials, ability = null, error = null } = result || {};\n\n if (error !== null) {\n return ctx.unauthorized(error);\n }\n\n if (authenticated) {\n ctx.state.isAuthenticated = true;\n ctx.state.auth = {\n strategy,\n credentials,\n ability,\n };\n\n return next();\n }\n }\n\n return ctx.unauthorized('Missing or invalid credentials');\n },\n\n async verify(auth, config = {}) {\n if (config === false) {\n return;\n }\n\n if (!auth) {\n throw new errors.UnauthorizedError();\n }\n\n if (typeof auth.strategy.verify === 'function') {\n return auth.strategy.verify(auth, config);\n }\n },\n };\n};\n\nexport default createAuthentication;\n"],"names":["INVALID_STRATEGY_MSG","validStrategy","strategy","assert","has","authenticate","verify","createAuthentication","strategies","register","type","push","ctx","next","route","state","config","auth","routeStrategies","info","configStrategies","strategiesToUse","reduce","acc","routeStrategy","find","rs","name","result","authenticated","credentials","ability","error","unauthorized","isAuthenticated","errors","UnauthorizedError"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/auth/index.ts"],"sourcesContent":["import assert from 'assert/strict';\nimport { has } from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport type { ParameterizedContext } from 'koa';\n\ninterface AuthenticationResponse {\n authenticated?: boolean;\n credentials?: unknown;\n ability?: unknown;\n error?: Error | null;\n}\n\ninterface AuthenticationInfo {\n strategy: Strategy;\n credentials: unknown;\n ability: unknown;\n}\n\ninterface Strategy {\n name: string;\n authenticate: (ctx: ParameterizedContext) => Promise<AuthenticationResponse>;\n verify?: (auth: AuthenticationInfo, config: Core.RouteConfig['auth']) => Promise<any>;\n}\n\ninterface Authentication {\n register: (type: string, strategy: Strategy) => Authentication;\n authenticate: Core.MiddlewareHandler;\n verify: (auth: AuthenticationInfo, config?: Core.RouteConfig['auth']) => Promise<any>;\n}\n\nconst INVALID_STRATEGY_MSG =\n 'Invalid auth strategy. Expecting an object with properties {name: string, authenticate: function, verify: function}';\n\nconst validStrategy = (strategy: Strategy) => {\n assert(has(strategy, 'authenticate'), INVALID_STRATEGY_MSG);\n assert(typeof strategy.authenticate === 'function', INVALID_STRATEGY_MSG);\n\n if (has(strategy, 'verify')) {\n assert(typeof strategy.verify === 'function', INVALID_STRATEGY_MSG);\n }\n};\n\nconst createAuthentication = (): Authentication => {\n const strategies: Record<string, Strategy[]> = {};\n\n return {\n register(type, strategy) {\n validStrategy(strategy);\n\n if (!strategies[type]) {\n strategies[type] = [];\n }\n\n strategies[type].push(strategy);\n\n return this;\n },\n\n async authenticate(ctx, next) {\n const route: Core.Route = ctx.state.route;\n\n // use route strategy\n const config = route?.config?.auth;\n\n if (config === false) {\n return next();\n }\n\n const routeStrategies = route.info.type ? strategies[route.info.type] : [];\n const configStrategies = (config?.strategies ?? routeStrategies ?? []) as Array<\n string | Strategy\n >;\n\n const strategiesToUse: Strategy[] = configStrategies.reduce(\n (acc, strategy: string | Strategy) => {\n // Resolve by strategy name\n if (typeof strategy === 'string') {\n const routeStrategy = routeStrategies.find((rs) => rs.name === strategy);\n\n if (routeStrategy) {\n acc.push(routeStrategy);\n }\n }\n\n // Use the given strategy as is\n else if (typeof strategy === 'object') {\n validStrategy(strategy);\n\n acc.push(strategy);\n }\n\n return acc;\n },\n [] as Strategy[]\n );\n\n for (const strategy of strategiesToUse) {\n const result = await strategy.authenticate(ctx);\n\n const { authenticated = false, credentials, ability = null, error = null } = result || {};\n\n if (error !== null) {\n return ctx.unauthorized(error);\n }\n\n if (authenticated) {\n ctx.state.isAuthenticated = true;\n ctx.state.auth = {\n strategy,\n credentials,\n ability,\n };\n\n return next();\n }\n }\n\n return ctx.unauthorized('Missing or invalid credentials');\n },\n\n async verify(auth, config = {}) {\n if (config === false) {\n return;\n }\n\n if (!auth) {\n throw new errors.UnauthorizedError();\n }\n\n if (typeof auth.strategy.verify === 'function') {\n return auth.strategy.verify(auth, config);\n }\n },\n };\n};\n\nexport default createAuthentication;\n"],"names":["INVALID_STRATEGY_MSG","validStrategy","strategy","assert","has","authenticate","verify","createAuthentication","strategies","register","type","push","ctx","next","route","state","config","auth","routeStrategies","info","configStrategies","strategiesToUse","reduce","acc","routeStrategy","find","rs","name","result","authenticated","credentials","ability","error","unauthorized","isAuthenticated","errors","UnauthorizedError"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import assert from 'assert/strict';
2
- import { has } from 'lodash/fp';
2
+ import { has } from 'lodash';
3
3
  import { errors } from '@strapi/utils';
4
4
 
5
5
  const INVALID_STRATEGY_MSG = 'Invalid auth strategy. Expecting an object with properties {name: string, authenticate: function, verify: function}';
6
6
  const validStrategy = (strategy)=>{
7
- assert(has('authenticate', strategy), INVALID_STRATEGY_MSG);
7
+ assert(has(strategy, 'authenticate'), INVALID_STRATEGY_MSG);
8
8
  assert(typeof strategy.authenticate === 'function', INVALID_STRATEGY_MSG);
9
- if (has('verify', strategy)) {
9
+ if (has(strategy, 'verify')) {
10
10
  assert(typeof strategy.verify === 'function', INVALID_STRATEGY_MSG);
11
11
  }
12
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/auth/index.ts"],"sourcesContent":["import assert from 'assert/strict';\nimport { has } from 'lodash/fp';\n\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport type { ParameterizedContext } from 'koa';\n\ninterface AuthenticationResponse {\n authenticated?: boolean;\n credentials?: unknown;\n ability?: unknown;\n error?: Error | null;\n}\n\ninterface AuthenticationInfo {\n strategy: Strategy;\n credentials: unknown;\n ability: unknown;\n}\n\ninterface Strategy {\n name: string;\n authenticate: (ctx: ParameterizedContext) => Promise<AuthenticationResponse>;\n verify?: (auth: AuthenticationInfo, config: Core.RouteConfig['auth']) => Promise<any>;\n}\n\ninterface Authentication {\n register: (type: string, strategy: Strategy) => Authentication;\n authenticate: Core.MiddlewareHandler;\n verify: (auth: AuthenticationInfo, config?: Core.RouteConfig['auth']) => Promise<any>;\n}\n\nconst INVALID_STRATEGY_MSG =\n 'Invalid auth strategy. Expecting an object with properties {name: string, authenticate: function, verify: function}';\n\nconst validStrategy = (strategy: Strategy) => {\n assert(has('authenticate', strategy), INVALID_STRATEGY_MSG);\n assert(typeof strategy.authenticate === 'function', INVALID_STRATEGY_MSG);\n\n if (has('verify', strategy)) {\n assert(typeof strategy.verify === 'function', INVALID_STRATEGY_MSG);\n }\n};\n\nconst createAuthentication = (): Authentication => {\n const strategies: Record<string, Strategy[]> = {};\n\n return {\n register(type, strategy) {\n validStrategy(strategy);\n\n if (!strategies[type]) {\n strategies[type] = [];\n }\n\n strategies[type].push(strategy);\n\n return this;\n },\n\n async authenticate(ctx, next) {\n const route: Core.Route = ctx.state.route;\n\n // use route strategy\n const config = route?.config?.auth;\n\n if (config === false) {\n return next();\n }\n\n const routeStrategies = route.info.type ? strategies[route.info.type] : [];\n const configStrategies = (config?.strategies ?? routeStrategies ?? []) as Array<\n string | Strategy\n >;\n\n const strategiesToUse: Strategy[] = configStrategies.reduce(\n (acc, strategy: string | Strategy) => {\n // Resolve by strategy name\n if (typeof strategy === 'string') {\n const routeStrategy = routeStrategies.find((rs) => rs.name === strategy);\n\n if (routeStrategy) {\n acc.push(routeStrategy);\n }\n }\n\n // Use the given strategy as is\n else if (typeof strategy === 'object') {\n validStrategy(strategy);\n\n acc.push(strategy);\n }\n\n return acc;\n },\n [] as Strategy[]\n );\n\n for (const strategy of strategiesToUse) {\n const result = await strategy.authenticate(ctx);\n\n const { authenticated = false, credentials, ability = null, error = null } = result || {};\n\n if (error !== null) {\n return ctx.unauthorized(error);\n }\n\n if (authenticated) {\n ctx.state.isAuthenticated = true;\n ctx.state.auth = {\n strategy,\n credentials,\n ability,\n };\n\n return next();\n }\n }\n\n return ctx.unauthorized('Missing or invalid credentials');\n },\n\n async verify(auth, config = {}) {\n if (config === false) {\n return;\n }\n\n if (!auth) {\n throw new errors.UnauthorizedError();\n }\n\n if (typeof auth.strategy.verify === 'function') {\n return auth.strategy.verify(auth, config);\n }\n },\n };\n};\n\nexport default createAuthentication;\n"],"names":["INVALID_STRATEGY_MSG","validStrategy","strategy","assert","has","authenticate","verify","createAuthentication","strategies","register","type","push","ctx","next","route","state","config","auth","routeStrategies","info","configStrategies","strategiesToUse","reduce","acc","routeStrategy","find","rs","name","result","authenticated","credentials","ability","error","unauthorized","isAuthenticated","errors","UnauthorizedError"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/auth/index.ts"],"sourcesContent":["import assert from 'assert/strict';\nimport { has } from 'lodash';\n\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport type { ParameterizedContext } from 'koa';\n\ninterface AuthenticationResponse {\n authenticated?: boolean;\n credentials?: unknown;\n ability?: unknown;\n error?: Error | null;\n}\n\ninterface AuthenticationInfo {\n strategy: Strategy;\n credentials: unknown;\n ability: unknown;\n}\n\ninterface Strategy {\n name: string;\n authenticate: (ctx: ParameterizedContext) => Promise<AuthenticationResponse>;\n verify?: (auth: AuthenticationInfo, config: Core.RouteConfig['auth']) => Promise<any>;\n}\n\ninterface Authentication {\n register: (type: string, strategy: Strategy) => Authentication;\n authenticate: Core.MiddlewareHandler;\n verify: (auth: AuthenticationInfo, config?: Core.RouteConfig['auth']) => Promise<any>;\n}\n\nconst INVALID_STRATEGY_MSG =\n 'Invalid auth strategy. Expecting an object with properties {name: string, authenticate: function, verify: function}';\n\nconst validStrategy = (strategy: Strategy) => {\n assert(has(strategy, 'authenticate'), INVALID_STRATEGY_MSG);\n assert(typeof strategy.authenticate === 'function', INVALID_STRATEGY_MSG);\n\n if (has(strategy, 'verify')) {\n assert(typeof strategy.verify === 'function', INVALID_STRATEGY_MSG);\n }\n};\n\nconst createAuthentication = (): Authentication => {\n const strategies: Record<string, Strategy[]> = {};\n\n return {\n register(type, strategy) {\n validStrategy(strategy);\n\n if (!strategies[type]) {\n strategies[type] = [];\n }\n\n strategies[type].push(strategy);\n\n return this;\n },\n\n async authenticate(ctx, next) {\n const route: Core.Route = ctx.state.route;\n\n // use route strategy\n const config = route?.config?.auth;\n\n if (config === false) {\n return next();\n }\n\n const routeStrategies = route.info.type ? strategies[route.info.type] : [];\n const configStrategies = (config?.strategies ?? routeStrategies ?? []) as Array<\n string | Strategy\n >;\n\n const strategiesToUse: Strategy[] = configStrategies.reduce(\n (acc, strategy: string | Strategy) => {\n // Resolve by strategy name\n if (typeof strategy === 'string') {\n const routeStrategy = routeStrategies.find((rs) => rs.name === strategy);\n\n if (routeStrategy) {\n acc.push(routeStrategy);\n }\n }\n\n // Use the given strategy as is\n else if (typeof strategy === 'object') {\n validStrategy(strategy);\n\n acc.push(strategy);\n }\n\n return acc;\n },\n [] as Strategy[]\n );\n\n for (const strategy of strategiesToUse) {\n const result = await strategy.authenticate(ctx);\n\n const { authenticated = false, credentials, ability = null, error = null } = result || {};\n\n if (error !== null) {\n return ctx.unauthorized(error);\n }\n\n if (authenticated) {\n ctx.state.isAuthenticated = true;\n ctx.state.auth = {\n strategy,\n credentials,\n ability,\n };\n\n return next();\n }\n }\n\n return ctx.unauthorized('Missing or invalid credentials');\n },\n\n async verify(auth, config = {}) {\n if (config === false) {\n return;\n }\n\n if (!auth) {\n throw new errors.UnauthorizedError();\n }\n\n if (typeof auth.strategy.verify === 'function') {\n return auth.strategy.verify(auth, config);\n }\n },\n };\n};\n\nexport default createAuthentication;\n"],"names":["INVALID_STRATEGY_MSG","validStrategy","strategy","assert","has","authenticate","verify","createAuthentication","strategies","register","type","push","ctx","next","route","state","config","auth","routeStrategies","info","configStrategies","strategiesToUse","reduce","acc","routeStrategy","find","rs","name","result","authenticated","credentials","ability","error","unauthorized","isAuthenticated","errors","UnauthorizedError"],"mappings":"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"}
@@ -16,7 +16,7 @@ const isRecord = (value)=>{
16
16
  };
17
17
  function createContentStructureService(strapi) {
18
18
  /**
19
- * This cache exists to ensure all consumers recieve the same cleaned+resolved data, regardless of call order / invocation relative to the strapi reload.
19
+ * This cache exists to ensure all consumers receive the same cleaned+resolved data, regardless of call order / invocation relative to the strapi reload.
20
20
  */ let cache;
21
21
  const warn = (message)=>{
22
22
  strapi.log.warn(`[content-structure] ${message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/content-structure/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\n\nimport type { Core, Modules, UID } from '@strapi/types';\nimport { isGroupExpressionValid } from './utils/isGroupExpressionValid';\nimport { contentStructureFileSchema } from './validation';\n\nexport const CONTENT_STRUCTURE_FILE_NAME = 'groups.json';\n\nexport const MAX_FOLDER_DEPTH = 3;\n\nexport interface ContentStructureService {\n /**\n * Reads the contents of groups.json directly with minimal sanitization.\n */\n read(): Promise<Modules.ContentStructure.ContentStructureFile | null>;\n\n /**\n * Yields an extremely tolerant version of the groups configuration file. Invalid references are repaired or ignored. Warnings fire for each repair/omission.\n */\n getCleanedFile(): Promise<Modules.ContentStructure.ContentStructureFile | null>;\n\n /**\n * Returns the groups configuration transformed into nested trees.\n */\n resolve(): Promise<Modules.ContentStructure.ResolvedContentStructure>;\n\n /**\n * Writes a new config and invalidates the cache. Does NOT perform validation - this is\n * left to the caller. The Save that triggers the write restarts the server via the\n * standard update-schema flow, which reloads the file; this method only persists it.\n */\n write(structure: Modules.ContentStructure.ContentStructureFile): Promise<void>;\n\n /**\n * Strictly validates an unknown value against the canonical groups.json schema; throws if invalid.\n */\n validate(value: unknown): Modules.ContentStructure.ContentStructureFile;\n\n /**\n * Invalidates the cached parsed groups.json file.\n */\n invalidate(): void;\n\n /**\n * Total number of groups across both sections of the cleaned file.\n */\n countGroups(): Promise<number>;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\ntype ContentStructureCache = Promise<{\n cleaned: Modules.ContentStructure.ContentStructureFile | null;\n resolved: Modules.ContentStructure.ResolvedContentStructure;\n}>;\n\nexport function createContentStructureService(strapi: Core.Strapi): ContentStructureService {\n /**\n * This cache exists to ensure all consumers recieve the same cleaned+resolved data, regardless of call order / invocation relative to the strapi reload.\n */\n let cache: ContentStructureCache | undefined;\n\n const warn = (message: string) => {\n strapi.log.warn(`[content-structure] ${message}`);\n };\n\n const cleanSection = (\n rawSection: unknown,\n sectionKey: Modules.ContentStructure.ContentStructureSectionKey\n ): Modules.ContentStructure.ContentStructureSection => {\n const rawGroups = (() => {\n if (rawSection === undefined || rawSection === null) {\n return [];\n }\n\n if (!isRecord(rawSection) || !Array.isArray(rawSection.groups)) {\n warn(`Section \"${sectionKey}\" is malformed; ignoring it`);\n return [];\n }\n\n return rawSection.groups;\n })();\n\n const seenGroupIds = new Map<string, Modules.ContentStructure.ContentStructureGroup>();\n const groups: Modules.ContentStructure.ContentStructureGroup[] = [];\n\n for (const raw of rawGroups) {\n if (!isGroupExpressionValid(raw)) {\n warn(`Dropping a malformed group entry in section \"${sectionKey}\"`);\n continue;\n }\n\n if (raw.name.trim() === '') {\n warn(`Dropping group \"${raw.id}\" in section \"${sectionKey}\": empty name`);\n continue;\n }\n\n if (seenGroupIds.has(raw.id)) {\n warn(`Dropping duplicate group id \"${raw.id}\" in section \"${sectionKey}\"`);\n continue;\n }\n\n const group: Modules.ContentStructure.ContentStructureGroup = {\n children: raw.children as Modules.ContentStructure.ContentStructureChild[],\n parent: raw.parent,\n name: raw.name,\n id: raw.id,\n };\n\n seenGroupIds.set(group.id, group);\n groups.push(group);\n }\n\n const reparentToRoot = (\n group: Modules.ContentStructure.ContentStructureGroup,\n reason: string\n ) => {\n group.parent = null;\n\n groups.splice(groups.indexOf(group), 1);\n groups.push(group);\n\n warn(`Reparenting group \"${group.id}\" in section \"${sectionKey}\" to root: ${reason}`);\n };\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n if (group.parent !== null && !seenGroupIds.has(group.parent)) {\n reparentToRoot(group, `parent \"${group.parent}\" does not exist`);\n }\n }\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n const chain = new Set([group.id]);\n let current = group;\n\n while (current.parent !== null) {\n if (chain.has(current.parent)) {\n reparentToRoot(group, 'its parent chain contains a cycle');\n break;\n }\n\n chain.add(current.parent);\n current = seenGroupIds.get(current.parent)!;\n }\n }\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n let current = group;\n let depth = 1;\n\n while (current.parent !== null) {\n current = seenGroupIds.get(current.parent)!;\n depth += 1;\n }\n\n if (depth > MAX_FOLDER_DEPTH) {\n reparentToRoot(group, `it exceeds the maximum nesting depth of ${MAX_FOLDER_DEPTH}`);\n }\n }\n\n const expectedKind = sectionKey === 'collectionTypes' ? 'collectionType' : 'singleType';\n const seenGroupChildren = new Set<string>();\n const seenUids = new Set<string>();\n\n for (const group of groups) {\n const cleanedChildren: Modules.ContentStructure.ContentStructureChild[] = [];\n\n for (const entry of group.children) {\n if (!isRecord(entry)) {\n warn(`Dropping a malformed child entry of group \"${group.id}\"`);\n continue;\n }\n\n if (entry.type === 'contentType') {\n const { uid } = entry;\n\n if (typeof uid !== 'string') {\n warn(`Dropping a contentType child of group \"${group.id}\": invalid uid`);\n continue;\n }\n\n const schema: { kind?: string } | undefined = strapi.contentTypes[uid as UID.ContentType];\n\n if (!schema) {\n warn(`Dropping unknown content type \"${uid}\" from group \"${group.id}\"`);\n continue;\n }\n\n // kind is optional on schemas; absent means collectionType.\n const kind = schema.kind ?? 'collectionType';\n\n if (kind !== expectedKind) {\n warn(\n `Dropping content type \"${uid}\" from group \"${group.id}\": its kind \"${kind}\" does not belong in section \"${sectionKey}\"`\n );\n continue;\n }\n\n if (seenUids.has(uid)) {\n warn(`Dropping duplicate reference to content type \"${uid}\" from group \"${group.id}\"`);\n continue;\n }\n\n cleanedChildren.push({ type: 'contentType', uid: uid as UID.ContentType });\n seenUids.add(uid);\n continue;\n }\n\n if (entry.type === 'group') {\n const { id } = entry;\n\n if (typeof id !== 'string') {\n warn(`Dropping a group child of group \"${group.id}\": invalid id`);\n continue;\n }\n\n const target = seenGroupIds.get(id);\n\n if (!target || target.parent !== group.id) {\n warn(`Dropping group child \"${id}\" from group \"${group.id}\": inconsistent reference`);\n continue;\n }\n\n if (seenGroupChildren.has(id)) {\n warn(`Dropping duplicate group child \"${id}\" from group \"${group.id}\"`);\n continue;\n }\n\n cleanedChildren.push({ type: 'group', id });\n seenGroupChildren.add(id);\n continue;\n }\n\n warn(`Dropping a child entry of group \"${group.id}\" with an unknown type`);\n }\n\n group.children = cleanedChildren;\n }\n\n for (const group of groups) {\n if (group.parent !== null && !seenGroupChildren.has(group.id)) {\n const parent = seenGroupIds.get(group.parent)!;\n\n parent.children.push({ type: 'group', id: group.id });\n seenGroupChildren.add(group.id);\n\n warn(\n `Group \"${group.id}\" was missing from the children of its parent \"${parent.id}\"; appended it`\n );\n }\n }\n\n return { groups };\n };\n\n const resolveSection = (\n section: Modules.ContentStructure.ContentStructureSection\n ): Modules.ContentStructure.ResolvedGroupNode[] => {\n const byId = new Map(section.groups.map((group) => [group.id, group]));\n\n const toNode = (\n group: Modules.ContentStructure.ContentStructureGroup\n ): Modules.ContentStructure.ResolvedGroupNode => {\n const cleanedChildren = group.children.map(\n (entry): Modules.ContentStructure.ResolvedStructureChild => {\n if (entry.type === 'contentType') {\n return { type: 'contentType', uid: entry.uid };\n }\n\n return toNode(byId.get(entry.id)!);\n }\n );\n\n return {\n children: cleanedChildren,\n name: group.name,\n type: 'group',\n id: group.id,\n };\n };\n\n return section.groups.filter((group) => group.parent === null).map(toNode);\n };\n\n async function read(): Promise<Modules.ContentStructure.ContentStructureFile | null> {\n const filePath = join(strapi.dirs.dist.contentStructure, CONTENT_STRUCTURE_FILE_NAME);\n\n if (!(await fse.pathExists(filePath))) {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = await fse.readJSON(filePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n strapi.log.error(\n `[content-structure] Could not parse ${filePath} (${message}); continuing without content-type folders`\n );\n\n return null;\n }\n\n if (!isRecord(parsed) || !isRecord(parsed.sections)) {\n strapi.log.error(\n `[content-structure] ${filePath} is not an object with a \"sections\" property; continuing without content-type folders`\n );\n return null;\n }\n\n if (parsed.version !== 1) {\n strapi.log.error(\n `[content-structure] Unknown version \"${parsed.version}\" in ${filePath} (expected 1); continuing without content-type folders`\n );\n return null;\n }\n\n return parsed as unknown as Modules.ContentStructure.ContentStructureFile;\n }\n\n const load = () => {\n if (!cache) {\n cache = (async () => {\n const file = await read();\n\n if (!file) {\n return { cleaned: null, resolved: { collectionTypes: [], singleTypes: [] } };\n }\n\n const cleaned: Modules.ContentStructure.ContentStructureFile = {\n version: 1,\n sections: {\n collectionTypes: cleanSection(file.sections.collectionTypes, 'collectionTypes'),\n singleTypes: cleanSection(file.sections.singleTypes, 'singleTypes'),\n },\n };\n\n return {\n cleaned,\n resolved: {\n collectionTypes: resolveSection(cleaned.sections.collectionTypes),\n singleTypes: resolveSection(cleaned.sections.singleTypes),\n },\n };\n })();\n }\n\n return cache;\n };\n\n function invalidate() {\n cache = undefined;\n }\n\n async function getCleanedFile() {\n return (await load()).cleaned;\n }\n\n async function resolve() {\n return (await load()).resolved;\n }\n\n async function write(structure: Modules.ContentStructure.ContentStructureFile) {\n const dir = strapi.dirs.app.contentStructure;\n\n await fse.ensureDir(dir);\n await fse.writeJSON(join(dir, CONTENT_STRUCTURE_FILE_NAME), structure, { spaces: 2 });\n\n invalidate();\n }\n\n function validate(value: unknown): Modules.ContentStructure.ContentStructureFile {\n return contentStructureFileSchema.parse(value) as Modules.ContentStructure.ContentStructureFile;\n }\n\n async function countGroups() {\n const { cleaned } = await load();\n\n if (!cleaned) {\n return 0;\n }\n\n const collectionTypesCount = cleaned.sections.collectionTypes.groups.length;\n const singleTypesCount = cleaned.sections.singleTypes.groups.length;\n\n return collectionTypesCount + singleTypesCount;\n }\n\n return {\n getCleanedFile,\n countGroups,\n invalidate,\n validate,\n resolve,\n write,\n read,\n };\n}\n"],"names":["CONTENT_STRUCTURE_FILE_NAME","MAX_FOLDER_DEPTH","isRecord","value","Array","isArray","createContentStructureService","strapi","cache","warn","message","log","cleanSection","rawSection","sectionKey","rawGroups","undefined","groups","seenGroupIds","Map","raw","isGroupExpressionValid","name","trim","id","has","group","children","parent","set","push","reparentToRoot","reason","splice","indexOf","chain","Set","current","add","get","depth","expectedKind","seenGroupChildren","seenUids","cleanedChildren","entry","type","uid","schema","contentTypes","kind","target","resolveSection","section","byId","map","toNode","filter","read","filePath","join","dirs","dist","contentStructure","fse","pathExists","parsed","readJSON","error","Error","String","sections","version","load","file","cleaned","resolved","collectionTypes","singleTypes","invalidate","getCleanedFile","resolve","write","structure","dir","app","ensureDir","writeJSON","spaces","validate","contentStructureFileSchema","parse","countGroups","collectionTypesCount","length","singleTypesCount"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/content-structure/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\n\nimport type { Core, Modules, UID } from '@strapi/types';\nimport { isGroupExpressionValid } from './utils/isGroupExpressionValid';\nimport { contentStructureFileSchema } from './validation';\n\nexport const CONTENT_STRUCTURE_FILE_NAME = 'groups.json';\n\nexport const MAX_FOLDER_DEPTH = 3;\n\nexport interface ContentStructureService {\n /**\n * Reads the contents of groups.json directly with minimal sanitization.\n */\n read(): Promise<Modules.ContentStructure.ContentStructureFile | null>;\n\n /**\n * Yields an extremely tolerant version of the groups configuration file. Invalid references are repaired or ignored. Warnings fire for each repair/omission.\n */\n getCleanedFile(): Promise<Modules.ContentStructure.ContentStructureFile | null>;\n\n /**\n * Returns the groups configuration transformed into nested trees.\n */\n resolve(): Promise<Modules.ContentStructure.ResolvedContentStructure>;\n\n /**\n * Writes a new config and invalidates the cache. Does NOT perform validation - this is\n * left to the caller. The Save that triggers the write restarts the server via the\n * standard update-schema flow, which reloads the file; this method only persists it.\n */\n write(structure: Modules.ContentStructure.ContentStructureFile): Promise<void>;\n\n /**\n * Strictly validates an unknown value against the canonical groups.json schema; throws if invalid.\n */\n validate(value: unknown): Modules.ContentStructure.ContentStructureFile;\n\n /**\n * Invalidates the cached parsed groups.json file.\n */\n invalidate(): void;\n\n /**\n * Total number of groups across both sections of the cleaned file.\n */\n countGroups(): Promise<number>;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\ntype ContentStructureCache = Promise<{\n cleaned: Modules.ContentStructure.ContentStructureFile | null;\n resolved: Modules.ContentStructure.ResolvedContentStructure;\n}>;\n\nexport function createContentStructureService(strapi: Core.Strapi): ContentStructureService {\n /**\n * This cache exists to ensure all consumers receive the same cleaned+resolved data, regardless of call order / invocation relative to the strapi reload.\n */\n let cache: ContentStructureCache | undefined;\n\n const warn = (message: string) => {\n strapi.log.warn(`[content-structure] ${message}`);\n };\n\n const cleanSection = (\n rawSection: unknown,\n sectionKey: Modules.ContentStructure.ContentStructureSectionKey\n ): Modules.ContentStructure.ContentStructureSection => {\n const rawGroups = (() => {\n if (rawSection === undefined || rawSection === null) {\n return [];\n }\n\n if (!isRecord(rawSection) || !Array.isArray(rawSection.groups)) {\n warn(`Section \"${sectionKey}\" is malformed; ignoring it`);\n return [];\n }\n\n return rawSection.groups;\n })();\n\n const seenGroupIds = new Map<string, Modules.ContentStructure.ContentStructureGroup>();\n const groups: Modules.ContentStructure.ContentStructureGroup[] = [];\n\n for (const raw of rawGroups) {\n if (!isGroupExpressionValid(raw)) {\n warn(`Dropping a malformed group entry in section \"${sectionKey}\"`);\n continue;\n }\n\n if (raw.name.trim() === '') {\n warn(`Dropping group \"${raw.id}\" in section \"${sectionKey}\": empty name`);\n continue;\n }\n\n if (seenGroupIds.has(raw.id)) {\n warn(`Dropping duplicate group id \"${raw.id}\" in section \"${sectionKey}\"`);\n continue;\n }\n\n const group: Modules.ContentStructure.ContentStructureGroup = {\n children: raw.children as Modules.ContentStructure.ContentStructureChild[],\n parent: raw.parent,\n name: raw.name,\n id: raw.id,\n };\n\n seenGroupIds.set(group.id, group);\n groups.push(group);\n }\n\n const reparentToRoot = (\n group: Modules.ContentStructure.ContentStructureGroup,\n reason: string\n ) => {\n group.parent = null;\n\n groups.splice(groups.indexOf(group), 1);\n groups.push(group);\n\n warn(`Reparenting group \"${group.id}\" in section \"${sectionKey}\" to root: ${reason}`);\n };\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n if (group.parent !== null && !seenGroupIds.has(group.parent)) {\n reparentToRoot(group, `parent \"${group.parent}\" does not exist`);\n }\n }\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n const chain = new Set([group.id]);\n let current = group;\n\n while (current.parent !== null) {\n if (chain.has(current.parent)) {\n reparentToRoot(group, 'its parent chain contains a cycle');\n break;\n }\n\n chain.add(current.parent);\n current = seenGroupIds.get(current.parent)!;\n }\n }\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n let current = group;\n let depth = 1;\n\n while (current.parent !== null) {\n current = seenGroupIds.get(current.parent)!;\n depth += 1;\n }\n\n if (depth > MAX_FOLDER_DEPTH) {\n reparentToRoot(group, `it exceeds the maximum nesting depth of ${MAX_FOLDER_DEPTH}`);\n }\n }\n\n const expectedKind = sectionKey === 'collectionTypes' ? 'collectionType' : 'singleType';\n const seenGroupChildren = new Set<string>();\n const seenUids = new Set<string>();\n\n for (const group of groups) {\n const cleanedChildren: Modules.ContentStructure.ContentStructureChild[] = [];\n\n for (const entry of group.children) {\n if (!isRecord(entry)) {\n warn(`Dropping a malformed child entry of group \"${group.id}\"`);\n continue;\n }\n\n if (entry.type === 'contentType') {\n const { uid } = entry;\n\n if (typeof uid !== 'string') {\n warn(`Dropping a contentType child of group \"${group.id}\": invalid uid`);\n continue;\n }\n\n const schema: { kind?: string } | undefined = strapi.contentTypes[uid as UID.ContentType];\n\n if (!schema) {\n warn(`Dropping unknown content type \"${uid}\" from group \"${group.id}\"`);\n continue;\n }\n\n // kind is optional on schemas; absent means collectionType.\n const kind = schema.kind ?? 'collectionType';\n\n if (kind !== expectedKind) {\n warn(\n `Dropping content type \"${uid}\" from group \"${group.id}\": its kind \"${kind}\" does not belong in section \"${sectionKey}\"`\n );\n continue;\n }\n\n if (seenUids.has(uid)) {\n warn(`Dropping duplicate reference to content type \"${uid}\" from group \"${group.id}\"`);\n continue;\n }\n\n cleanedChildren.push({ type: 'contentType', uid: uid as UID.ContentType });\n seenUids.add(uid);\n continue;\n }\n\n if (entry.type === 'group') {\n const { id } = entry;\n\n if (typeof id !== 'string') {\n warn(`Dropping a group child of group \"${group.id}\": invalid id`);\n continue;\n }\n\n const target = seenGroupIds.get(id);\n\n if (!target || target.parent !== group.id) {\n warn(`Dropping group child \"${id}\" from group \"${group.id}\": inconsistent reference`);\n continue;\n }\n\n if (seenGroupChildren.has(id)) {\n warn(`Dropping duplicate group child \"${id}\" from group \"${group.id}\"`);\n continue;\n }\n\n cleanedChildren.push({ type: 'group', id });\n seenGroupChildren.add(id);\n continue;\n }\n\n warn(`Dropping a child entry of group \"${group.id}\" with an unknown type`);\n }\n\n group.children = cleanedChildren;\n }\n\n for (const group of groups) {\n if (group.parent !== null && !seenGroupChildren.has(group.id)) {\n const parent = seenGroupIds.get(group.parent)!;\n\n parent.children.push({ type: 'group', id: group.id });\n seenGroupChildren.add(group.id);\n\n warn(\n `Group \"${group.id}\" was missing from the children of its parent \"${parent.id}\"; appended it`\n );\n }\n }\n\n return { groups };\n };\n\n const resolveSection = (\n section: Modules.ContentStructure.ContentStructureSection\n ): Modules.ContentStructure.ResolvedGroupNode[] => {\n const byId = new Map(section.groups.map((group) => [group.id, group]));\n\n const toNode = (\n group: Modules.ContentStructure.ContentStructureGroup\n ): Modules.ContentStructure.ResolvedGroupNode => {\n const cleanedChildren = group.children.map(\n (entry): Modules.ContentStructure.ResolvedStructureChild => {\n if (entry.type === 'contentType') {\n return { type: 'contentType', uid: entry.uid };\n }\n\n return toNode(byId.get(entry.id)!);\n }\n );\n\n return {\n children: cleanedChildren,\n name: group.name,\n type: 'group',\n id: group.id,\n };\n };\n\n return section.groups.filter((group) => group.parent === null).map(toNode);\n };\n\n async function read(): Promise<Modules.ContentStructure.ContentStructureFile | null> {\n const filePath = join(strapi.dirs.dist.contentStructure, CONTENT_STRUCTURE_FILE_NAME);\n\n if (!(await fse.pathExists(filePath))) {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = await fse.readJSON(filePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n strapi.log.error(\n `[content-structure] Could not parse ${filePath} (${message}); continuing without content-type folders`\n );\n\n return null;\n }\n\n if (!isRecord(parsed) || !isRecord(parsed.sections)) {\n strapi.log.error(\n `[content-structure] ${filePath} is not an object with a \"sections\" property; continuing without content-type folders`\n );\n return null;\n }\n\n if (parsed.version !== 1) {\n strapi.log.error(\n `[content-structure] Unknown version \"${parsed.version}\" in ${filePath} (expected 1); continuing without content-type folders`\n );\n return null;\n }\n\n return parsed as unknown as Modules.ContentStructure.ContentStructureFile;\n }\n\n const load = () => {\n if (!cache) {\n cache = (async () => {\n const file = await read();\n\n if (!file) {\n return { cleaned: null, resolved: { collectionTypes: [], singleTypes: [] } };\n }\n\n const cleaned: Modules.ContentStructure.ContentStructureFile = {\n version: 1,\n sections: {\n collectionTypes: cleanSection(file.sections.collectionTypes, 'collectionTypes'),\n singleTypes: cleanSection(file.sections.singleTypes, 'singleTypes'),\n },\n };\n\n return {\n cleaned,\n resolved: {\n collectionTypes: resolveSection(cleaned.sections.collectionTypes),\n singleTypes: resolveSection(cleaned.sections.singleTypes),\n },\n };\n })();\n }\n\n return cache;\n };\n\n function invalidate() {\n cache = undefined;\n }\n\n async function getCleanedFile() {\n return (await load()).cleaned;\n }\n\n async function resolve() {\n return (await load()).resolved;\n }\n\n async function write(structure: Modules.ContentStructure.ContentStructureFile) {\n const dir = strapi.dirs.app.contentStructure;\n\n await fse.ensureDir(dir);\n await fse.writeJSON(join(dir, CONTENT_STRUCTURE_FILE_NAME), structure, { spaces: 2 });\n\n invalidate();\n }\n\n function validate(value: unknown): Modules.ContentStructure.ContentStructureFile {\n return contentStructureFileSchema.parse(value) as Modules.ContentStructure.ContentStructureFile;\n }\n\n async function countGroups() {\n const { cleaned } = await load();\n\n if (!cleaned) {\n return 0;\n }\n\n const collectionTypesCount = cleaned.sections.collectionTypes.groups.length;\n const singleTypesCount = cleaned.sections.singleTypes.groups.length;\n\n return collectionTypesCount + singleTypesCount;\n }\n\n return {\n getCleanedFile,\n countGroups,\n invalidate,\n validate,\n resolve,\n write,\n read,\n };\n}\n"],"names":["CONTENT_STRUCTURE_FILE_NAME","MAX_FOLDER_DEPTH","isRecord","value","Array","isArray","createContentStructureService","strapi","cache","warn","message","log","cleanSection","rawSection","sectionKey","rawGroups","undefined","groups","seenGroupIds","Map","raw","isGroupExpressionValid","name","trim","id","has","group","children","parent","set","push","reparentToRoot","reason","splice","indexOf","chain","Set","current","add","get","depth","expectedKind","seenGroupChildren","seenUids","cleanedChildren","entry","type","uid","schema","contentTypes","kind","target","resolveSection","section","byId","map","toNode","filter","read","filePath","join","dirs","dist","contentStructure","fse","pathExists","parsed","readJSON","error","Error","String","sections","version","load","file","cleaned","resolved","collectionTypes","singleTypes","invalidate","getCleanedFile","resolve","write","structure","dir","app","ensureDir","writeJSON","spaces","validate","contentStructureFileSchema","parse","countGroups","collectionTypesCount","length","singleTypesCount"],"mappings":"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"}
@@ -10,7 +10,7 @@ const isRecord = (value)=>{
10
10
  };
11
11
  function createContentStructureService(strapi) {
12
12
  /**
13
- * This cache exists to ensure all consumers recieve the same cleaned+resolved data, regardless of call order / invocation relative to the strapi reload.
13
+ * This cache exists to ensure all consumers receive the same cleaned+resolved data, regardless of call order / invocation relative to the strapi reload.
14
14
  */ let cache;
15
15
  const warn = (message)=>{
16
16
  strapi.log.warn(`[content-structure] ${message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/content-structure/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\n\nimport type { Core, Modules, UID } from '@strapi/types';\nimport { isGroupExpressionValid } from './utils/isGroupExpressionValid';\nimport { contentStructureFileSchema } from './validation';\n\nexport const CONTENT_STRUCTURE_FILE_NAME = 'groups.json';\n\nexport const MAX_FOLDER_DEPTH = 3;\n\nexport interface ContentStructureService {\n /**\n * Reads the contents of groups.json directly with minimal sanitization.\n */\n read(): Promise<Modules.ContentStructure.ContentStructureFile | null>;\n\n /**\n * Yields an extremely tolerant version of the groups configuration file. Invalid references are repaired or ignored. Warnings fire for each repair/omission.\n */\n getCleanedFile(): Promise<Modules.ContentStructure.ContentStructureFile | null>;\n\n /**\n * Returns the groups configuration transformed into nested trees.\n */\n resolve(): Promise<Modules.ContentStructure.ResolvedContentStructure>;\n\n /**\n * Writes a new config and invalidates the cache. Does NOT perform validation - this is\n * left to the caller. The Save that triggers the write restarts the server via the\n * standard update-schema flow, which reloads the file; this method only persists it.\n */\n write(structure: Modules.ContentStructure.ContentStructureFile): Promise<void>;\n\n /**\n * Strictly validates an unknown value against the canonical groups.json schema; throws if invalid.\n */\n validate(value: unknown): Modules.ContentStructure.ContentStructureFile;\n\n /**\n * Invalidates the cached parsed groups.json file.\n */\n invalidate(): void;\n\n /**\n * Total number of groups across both sections of the cleaned file.\n */\n countGroups(): Promise<number>;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\ntype ContentStructureCache = Promise<{\n cleaned: Modules.ContentStructure.ContentStructureFile | null;\n resolved: Modules.ContentStructure.ResolvedContentStructure;\n}>;\n\nexport function createContentStructureService(strapi: Core.Strapi): ContentStructureService {\n /**\n * This cache exists to ensure all consumers recieve the same cleaned+resolved data, regardless of call order / invocation relative to the strapi reload.\n */\n let cache: ContentStructureCache | undefined;\n\n const warn = (message: string) => {\n strapi.log.warn(`[content-structure] ${message}`);\n };\n\n const cleanSection = (\n rawSection: unknown,\n sectionKey: Modules.ContentStructure.ContentStructureSectionKey\n ): Modules.ContentStructure.ContentStructureSection => {\n const rawGroups = (() => {\n if (rawSection === undefined || rawSection === null) {\n return [];\n }\n\n if (!isRecord(rawSection) || !Array.isArray(rawSection.groups)) {\n warn(`Section \"${sectionKey}\" is malformed; ignoring it`);\n return [];\n }\n\n return rawSection.groups;\n })();\n\n const seenGroupIds = new Map<string, Modules.ContentStructure.ContentStructureGroup>();\n const groups: Modules.ContentStructure.ContentStructureGroup[] = [];\n\n for (const raw of rawGroups) {\n if (!isGroupExpressionValid(raw)) {\n warn(`Dropping a malformed group entry in section \"${sectionKey}\"`);\n continue;\n }\n\n if (raw.name.trim() === '') {\n warn(`Dropping group \"${raw.id}\" in section \"${sectionKey}\": empty name`);\n continue;\n }\n\n if (seenGroupIds.has(raw.id)) {\n warn(`Dropping duplicate group id \"${raw.id}\" in section \"${sectionKey}\"`);\n continue;\n }\n\n const group: Modules.ContentStructure.ContentStructureGroup = {\n children: raw.children as Modules.ContentStructure.ContentStructureChild[],\n parent: raw.parent,\n name: raw.name,\n id: raw.id,\n };\n\n seenGroupIds.set(group.id, group);\n groups.push(group);\n }\n\n const reparentToRoot = (\n group: Modules.ContentStructure.ContentStructureGroup,\n reason: string\n ) => {\n group.parent = null;\n\n groups.splice(groups.indexOf(group), 1);\n groups.push(group);\n\n warn(`Reparenting group \"${group.id}\" in section \"${sectionKey}\" to root: ${reason}`);\n };\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n if (group.parent !== null && !seenGroupIds.has(group.parent)) {\n reparentToRoot(group, `parent \"${group.parent}\" does not exist`);\n }\n }\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n const chain = new Set([group.id]);\n let current = group;\n\n while (current.parent !== null) {\n if (chain.has(current.parent)) {\n reparentToRoot(group, 'its parent chain contains a cycle');\n break;\n }\n\n chain.add(current.parent);\n current = seenGroupIds.get(current.parent)!;\n }\n }\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n let current = group;\n let depth = 1;\n\n while (current.parent !== null) {\n current = seenGroupIds.get(current.parent)!;\n depth += 1;\n }\n\n if (depth > MAX_FOLDER_DEPTH) {\n reparentToRoot(group, `it exceeds the maximum nesting depth of ${MAX_FOLDER_DEPTH}`);\n }\n }\n\n const expectedKind = sectionKey === 'collectionTypes' ? 'collectionType' : 'singleType';\n const seenGroupChildren = new Set<string>();\n const seenUids = new Set<string>();\n\n for (const group of groups) {\n const cleanedChildren: Modules.ContentStructure.ContentStructureChild[] = [];\n\n for (const entry of group.children) {\n if (!isRecord(entry)) {\n warn(`Dropping a malformed child entry of group \"${group.id}\"`);\n continue;\n }\n\n if (entry.type === 'contentType') {\n const { uid } = entry;\n\n if (typeof uid !== 'string') {\n warn(`Dropping a contentType child of group \"${group.id}\": invalid uid`);\n continue;\n }\n\n const schema: { kind?: string } | undefined = strapi.contentTypes[uid as UID.ContentType];\n\n if (!schema) {\n warn(`Dropping unknown content type \"${uid}\" from group \"${group.id}\"`);\n continue;\n }\n\n // kind is optional on schemas; absent means collectionType.\n const kind = schema.kind ?? 'collectionType';\n\n if (kind !== expectedKind) {\n warn(\n `Dropping content type \"${uid}\" from group \"${group.id}\": its kind \"${kind}\" does not belong in section \"${sectionKey}\"`\n );\n continue;\n }\n\n if (seenUids.has(uid)) {\n warn(`Dropping duplicate reference to content type \"${uid}\" from group \"${group.id}\"`);\n continue;\n }\n\n cleanedChildren.push({ type: 'contentType', uid: uid as UID.ContentType });\n seenUids.add(uid);\n continue;\n }\n\n if (entry.type === 'group') {\n const { id } = entry;\n\n if (typeof id !== 'string') {\n warn(`Dropping a group child of group \"${group.id}\": invalid id`);\n continue;\n }\n\n const target = seenGroupIds.get(id);\n\n if (!target || target.parent !== group.id) {\n warn(`Dropping group child \"${id}\" from group \"${group.id}\": inconsistent reference`);\n continue;\n }\n\n if (seenGroupChildren.has(id)) {\n warn(`Dropping duplicate group child \"${id}\" from group \"${group.id}\"`);\n continue;\n }\n\n cleanedChildren.push({ type: 'group', id });\n seenGroupChildren.add(id);\n continue;\n }\n\n warn(`Dropping a child entry of group \"${group.id}\" with an unknown type`);\n }\n\n group.children = cleanedChildren;\n }\n\n for (const group of groups) {\n if (group.parent !== null && !seenGroupChildren.has(group.id)) {\n const parent = seenGroupIds.get(group.parent)!;\n\n parent.children.push({ type: 'group', id: group.id });\n seenGroupChildren.add(group.id);\n\n warn(\n `Group \"${group.id}\" was missing from the children of its parent \"${parent.id}\"; appended it`\n );\n }\n }\n\n return { groups };\n };\n\n const resolveSection = (\n section: Modules.ContentStructure.ContentStructureSection\n ): Modules.ContentStructure.ResolvedGroupNode[] => {\n const byId = new Map(section.groups.map((group) => [group.id, group]));\n\n const toNode = (\n group: Modules.ContentStructure.ContentStructureGroup\n ): Modules.ContentStructure.ResolvedGroupNode => {\n const cleanedChildren = group.children.map(\n (entry): Modules.ContentStructure.ResolvedStructureChild => {\n if (entry.type === 'contentType') {\n return { type: 'contentType', uid: entry.uid };\n }\n\n return toNode(byId.get(entry.id)!);\n }\n );\n\n return {\n children: cleanedChildren,\n name: group.name,\n type: 'group',\n id: group.id,\n };\n };\n\n return section.groups.filter((group) => group.parent === null).map(toNode);\n };\n\n async function read(): Promise<Modules.ContentStructure.ContentStructureFile | null> {\n const filePath = join(strapi.dirs.dist.contentStructure, CONTENT_STRUCTURE_FILE_NAME);\n\n if (!(await fse.pathExists(filePath))) {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = await fse.readJSON(filePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n strapi.log.error(\n `[content-structure] Could not parse ${filePath} (${message}); continuing without content-type folders`\n );\n\n return null;\n }\n\n if (!isRecord(parsed) || !isRecord(parsed.sections)) {\n strapi.log.error(\n `[content-structure] ${filePath} is not an object with a \"sections\" property; continuing without content-type folders`\n );\n return null;\n }\n\n if (parsed.version !== 1) {\n strapi.log.error(\n `[content-structure] Unknown version \"${parsed.version}\" in ${filePath} (expected 1); continuing without content-type folders`\n );\n return null;\n }\n\n return parsed as unknown as Modules.ContentStructure.ContentStructureFile;\n }\n\n const load = () => {\n if (!cache) {\n cache = (async () => {\n const file = await read();\n\n if (!file) {\n return { cleaned: null, resolved: { collectionTypes: [], singleTypes: [] } };\n }\n\n const cleaned: Modules.ContentStructure.ContentStructureFile = {\n version: 1,\n sections: {\n collectionTypes: cleanSection(file.sections.collectionTypes, 'collectionTypes'),\n singleTypes: cleanSection(file.sections.singleTypes, 'singleTypes'),\n },\n };\n\n return {\n cleaned,\n resolved: {\n collectionTypes: resolveSection(cleaned.sections.collectionTypes),\n singleTypes: resolveSection(cleaned.sections.singleTypes),\n },\n };\n })();\n }\n\n return cache;\n };\n\n function invalidate() {\n cache = undefined;\n }\n\n async function getCleanedFile() {\n return (await load()).cleaned;\n }\n\n async function resolve() {\n return (await load()).resolved;\n }\n\n async function write(structure: Modules.ContentStructure.ContentStructureFile) {\n const dir = strapi.dirs.app.contentStructure;\n\n await fse.ensureDir(dir);\n await fse.writeJSON(join(dir, CONTENT_STRUCTURE_FILE_NAME), structure, { spaces: 2 });\n\n invalidate();\n }\n\n function validate(value: unknown): Modules.ContentStructure.ContentStructureFile {\n return contentStructureFileSchema.parse(value) as Modules.ContentStructure.ContentStructureFile;\n }\n\n async function countGroups() {\n const { cleaned } = await load();\n\n if (!cleaned) {\n return 0;\n }\n\n const collectionTypesCount = cleaned.sections.collectionTypes.groups.length;\n const singleTypesCount = cleaned.sections.singleTypes.groups.length;\n\n return collectionTypesCount + singleTypesCount;\n }\n\n return {\n getCleanedFile,\n countGroups,\n invalidate,\n validate,\n resolve,\n write,\n read,\n };\n}\n"],"names":["CONTENT_STRUCTURE_FILE_NAME","MAX_FOLDER_DEPTH","isRecord","value","Array","isArray","createContentStructureService","strapi","cache","warn","message","log","cleanSection","rawSection","sectionKey","rawGroups","undefined","groups","seenGroupIds","Map","raw","isGroupExpressionValid","name","trim","id","has","group","children","parent","set","push","reparentToRoot","reason","splice","indexOf","chain","Set","current","add","get","depth","expectedKind","seenGroupChildren","seenUids","cleanedChildren","entry","type","uid","schema","contentTypes","kind","target","resolveSection","section","byId","map","toNode","filter","read","filePath","join","dirs","dist","contentStructure","fse","pathExists","parsed","readJSON","error","Error","String","sections","version","load","file","cleaned","resolved","collectionTypes","singleTypes","invalidate","getCleanedFile","resolve","write","structure","dir","app","ensureDir","writeJSON","spaces","validate","contentStructureFileSchema","parse","countGroups","collectionTypesCount","length","singleTypesCount"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/content-structure/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\n\nimport type { Core, Modules, UID } from '@strapi/types';\nimport { isGroupExpressionValid } from './utils/isGroupExpressionValid';\nimport { contentStructureFileSchema } from './validation';\n\nexport const CONTENT_STRUCTURE_FILE_NAME = 'groups.json';\n\nexport const MAX_FOLDER_DEPTH = 3;\n\nexport interface ContentStructureService {\n /**\n * Reads the contents of groups.json directly with minimal sanitization.\n */\n read(): Promise<Modules.ContentStructure.ContentStructureFile | null>;\n\n /**\n * Yields an extremely tolerant version of the groups configuration file. Invalid references are repaired or ignored. Warnings fire for each repair/omission.\n */\n getCleanedFile(): Promise<Modules.ContentStructure.ContentStructureFile | null>;\n\n /**\n * Returns the groups configuration transformed into nested trees.\n */\n resolve(): Promise<Modules.ContentStructure.ResolvedContentStructure>;\n\n /**\n * Writes a new config and invalidates the cache. Does NOT perform validation - this is\n * left to the caller. The Save that triggers the write restarts the server via the\n * standard update-schema flow, which reloads the file; this method only persists it.\n */\n write(structure: Modules.ContentStructure.ContentStructureFile): Promise<void>;\n\n /**\n * Strictly validates an unknown value against the canonical groups.json schema; throws if invalid.\n */\n validate(value: unknown): Modules.ContentStructure.ContentStructureFile;\n\n /**\n * Invalidates the cached parsed groups.json file.\n */\n invalidate(): void;\n\n /**\n * Total number of groups across both sections of the cleaned file.\n */\n countGroups(): Promise<number>;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\ntype ContentStructureCache = Promise<{\n cleaned: Modules.ContentStructure.ContentStructureFile | null;\n resolved: Modules.ContentStructure.ResolvedContentStructure;\n}>;\n\nexport function createContentStructureService(strapi: Core.Strapi): ContentStructureService {\n /**\n * This cache exists to ensure all consumers receive the same cleaned+resolved data, regardless of call order / invocation relative to the strapi reload.\n */\n let cache: ContentStructureCache | undefined;\n\n const warn = (message: string) => {\n strapi.log.warn(`[content-structure] ${message}`);\n };\n\n const cleanSection = (\n rawSection: unknown,\n sectionKey: Modules.ContentStructure.ContentStructureSectionKey\n ): Modules.ContentStructure.ContentStructureSection => {\n const rawGroups = (() => {\n if (rawSection === undefined || rawSection === null) {\n return [];\n }\n\n if (!isRecord(rawSection) || !Array.isArray(rawSection.groups)) {\n warn(`Section \"${sectionKey}\" is malformed; ignoring it`);\n return [];\n }\n\n return rawSection.groups;\n })();\n\n const seenGroupIds = new Map<string, Modules.ContentStructure.ContentStructureGroup>();\n const groups: Modules.ContentStructure.ContentStructureGroup[] = [];\n\n for (const raw of rawGroups) {\n if (!isGroupExpressionValid(raw)) {\n warn(`Dropping a malformed group entry in section \"${sectionKey}\"`);\n continue;\n }\n\n if (raw.name.trim() === '') {\n warn(`Dropping group \"${raw.id}\" in section \"${sectionKey}\": empty name`);\n continue;\n }\n\n if (seenGroupIds.has(raw.id)) {\n warn(`Dropping duplicate group id \"${raw.id}\" in section \"${sectionKey}\"`);\n continue;\n }\n\n const group: Modules.ContentStructure.ContentStructureGroup = {\n children: raw.children as Modules.ContentStructure.ContentStructureChild[],\n parent: raw.parent,\n name: raw.name,\n id: raw.id,\n };\n\n seenGroupIds.set(group.id, group);\n groups.push(group);\n }\n\n const reparentToRoot = (\n group: Modules.ContentStructure.ContentStructureGroup,\n reason: string\n ) => {\n group.parent = null;\n\n groups.splice(groups.indexOf(group), 1);\n groups.push(group);\n\n warn(`Reparenting group \"${group.id}\" in section \"${sectionKey}\" to root: ${reason}`);\n };\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n if (group.parent !== null && !seenGroupIds.has(group.parent)) {\n reparentToRoot(group, `parent \"${group.parent}\" does not exist`);\n }\n }\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n const chain = new Set([group.id]);\n let current = group;\n\n while (current.parent !== null) {\n if (chain.has(current.parent)) {\n reparentToRoot(group, 'its parent chain contains a cycle');\n break;\n }\n\n chain.add(current.parent);\n current = seenGroupIds.get(current.parent)!;\n }\n }\n\n // oxlint-disable-next-line - Duplicating is necessary because the original array is mutated inside the iterator.\n for (const group of [...groups]) {\n let current = group;\n let depth = 1;\n\n while (current.parent !== null) {\n current = seenGroupIds.get(current.parent)!;\n depth += 1;\n }\n\n if (depth > MAX_FOLDER_DEPTH) {\n reparentToRoot(group, `it exceeds the maximum nesting depth of ${MAX_FOLDER_DEPTH}`);\n }\n }\n\n const expectedKind = sectionKey === 'collectionTypes' ? 'collectionType' : 'singleType';\n const seenGroupChildren = new Set<string>();\n const seenUids = new Set<string>();\n\n for (const group of groups) {\n const cleanedChildren: Modules.ContentStructure.ContentStructureChild[] = [];\n\n for (const entry of group.children) {\n if (!isRecord(entry)) {\n warn(`Dropping a malformed child entry of group \"${group.id}\"`);\n continue;\n }\n\n if (entry.type === 'contentType') {\n const { uid } = entry;\n\n if (typeof uid !== 'string') {\n warn(`Dropping a contentType child of group \"${group.id}\": invalid uid`);\n continue;\n }\n\n const schema: { kind?: string } | undefined = strapi.contentTypes[uid as UID.ContentType];\n\n if (!schema) {\n warn(`Dropping unknown content type \"${uid}\" from group \"${group.id}\"`);\n continue;\n }\n\n // kind is optional on schemas; absent means collectionType.\n const kind = schema.kind ?? 'collectionType';\n\n if (kind !== expectedKind) {\n warn(\n `Dropping content type \"${uid}\" from group \"${group.id}\": its kind \"${kind}\" does not belong in section \"${sectionKey}\"`\n );\n continue;\n }\n\n if (seenUids.has(uid)) {\n warn(`Dropping duplicate reference to content type \"${uid}\" from group \"${group.id}\"`);\n continue;\n }\n\n cleanedChildren.push({ type: 'contentType', uid: uid as UID.ContentType });\n seenUids.add(uid);\n continue;\n }\n\n if (entry.type === 'group') {\n const { id } = entry;\n\n if (typeof id !== 'string') {\n warn(`Dropping a group child of group \"${group.id}\": invalid id`);\n continue;\n }\n\n const target = seenGroupIds.get(id);\n\n if (!target || target.parent !== group.id) {\n warn(`Dropping group child \"${id}\" from group \"${group.id}\": inconsistent reference`);\n continue;\n }\n\n if (seenGroupChildren.has(id)) {\n warn(`Dropping duplicate group child \"${id}\" from group \"${group.id}\"`);\n continue;\n }\n\n cleanedChildren.push({ type: 'group', id });\n seenGroupChildren.add(id);\n continue;\n }\n\n warn(`Dropping a child entry of group \"${group.id}\" with an unknown type`);\n }\n\n group.children = cleanedChildren;\n }\n\n for (const group of groups) {\n if (group.parent !== null && !seenGroupChildren.has(group.id)) {\n const parent = seenGroupIds.get(group.parent)!;\n\n parent.children.push({ type: 'group', id: group.id });\n seenGroupChildren.add(group.id);\n\n warn(\n `Group \"${group.id}\" was missing from the children of its parent \"${parent.id}\"; appended it`\n );\n }\n }\n\n return { groups };\n };\n\n const resolveSection = (\n section: Modules.ContentStructure.ContentStructureSection\n ): Modules.ContentStructure.ResolvedGroupNode[] => {\n const byId = new Map(section.groups.map((group) => [group.id, group]));\n\n const toNode = (\n group: Modules.ContentStructure.ContentStructureGroup\n ): Modules.ContentStructure.ResolvedGroupNode => {\n const cleanedChildren = group.children.map(\n (entry): Modules.ContentStructure.ResolvedStructureChild => {\n if (entry.type === 'contentType') {\n return { type: 'contentType', uid: entry.uid };\n }\n\n return toNode(byId.get(entry.id)!);\n }\n );\n\n return {\n children: cleanedChildren,\n name: group.name,\n type: 'group',\n id: group.id,\n };\n };\n\n return section.groups.filter((group) => group.parent === null).map(toNode);\n };\n\n async function read(): Promise<Modules.ContentStructure.ContentStructureFile | null> {\n const filePath = join(strapi.dirs.dist.contentStructure, CONTENT_STRUCTURE_FILE_NAME);\n\n if (!(await fse.pathExists(filePath))) {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = await fse.readJSON(filePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n strapi.log.error(\n `[content-structure] Could not parse ${filePath} (${message}); continuing without content-type folders`\n );\n\n return null;\n }\n\n if (!isRecord(parsed) || !isRecord(parsed.sections)) {\n strapi.log.error(\n `[content-structure] ${filePath} is not an object with a \"sections\" property; continuing without content-type folders`\n );\n return null;\n }\n\n if (parsed.version !== 1) {\n strapi.log.error(\n `[content-structure] Unknown version \"${parsed.version}\" in ${filePath} (expected 1); continuing without content-type folders`\n );\n return null;\n }\n\n return parsed as unknown as Modules.ContentStructure.ContentStructureFile;\n }\n\n const load = () => {\n if (!cache) {\n cache = (async () => {\n const file = await read();\n\n if (!file) {\n return { cleaned: null, resolved: { collectionTypes: [], singleTypes: [] } };\n }\n\n const cleaned: Modules.ContentStructure.ContentStructureFile = {\n version: 1,\n sections: {\n collectionTypes: cleanSection(file.sections.collectionTypes, 'collectionTypes'),\n singleTypes: cleanSection(file.sections.singleTypes, 'singleTypes'),\n },\n };\n\n return {\n cleaned,\n resolved: {\n collectionTypes: resolveSection(cleaned.sections.collectionTypes),\n singleTypes: resolveSection(cleaned.sections.singleTypes),\n },\n };\n })();\n }\n\n return cache;\n };\n\n function invalidate() {\n cache = undefined;\n }\n\n async function getCleanedFile() {\n return (await load()).cleaned;\n }\n\n async function resolve() {\n return (await load()).resolved;\n }\n\n async function write(structure: Modules.ContentStructure.ContentStructureFile) {\n const dir = strapi.dirs.app.contentStructure;\n\n await fse.ensureDir(dir);\n await fse.writeJSON(join(dir, CONTENT_STRUCTURE_FILE_NAME), structure, { spaces: 2 });\n\n invalidate();\n }\n\n function validate(value: unknown): Modules.ContentStructure.ContentStructureFile {\n return contentStructureFileSchema.parse(value) as Modules.ContentStructure.ContentStructureFile;\n }\n\n async function countGroups() {\n const { cleaned } = await load();\n\n if (!cleaned) {\n return 0;\n }\n\n const collectionTypesCount = cleaned.sections.collectionTypes.groups.length;\n const singleTypesCount = cleaned.sections.singleTypes.groups.length;\n\n return collectionTypesCount + singleTypesCount;\n }\n\n return {\n getCleanedFile,\n countGroups,\n invalidate,\n validate,\n resolve,\n write,\n read,\n };\n}\n"],"names":["CONTENT_STRUCTURE_FILE_NAME","MAX_FOLDER_DEPTH","isRecord","value","Array","isArray","createContentStructureService","strapi","cache","warn","message","log","cleanSection","rawSection","sectionKey","rawGroups","undefined","groups","seenGroupIds","Map","raw","isGroupExpressionValid","name","trim","id","has","group","children","parent","set","push","reparentToRoot","reason","splice","indexOf","chain","Set","current","add","get","depth","expectedKind","seenGroupChildren","seenUids","cleanedChildren","entry","type","uid","schema","contentTypes","kind","target","resolveSection","section","byId","map","toNode","filter","read","filePath","join","dirs","dist","contentStructure","fse","pathExists","parsed","readJSON","error","Error","String","sections","version","load","file","cleaned","resolved","collectionTypes","singleTypes","invalidate","getCleanedFile","resolve","write","structure","dir","app","ensureDir","writeJSON","spaces","validate","contentStructureFileSchema","parse","countGroups","collectionTypesCount","length","singleTypesCount"],"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
 
5
5
  const coreStoreModel = {
6
6
  uid: 'strapi::core-store',
@@ -90,7 +90,7 @@ const createCoreStore = ({ db })=>{
90
90
  id: data.id
91
91
  },
92
92
  data: {
93
- value: JSON.stringify(value) || fp.toString(value),
93
+ value: JSON.stringify(value) || _.toString(value),
94
94
  type: typeof value
95
95
  }
96
96
  });
@@ -98,7 +98,7 @@ const createCoreStore = ({ db })=>{
98
98
  return db.query('strapi::core-store').create({
99
99
  data: {
100
100
  ...where,
101
- value: JSON.stringify(value) || fp.toString(value),
101
+ value: JSON.stringify(value) || _.toString(value),
102
102
  type: typeof value
103
103
  }
104
104
  });