@strapi/core 5.56.0 → 5.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) 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 +13 -13
  111. package/dist/package.json.mjs +13 -13
  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/core-store.js +3 -3
  167. package/dist/services/core-store.js.map +1 -1
  168. package/dist/services/core-store.mjs +1 -1
  169. package/dist/services/core-store.mjs.map +1 -1
  170. package/dist/services/cron.d.ts.map +1 -1
  171. package/dist/services/cron.js +2 -4
  172. package/dist/services/cron.js.map +1 -1
  173. package/dist/services/cron.mjs +2 -4
  174. package/dist/services/cron.mjs.map +1 -1
  175. package/dist/services/document-service/attributes/index.js +2 -2
  176. package/dist/services/document-service/attributes/index.js.map +1 -1
  177. package/dist/services/document-service/attributes/index.mjs +1 -1
  178. package/dist/services/document-service/attributes/index.mjs.map +1 -1
  179. package/dist/services/document-service/attributes/transforms.js +3 -3
  180. package/dist/services/document-service/attributes/transforms.js.map +1 -1
  181. package/dist/services/document-service/attributes/transforms.mjs +2 -2
  182. package/dist/services/document-service/attributes/transforms.mjs.map +1 -1
  183. package/dist/services/document-service/components.d.ts.map +1 -1
  184. package/dist/services/document-service/components.js +13 -14
  185. package/dist/services/document-service/components.js.map +1 -1
  186. package/dist/services/document-service/components.mjs +12 -13
  187. package/dist/services/document-service/components.mjs.map +1 -1
  188. package/dist/services/document-service/draft-and-publish.js +65 -38
  189. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  190. package/dist/services/document-service/draft-and-publish.mjs +59 -32
  191. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  192. package/dist/services/document-service/entries.d.ts +2 -2
  193. package/dist/services/document-service/entries.d.ts.map +1 -1
  194. package/dist/services/document-service/entries.js +16 -8
  195. package/dist/services/document-service/entries.js.map +1 -1
  196. package/dist/services/document-service/entries.mjs +17 -9
  197. package/dist/services/document-service/entries.mjs.map +1 -1
  198. package/dist/services/document-service/first-published-at.js +7 -5
  199. package/dist/services/document-service/first-published-at.js.map +1 -1
  200. package/dist/services/document-service/first-published-at.mjs +7 -5
  201. package/dist/services/document-service/first-published-at.mjs.map +1 -1
  202. package/dist/services/document-service/internationalization.d.ts.map +1 -1
  203. package/dist/services/document-service/internationalization.js +37 -28
  204. package/dist/services/document-service/internationalization.js.map +1 -1
  205. package/dist/services/document-service/internationalization.mjs +33 -24
  206. package/dist/services/document-service/internationalization.mjs.map +1 -1
  207. package/dist/services/document-service/params.d.ts +1 -0
  208. package/dist/services/document-service/params.d.ts.map +1 -1
  209. package/dist/services/document-service/params.js +6 -4
  210. package/dist/services/document-service/params.js.map +1 -1
  211. package/dist/services/document-service/params.mjs +6 -5
  212. package/dist/services/document-service/params.mjs.map +1 -1
  213. package/dist/services/document-service/repository.d.ts.map +1 -1
  214. package/dist/services/document-service/repository.js +84 -61
  215. package/dist/services/document-service/repository.js.map +1 -1
  216. package/dist/services/document-service/repository.mjs +47 -24
  217. package/dist/services/document-service/repository.mjs.map +1 -1
  218. package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
  219. package/dist/services/document-service/transform/id-map.js +2 -1
  220. package/dist/services/document-service/transform/id-map.js.map +1 -1
  221. package/dist/services/document-service/transform/id-map.mjs +2 -1
  222. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  223. package/dist/services/document-service/transform/id-transform.js +2 -2
  224. package/dist/services/document-service/transform/id-transform.js.map +1 -1
  225. package/dist/services/document-service/transform/id-transform.mjs +1 -1
  226. package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
  227. package/dist/services/document-service/transform/query.d.ts +3 -1
  228. package/dist/services/document-service/transform/query.d.ts.map +1 -1
  229. package/dist/services/document-service/transform/query.js +12 -6
  230. package/dist/services/document-service/transform/query.js.map +1 -1
  231. package/dist/services/document-service/transform/query.mjs +11 -5
  232. package/dist/services/document-service/transform/query.mjs.map +1 -1
  233. package/dist/services/document-service/transform/relations/extract/data-ids.js +2 -2
  234. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  235. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +1 -1
  236. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  237. package/dist/services/document-service/transform/relations/transform/data-ids.js +2 -2
  238. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  239. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +1 -1
  240. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  241. package/dist/services/document-service/transform/relations/transform/default-locale.js +1 -1
  242. package/dist/services/document-service/transform/relations/transform/default-locale.js.map +1 -1
  243. package/dist/services/document-service/transform/relations/transform/default-locale.mjs +1 -1
  244. package/dist/services/document-service/transform/relations/transform/default-locale.mjs.map +1 -1
  245. package/dist/services/document-service/transform/relations/utils/dp.d.ts.map +1 -1
  246. package/dist/services/document-service/transform/relations/utils/dp.js +1 -2
  247. package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -1
  248. package/dist/services/document-service/transform/relations/utils/dp.mjs +1 -2
  249. package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -1
  250. package/dist/services/document-service/transform/relations/utils/i18n.d.ts +2 -2
  251. package/dist/services/document-service/transform/relations/utils/i18n.d.ts.map +1 -1
  252. package/dist/services/document-service/transform/relations/utils/i18n.js +2 -2
  253. package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -1
  254. package/dist/services/document-service/transform/relations/utils/i18n.mjs +2 -2
  255. package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -1
  256. package/dist/services/document-service/transform/relations/utils/map-relation.js +6 -6
  257. package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
  258. package/dist/services/document-service/transform/relations/utils/map-relation.mjs +3 -3
  259. package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
  260. package/dist/services/document-service/transform/relations/utils/xto-one.js +3 -3
  261. package/dist/services/document-service/transform/relations/utils/xto-one.js.map +1 -1
  262. package/dist/services/document-service/transform/relations/utils/xto-one.mjs +2 -2
  263. package/dist/services/document-service/transform/relations/utils/xto-one.mjs.map +1 -1
  264. package/dist/services/document-service/utils/bidirectional-relations.js +3 -3
  265. package/dist/services/document-service/utils/bidirectional-relations.js.map +1 -1
  266. package/dist/services/document-service/utils/bidirectional-relations.mjs +3 -3
  267. package/dist/services/document-service/utils/bidirectional-relations.mjs.map +1 -1
  268. package/dist/services/document-service/utils/clone-relations.js +3 -3
  269. package/dist/services/document-service/utils/clone-relations.js.map +1 -1
  270. package/dist/services/document-service/utils/clone-relations.mjs +3 -3
  271. package/dist/services/document-service/utils/clone-relations.mjs.map +1 -1
  272. package/dist/services/document-service/utils/self-referential-relations.js +4 -4
  273. package/dist/services/document-service/utils/self-referential-relations.js.map +1 -1
  274. package/dist/services/document-service/utils/self-referential-relations.mjs +4 -4
  275. package/dist/services/document-service/utils/self-referential-relations.mjs.map +1 -1
  276. package/dist/services/document-service/utils/unidirectional-relations.js +3 -3
  277. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  278. package/dist/services/document-service/utils/unidirectional-relations.mjs +3 -3
  279. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  280. package/dist/services/entity-validator/index.d.ts.map +1 -1
  281. package/dist/services/entity-validator/index.js +9 -10
  282. package/dist/services/entity-validator/index.js.map +1 -1
  283. package/dist/services/entity-validator/index.mjs +4 -5
  284. package/dist/services/entity-validator/index.mjs.map +1 -1
  285. package/dist/services/localization.d.ts +4 -0
  286. package/dist/services/localization.d.ts.map +1 -0
  287. package/dist/services/localization.js +51 -0
  288. package/dist/services/localization.js.map +1 -0
  289. package/dist/services/localization.mjs +49 -0
  290. package/dist/services/localization.mjs.map +1 -0
  291. package/dist/services/server/compose-endpoint.js +7 -7
  292. package/dist/services/server/compose-endpoint.js.map +1 -1
  293. package/dist/services/server/compose-endpoint.mjs +3 -3
  294. package/dist/services/server/compose-endpoint.mjs.map +1 -1
  295. package/dist/services/server/koa-methods.js +2 -2
  296. package/dist/services/server/koa-methods.js.map +1 -1
  297. package/dist/services/server/koa-methods.mjs +1 -1
  298. package/dist/services/server/koa-methods.mjs.map +1 -1
  299. package/dist/services/server/koa.d.ts.map +1 -1
  300. package/dist/services/server/koa.js +1 -2
  301. package/dist/services/server/koa.js.map +1 -1
  302. package/dist/services/server/koa.mjs +1 -2
  303. package/dist/services/server/koa.mjs.map +1 -1
  304. package/dist/services/server/middleware.d.ts.map +1 -1
  305. package/dist/services/server/middleware.js +1 -2
  306. package/dist/services/server/middleware.js.map +1 -1
  307. package/dist/services/server/middleware.mjs +1 -2
  308. package/dist/services/server/middleware.mjs.map +1 -1
  309. package/dist/services/server/routing.js +2 -2
  310. package/dist/services/server/routing.js.map +1 -1
  311. package/dist/services/server/routing.mjs +2 -2
  312. package/dist/services/server/routing.mjs.map +1 -1
  313. package/dist/services/utils/conditional-fields.d.ts +1 -1
  314. package/dist/services/utils/conditional-fields.d.ts.map +1 -1
  315. package/dist/services/utils/conditional-fields.js +2 -8
  316. package/dist/services/utils/conditional-fields.js.map +1 -1
  317. package/dist/services/utils/conditional-fields.mjs +2 -8
  318. package/dist/services/utils/conditional-fields.mjs.map +1 -1
  319. package/dist/services/utils/dynamic-zones.d.ts.map +1 -1
  320. package/dist/services/utils/dynamic-zones.js +2 -8
  321. package/dist/services/utils/dynamic-zones.js.map +1 -1
  322. package/dist/services/utils/dynamic-zones.mjs +2 -8
  323. package/dist/services/utils/dynamic-zones.mjs.map +1 -1
  324. package/dist/utils/cron.js +2 -2
  325. package/dist/utils/cron.js.map +1 -1
  326. package/dist/utils/cron.mjs +1 -1
  327. package/dist/utils/cron.mjs.map +1 -1
  328. package/dist/utils/filepath-to-prop-path.d.ts.map +1 -1
  329. package/dist/utils/filepath-to-prop-path.js +5 -12
  330. package/dist/utils/filepath-to-prop-path.js.map +1 -1
  331. package/dist/utils/filepath-to-prop-path.mjs +5 -11
  332. package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
  333. package/dist/utils/is-initialized.js +3 -3
  334. package/dist/utils/is-initialized.js.map +1 -1
  335. package/dist/utils/is-initialized.mjs +2 -2
  336. package/dist/utils/is-initialized.mjs.map +1 -1
  337. package/dist/utils/startup-logger.d.ts.map +1 -1
  338. package/dist/utils/startup-logger.js +2 -4
  339. package/dist/utils/startup-logger.js.map +1 -1
  340. package/dist/utils/startup-logger.mjs +2 -3
  341. package/dist/utils/startup-logger.mjs.map +1 -1
  342. package/dist/utils/transform-content-types-to-models.js +4 -4
  343. package/dist/utils/transform-content-types-to-models.js.map +1 -1
  344. package/dist/utils/transform-content-types-to-models.mjs +3 -3
  345. package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
  346. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"transform.mjs","sources":["../../../src/core-api/controller/transform.ts"],"sourcesContent":["import { isNil, isPlainObject } from 'lodash/fp';\nimport type { UID, Struct, Data } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\ntype TransformedEntry = {\n id: string;\n documentId?: Data.DocumentID | null;\n attributes: Record<string, unknown>;\n};\n\ntype TransformedComponent = {\n id: string;\n [key: string]: unknown;\n};\n\ntype Entry = {\n id: string;\n documentId: Data.DocumentID | null;\n [key: string]: Entry | Entry[] | string | number | null | boolean | Date;\n};\n\nfunction isEntry(property: unknown): property is Entry | Entry[] {\n return property === null || isPlainObject(property) || Array.isArray(property);\n}\n\nfunction isDZEntries(property: unknown): property is (Entry & { __component: UID.Component })[] {\n return Array.isArray(property);\n}\n\ninterface TransformOptions {\n contentType?: Struct.ContentTypeSchema | Struct.ComponentSchema;\n /**\n * @deprecated this option is deprecated and will be removed in the next major version\n */\n useJsonAPIFormat?: boolean;\n encodeSourceMaps?: boolean;\n}\n\nconst transformResponse = async (\n resource: any,\n meta: unknown = {},\n opts: TransformOptions = {\n useJsonAPIFormat: false,\n encodeSourceMaps: false,\n }\n) => {\n if (isNil(resource)) {\n return resource;\n }\n\n if (!isPlainObject(resource) && !Array.isArray(resource)) {\n throw new Error('Entry must be an object or an array of objects');\n }\n\n // Transform pipeline functions\n const applyJsonApiFormat = async (data: any) =>\n opts.useJsonAPIFormat ? transformEntry(data, opts?.contentType) : data;\n\n const applySourceMapEncoding = async (data: any) =>\n opts.encodeSourceMaps && opts.contentType\n ? strapi.get('content-source-maps').encodeSourceMaps({ data, schema: opts.contentType })\n : data;\n\n // Process data through transformation pipeline\n const data = await async.pipe(applyJsonApiFormat, applySourceMapEncoding)(resource);\n\n return {\n data,\n meta,\n };\n};\n\nfunction transformComponent<T extends Entry | Entry[] | null>(\n data: T,\n component: Struct.ComponentSchema\n): T extends Entry[] ? TransformedComponent[] : T extends Entry ? TransformedComponent : null;\nfunction transformComponent(\n data: Entry | Entry[] | null,\n component: Struct.ComponentSchema\n): TransformedComponent | TransformedComponent[] | null {\n if (Array.isArray(data)) {\n return data.map((datum) => transformComponent(datum, component));\n }\n\n const res = transformEntry(data, component);\n\n if (isNil(res)) {\n return res;\n }\n\n const { id, attributes } = res;\n return { id, ...attributes };\n}\n\nfunction transformEntry<T extends Entry | Entry[] | null>(\n entry: T,\n type?: Struct.Schema\n): T extends Entry[] ? TransformedEntry[] : T extends Entry ? TransformedEntry : null;\nfunction transformEntry(\n entry: Entry | Entry[] | null,\n type?: Struct.Schema\n): TransformedEntry | TransformedEntry[] | null {\n if (isNil(entry)) {\n return entry;\n }\n\n if (Array.isArray(entry)) {\n return entry.map((singleEntry) => transformEntry(singleEntry, type));\n }\n\n if (!isPlainObject(entry)) {\n throw new Error('Entry must be an object');\n }\n\n const { id, documentId, ...properties } = entry;\n\n const attributeValues: Record<string, unknown> = {};\n\n for (const key of Object.keys(properties)) {\n const property = properties[key];\n const attribute = type && type.attributes[key];\n\n if (attribute && attribute.type === 'relation' && isEntry(property) && 'target' in attribute) {\n const data = transformEntry(property, strapi.contentType(attribute.target));\n\n attributeValues[key] = { data };\n } else if (attribute && attribute.type === 'component' && isEntry(property)) {\n attributeValues[key] = transformComponent(property, strapi.components[attribute.component]);\n } else if (attribute && attribute.type === 'dynamiczone' && isDZEntries(property)) {\n if (isNil(property)) {\n attributeValues[key] = property;\n }\n\n attributeValues[key] = property.map((subProperty) => {\n return transformComponent(subProperty, strapi.components[subProperty.__component]);\n });\n } else if (attribute && attribute.type === 'media' && isEntry(property)) {\n const data = transformEntry(property, strapi.contentType('plugin::upload.file'));\n\n attributeValues[key] = { data };\n } else {\n attributeValues[key] = property;\n }\n }\n\n return {\n id,\n documentId,\n attributes: attributeValues,\n };\n}\n\nexport { transformResponse };\n"],"names":["isEntry","property","isPlainObject","Array","isArray","isDZEntries","transformResponse","resource","meta","opts","useJsonAPIFormat","encodeSourceMaps","isNil","Error","applyJsonApiFormat","data","transformEntry","contentType","applySourceMapEncoding","strapi","get","schema","async","pipe","transformComponent","component","map","datum","res","id","attributes","entry","type","singleEntry","documentId","properties","attributeValues","key","Object","keys","attribute","target","components","subProperty","__component"],"mappings":"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"}
1
+ {"version":3,"file":"transform.mjs","sources":["../../../src/core-api/controller/transform.ts"],"sourcesContent":["import { isPlainObject } from 'lodash';\nimport type { UID, Struct, Data } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\ntype TransformedEntry = {\n id: string;\n documentId?: Data.DocumentID | null;\n attributes: Record<string, unknown>;\n};\n\ntype TransformedComponent = {\n id: string;\n [key: string]: unknown;\n};\n\ntype Entry = {\n id: string;\n documentId: Data.DocumentID | null;\n [key: string]: Entry | Entry[] | string | number | null | boolean | Date;\n};\n\nfunction isEntry(property: unknown): property is Entry | Entry[] {\n return property === null || isPlainObject(property) || Array.isArray(property);\n}\n\nfunction isDZEntries(property: unknown): property is (Entry & { __component: UID.Component })[] {\n return Array.isArray(property);\n}\n\ninterface TransformOptions {\n contentType?: Struct.ContentTypeSchema | Struct.ComponentSchema;\n /**\n * @deprecated this option is deprecated and will be removed in the next major version\n */\n useJsonAPIFormat?: boolean;\n encodeSourceMaps?: boolean;\n}\n\nconst transformResponse = async (\n resource: any,\n meta: unknown = {},\n opts: TransformOptions = {\n useJsonAPIFormat: false,\n encodeSourceMaps: false,\n }\n) => {\n if (resource == null) {\n return resource;\n }\n\n if (!isPlainObject(resource) && !Array.isArray(resource)) {\n throw new Error('Entry must be an object or an array of objects');\n }\n\n // Transform pipeline functions\n const applyJsonApiFormat = async (data: any) =>\n opts.useJsonAPIFormat ? transformEntry(data, opts?.contentType) : data;\n\n const applySourceMapEncoding = async (data: any) =>\n opts.encodeSourceMaps && opts.contentType\n ? strapi.get('content-source-maps').encodeSourceMaps({ data, schema: opts.contentType })\n : data;\n\n // Process data through transformation pipeline\n const data = await async.pipe(applyJsonApiFormat, applySourceMapEncoding)(resource);\n\n return {\n data,\n meta,\n };\n};\n\nfunction transformComponent<T extends Entry | Entry[] | null>(\n data: T,\n component: Struct.ComponentSchema\n): T extends Entry[] ? TransformedComponent[] : T extends Entry ? TransformedComponent : null;\nfunction transformComponent(\n data: Entry | Entry[] | null,\n component: Struct.ComponentSchema\n): TransformedComponent | TransformedComponent[] | null {\n if (Array.isArray(data)) {\n return data.map((datum) => transformComponent(datum, component));\n }\n\n const res = transformEntry(data, component);\n\n if (res == null) {\n return res;\n }\n\n const { id, attributes } = res;\n return { id, ...attributes };\n}\n\nfunction transformEntry<T extends Entry | Entry[] | null>(\n entry: T,\n type?: Struct.Schema\n): T extends Entry[] ? TransformedEntry[] : T extends Entry ? TransformedEntry : null;\nfunction transformEntry(\n entry: Entry | Entry[] | null,\n type?: Struct.Schema\n): TransformedEntry | TransformedEntry[] | null {\n if (entry == null) {\n return entry;\n }\n\n if (Array.isArray(entry)) {\n return entry.map((singleEntry) => transformEntry(singleEntry, type));\n }\n\n if (!isPlainObject(entry)) {\n throw new Error('Entry must be an object');\n }\n\n const { id, documentId, ...properties } = entry;\n\n const attributeValues: Record<string, unknown> = {};\n\n for (const key of Object.keys(properties)) {\n const property = properties[key];\n const attribute = type && type.attributes[key];\n\n if (attribute && attribute.type === 'relation' && isEntry(property) && 'target' in attribute) {\n const data = transformEntry(property, strapi.contentType(attribute.target));\n\n attributeValues[key] = { data };\n } else if (attribute && attribute.type === 'component' && isEntry(property)) {\n attributeValues[key] = transformComponent(property, strapi.components[attribute.component]);\n } else if (attribute && attribute.type === 'dynamiczone' && isDZEntries(property)) {\n if (property == null) {\n attributeValues[key] = property;\n }\n\n attributeValues[key] = property.map((subProperty) => {\n return transformComponent(subProperty, strapi.components[subProperty.__component]);\n });\n } else if (attribute && attribute.type === 'media' && isEntry(property)) {\n const data = transformEntry(property, strapi.contentType('plugin::upload.file'));\n\n attributeValues[key] = { data };\n } else {\n attributeValues[key] = property;\n }\n }\n\n return {\n id,\n documentId,\n attributes: attributeValues,\n };\n}\n\nexport { transformResponse };\n"],"names":["isEntry","property","isPlainObject","Array","isArray","isDZEntries","transformResponse","resource","meta","opts","useJsonAPIFormat","encodeSourceMaps","Error","applyJsonApiFormat","data","transformEntry","contentType","applySourceMapEncoding","strapi","get","schema","async","pipe","transformComponent","component","map","datum","res","id","attributes","entry","type","singleEntry","documentId","properties","attributeValues","key","Object","keys","attribute","target","components","subProperty","__component"],"mappings":"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"}
@@ -208,7 +208,7 @@ const getCollectionTypeRoutes = (schema, strapi1)=>{
208
208
  * no locale param), but the runtime allowlist still allows the key and downstream ignores it.
209
209
  * That is intentional: this drives the route contract/docs; the allowlist drives enforcement.
210
210
  */ const getConditionalQueryParams = (schema)=>{
211
- const isLocalized = strapi.plugin('i18n').service('content-types').isLocalizedContentType(schema);
211
+ const isLocalized = strapi.localization.isLocalizedContentType(schema);
212
212
  const hasDraftAndPublish = strapiUtils.contentTypes.hasDraftAndPublish(schema);
213
213
  return [
214
214
  ...isLocalized ? [
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/core-api/routes/index.ts"],"sourcesContent":["import type { Core, Schema } from '@strapi/types';\n\nimport { contentTypes, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport * as z from 'zod/v4';\nimport type { QueryParam } from './validation/content-type';\n\nimport { CoreContentTypeRouteValidator } from './validation';\n\nexport const createRoutes = ({\n strapi,\n contentType,\n}: {\n strapi: Core.Strapi;\n contentType: Schema.ContentType;\n}) => {\n if (contentTypeUtils.isSingleType(contentType)) {\n return getSingleTypeRoutes(contentType, strapi);\n }\n\n return getCollectionTypeRoutes(contentType, strapi);\n};\n\nconst getSingleTypeRoutes = (\n schema: Schema.ContentType,\n strapi: Core.Strapi\n): Record<string, Partial<Core.Route>> => {\n const { uid, info } = schema;\n\n const validator = new CoreContentTypeRouteValidator(strapi, uid);\n const conditionalQueryParams = getConditionalQueryParams(schema);\n\n return {\n find: {\n method: 'GET',\n path: `/${info.singularName}`,\n handler: `${uid}.find`,\n request: {\n query: validator.queryParams(['fields', 'populate', 'filters', ...conditionalQueryParams]),\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n update: {\n method: 'PUT',\n path: `/${info.singularName}`,\n handler: `${uid}.update`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n body: { 'application/json': validator.partialBody },\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n delete: {\n method: 'DELETE',\n path: `/${info.singularName}`,\n handler: `${uid}.delete`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n };\n};\n\nconst getCollectionTypeRoutes = (\n schema: Schema.ContentType,\n strapi: Core.Strapi\n): Record<string, Partial<Core.Route>> => {\n const { uid, info } = schema;\n\n const validator = new CoreContentTypeRouteValidator(strapi, uid);\n const conditionalQueryParams = getConditionalQueryParams(schema);\n\n return {\n find: {\n method: 'GET',\n path: `/${info.pluralName}`,\n handler: `${uid}.find`,\n request: {\n query: validator.queryParams([\n 'fields',\n 'filters',\n '_q',\n 'pagination',\n 'sort',\n 'populate',\n ...conditionalQueryParams,\n ]),\n },\n response: z.object({ data: validator.documents }),\n config: {},\n },\n findOne: {\n method: 'GET',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.findOne`,\n request: {\n params: { id: validator.documentID },\n query: validator.queryParams([\n 'fields',\n 'populate',\n 'filters',\n 'sort',\n ...conditionalQueryParams,\n ]),\n },\n response: z.object({ data: validator.document }),\n },\n create: {\n method: 'POST',\n path: `/${info.pluralName}`,\n handler: `${uid}.create`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n body: { 'application/json': validator.body },\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n update: {\n method: 'PUT',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.update`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n params: { id: validator.documentID },\n body: { 'application/json': validator.partialBody },\n },\n response: z.object({ data: validator.document }),\n },\n delete: {\n method: 'DELETE',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.delete`,\n request: {\n query: validator.queryParams(['fields', 'populate', 'filters', ...conditionalQueryParams]),\n params: { id: validator.documentID },\n },\n response: z.object({ data: validator.document }),\n },\n };\n};\n\n/**\n * Query params that are conditionally part of this route's contract (and OpenAPI spec)\n * based on the content type: e.g. locale only for localized types, status only for draft & publish.\n *\n * This is separate from the runtime allowlist used when api.rest.strictParams is on\n * (ALLOWED_QUERY_PARAM_KEYS + registerQueryParam in @strapi/utils). That allowlist is global\n * (locale and status are always allowed); validate/sanitize then pass them through and the\n * document service or i18n layer ignores them when not applicable.\n *\n * So the two can differ: a non-localized route will not declare \"locale\" here (OpenAPI says\n * no locale param), but the runtime allowlist still allows the key and downstream ignores it.\n * That is intentional: this drives the route contract/docs; the allowlist drives enforcement.\n */\nconst getConditionalQueryParams = (schema: Schema.ContentType) => {\n const isLocalized = strapi.plugin('i18n').service('content-types').isLocalizedContentType(schema);\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(schema);\n\n return [\n ...(isLocalized ? ['locale'] : []),\n ...(hasDraftAndPublish\n ? [\n 'status',\n 'publicationFilter',\n // Deprecated: replaced by `publicationFilter`; kept for OpenAPI/clients still using the boolean.\n 'hasPublishedVersion',\n ]\n : []),\n ] as QueryParam[];\n};\n"],"names":["createRoutes","strapi","contentType","contentTypeUtils","isSingleType","getSingleTypeRoutes","getCollectionTypeRoutes","schema","uid","info","validator","CoreContentTypeRouteValidator","conditionalQueryParams","getConditionalQueryParams","find","method","path","singularName","handler","request","query","queryParams","response","z","object","data","document","config","update","body","partialBody","delete","pluralName","documents","findOne","params","id","documentID","create","isLocalized","plugin","service","isLocalizedContentType","hasDraftAndPublish","contentTypes"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/core-api/routes/index.ts"],"sourcesContent":["import type { Core, Schema } from '@strapi/types';\n\nimport { contentTypes, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport * as z from 'zod/v4';\nimport type { QueryParam } from './validation/content-type';\n\nimport { CoreContentTypeRouteValidator } from './validation';\n\nexport const createRoutes = ({\n strapi,\n contentType,\n}: {\n strapi: Core.Strapi;\n contentType: Schema.ContentType;\n}) => {\n if (contentTypeUtils.isSingleType(contentType)) {\n return getSingleTypeRoutes(contentType, strapi);\n }\n\n return getCollectionTypeRoutes(contentType, strapi);\n};\n\nconst getSingleTypeRoutes = (\n schema: Schema.ContentType,\n strapi: Core.Strapi\n): Record<string, Partial<Core.Route>> => {\n const { uid, info } = schema;\n\n const validator = new CoreContentTypeRouteValidator(strapi, uid);\n const conditionalQueryParams = getConditionalQueryParams(schema);\n\n return {\n find: {\n method: 'GET',\n path: `/${info.singularName}`,\n handler: `${uid}.find`,\n request: {\n query: validator.queryParams(['fields', 'populate', 'filters', ...conditionalQueryParams]),\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n update: {\n method: 'PUT',\n path: `/${info.singularName}`,\n handler: `${uid}.update`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n body: { 'application/json': validator.partialBody },\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n delete: {\n method: 'DELETE',\n path: `/${info.singularName}`,\n handler: `${uid}.delete`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n };\n};\n\nconst getCollectionTypeRoutes = (\n schema: Schema.ContentType,\n strapi: Core.Strapi\n): Record<string, Partial<Core.Route>> => {\n const { uid, info } = schema;\n\n const validator = new CoreContentTypeRouteValidator(strapi, uid);\n const conditionalQueryParams = getConditionalQueryParams(schema);\n\n return {\n find: {\n method: 'GET',\n path: `/${info.pluralName}`,\n handler: `${uid}.find`,\n request: {\n query: validator.queryParams([\n 'fields',\n 'filters',\n '_q',\n 'pagination',\n 'sort',\n 'populate',\n ...conditionalQueryParams,\n ]),\n },\n response: z.object({ data: validator.documents }),\n config: {},\n },\n findOne: {\n method: 'GET',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.findOne`,\n request: {\n params: { id: validator.documentID },\n query: validator.queryParams([\n 'fields',\n 'populate',\n 'filters',\n 'sort',\n ...conditionalQueryParams,\n ]),\n },\n response: z.object({ data: validator.document }),\n },\n create: {\n method: 'POST',\n path: `/${info.pluralName}`,\n handler: `${uid}.create`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n body: { 'application/json': validator.body },\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n update: {\n method: 'PUT',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.update`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n params: { id: validator.documentID },\n body: { 'application/json': validator.partialBody },\n },\n response: z.object({ data: validator.document }),\n },\n delete: {\n method: 'DELETE',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.delete`,\n request: {\n query: validator.queryParams(['fields', 'populate', 'filters', ...conditionalQueryParams]),\n params: { id: validator.documentID },\n },\n response: z.object({ data: validator.document }),\n },\n };\n};\n\n/**\n * Query params that are conditionally part of this route's contract (and OpenAPI spec)\n * based on the content type: e.g. locale only for localized types, status only for draft & publish.\n *\n * This is separate from the runtime allowlist used when api.rest.strictParams is on\n * (ALLOWED_QUERY_PARAM_KEYS + registerQueryParam in @strapi/utils). That allowlist is global\n * (locale and status are always allowed); validate/sanitize then pass them through and the\n * document service or i18n layer ignores them when not applicable.\n *\n * So the two can differ: a non-localized route will not declare \"locale\" here (OpenAPI says\n * no locale param), but the runtime allowlist still allows the key and downstream ignores it.\n * That is intentional: this drives the route contract/docs; the allowlist drives enforcement.\n */\nconst getConditionalQueryParams = (schema: Schema.ContentType) => {\n const isLocalized = strapi.localization.isLocalizedContentType(schema);\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(schema);\n\n return [\n ...(isLocalized ? ['locale'] : []),\n ...(hasDraftAndPublish\n ? [\n 'status',\n 'publicationFilter',\n // Deprecated: replaced by `publicationFilter`; kept for OpenAPI/clients still using the boolean.\n 'hasPublishedVersion',\n ]\n : []),\n ] as QueryParam[];\n};\n"],"names":["createRoutes","strapi","contentType","contentTypeUtils","isSingleType","getSingleTypeRoutes","getCollectionTypeRoutes","schema","uid","info","validator","CoreContentTypeRouteValidator","conditionalQueryParams","getConditionalQueryParams","find","method","path","singularName","handler","request","query","queryParams","response","z","object","data","document","config","update","body","partialBody","delete","pluralName","documents","findOne","params","id","documentID","create","isLocalized","localization","isLocalizedContentType","hasDraftAndPublish","contentTypes"],"mappings":"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"}
@@ -186,7 +186,7 @@ const getCollectionTypeRoutes = (schema, strapi1)=>{
186
186
  * no locale param), but the runtime allowlist still allows the key and downstream ignores it.
187
187
  * That is intentional: this drives the route contract/docs; the allowlist drives enforcement.
188
188
  */ const getConditionalQueryParams = (schema)=>{
189
- const isLocalized = strapi.plugin('i18n').service('content-types').isLocalizedContentType(schema);
189
+ const isLocalized = strapi.localization.isLocalizedContentType(schema);
190
190
  const hasDraftAndPublish = contentTypes.hasDraftAndPublish(schema);
191
191
  return [
192
192
  ...isLocalized ? [
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/core-api/routes/index.ts"],"sourcesContent":["import type { Core, Schema } from '@strapi/types';\n\nimport { contentTypes, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport * as z from 'zod/v4';\nimport type { QueryParam } from './validation/content-type';\n\nimport { CoreContentTypeRouteValidator } from './validation';\n\nexport const createRoutes = ({\n strapi,\n contentType,\n}: {\n strapi: Core.Strapi;\n contentType: Schema.ContentType;\n}) => {\n if (contentTypeUtils.isSingleType(contentType)) {\n return getSingleTypeRoutes(contentType, strapi);\n }\n\n return getCollectionTypeRoutes(contentType, strapi);\n};\n\nconst getSingleTypeRoutes = (\n schema: Schema.ContentType,\n strapi: Core.Strapi\n): Record<string, Partial<Core.Route>> => {\n const { uid, info } = schema;\n\n const validator = new CoreContentTypeRouteValidator(strapi, uid);\n const conditionalQueryParams = getConditionalQueryParams(schema);\n\n return {\n find: {\n method: 'GET',\n path: `/${info.singularName}`,\n handler: `${uid}.find`,\n request: {\n query: validator.queryParams(['fields', 'populate', 'filters', ...conditionalQueryParams]),\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n update: {\n method: 'PUT',\n path: `/${info.singularName}`,\n handler: `${uid}.update`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n body: { 'application/json': validator.partialBody },\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n delete: {\n method: 'DELETE',\n path: `/${info.singularName}`,\n handler: `${uid}.delete`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n };\n};\n\nconst getCollectionTypeRoutes = (\n schema: Schema.ContentType,\n strapi: Core.Strapi\n): Record<string, Partial<Core.Route>> => {\n const { uid, info } = schema;\n\n const validator = new CoreContentTypeRouteValidator(strapi, uid);\n const conditionalQueryParams = getConditionalQueryParams(schema);\n\n return {\n find: {\n method: 'GET',\n path: `/${info.pluralName}`,\n handler: `${uid}.find`,\n request: {\n query: validator.queryParams([\n 'fields',\n 'filters',\n '_q',\n 'pagination',\n 'sort',\n 'populate',\n ...conditionalQueryParams,\n ]),\n },\n response: z.object({ data: validator.documents }),\n config: {},\n },\n findOne: {\n method: 'GET',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.findOne`,\n request: {\n params: { id: validator.documentID },\n query: validator.queryParams([\n 'fields',\n 'populate',\n 'filters',\n 'sort',\n ...conditionalQueryParams,\n ]),\n },\n response: z.object({ data: validator.document }),\n },\n create: {\n method: 'POST',\n path: `/${info.pluralName}`,\n handler: `${uid}.create`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n body: { 'application/json': validator.body },\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n update: {\n method: 'PUT',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.update`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n params: { id: validator.documentID },\n body: { 'application/json': validator.partialBody },\n },\n response: z.object({ data: validator.document }),\n },\n delete: {\n method: 'DELETE',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.delete`,\n request: {\n query: validator.queryParams(['fields', 'populate', 'filters', ...conditionalQueryParams]),\n params: { id: validator.documentID },\n },\n response: z.object({ data: validator.document }),\n },\n };\n};\n\n/**\n * Query params that are conditionally part of this route's contract (and OpenAPI spec)\n * based on the content type: e.g. locale only for localized types, status only for draft & publish.\n *\n * This is separate from the runtime allowlist used when api.rest.strictParams is on\n * (ALLOWED_QUERY_PARAM_KEYS + registerQueryParam in @strapi/utils). That allowlist is global\n * (locale and status are always allowed); validate/sanitize then pass them through and the\n * document service or i18n layer ignores them when not applicable.\n *\n * So the two can differ: a non-localized route will not declare \"locale\" here (OpenAPI says\n * no locale param), but the runtime allowlist still allows the key and downstream ignores it.\n * That is intentional: this drives the route contract/docs; the allowlist drives enforcement.\n */\nconst getConditionalQueryParams = (schema: Schema.ContentType) => {\n const isLocalized = strapi.plugin('i18n').service('content-types').isLocalizedContentType(schema);\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(schema);\n\n return [\n ...(isLocalized ? ['locale'] : []),\n ...(hasDraftAndPublish\n ? [\n 'status',\n 'publicationFilter',\n // Deprecated: replaced by `publicationFilter`; kept for OpenAPI/clients still using the boolean.\n 'hasPublishedVersion',\n ]\n : []),\n ] as QueryParam[];\n};\n"],"names":["createRoutes","strapi","contentType","contentTypeUtils","isSingleType","getSingleTypeRoutes","getCollectionTypeRoutes","schema","uid","info","validator","CoreContentTypeRouteValidator","conditionalQueryParams","getConditionalQueryParams","find","method","path","singularName","handler","request","query","queryParams","response","z","object","data","document","config","update","body","partialBody","delete","pluralName","documents","findOne","params","id","documentID","create","isLocalized","plugin","service","isLocalizedContentType","hasDraftAndPublish","contentTypes"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/core-api/routes/index.ts"],"sourcesContent":["import type { Core, Schema } from '@strapi/types';\n\nimport { contentTypes, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport * as z from 'zod/v4';\nimport type { QueryParam } from './validation/content-type';\n\nimport { CoreContentTypeRouteValidator } from './validation';\n\nexport const createRoutes = ({\n strapi,\n contentType,\n}: {\n strapi: Core.Strapi;\n contentType: Schema.ContentType;\n}) => {\n if (contentTypeUtils.isSingleType(contentType)) {\n return getSingleTypeRoutes(contentType, strapi);\n }\n\n return getCollectionTypeRoutes(contentType, strapi);\n};\n\nconst getSingleTypeRoutes = (\n schema: Schema.ContentType,\n strapi: Core.Strapi\n): Record<string, Partial<Core.Route>> => {\n const { uid, info } = schema;\n\n const validator = new CoreContentTypeRouteValidator(strapi, uid);\n const conditionalQueryParams = getConditionalQueryParams(schema);\n\n return {\n find: {\n method: 'GET',\n path: `/${info.singularName}`,\n handler: `${uid}.find`,\n request: {\n query: validator.queryParams(['fields', 'populate', 'filters', ...conditionalQueryParams]),\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n update: {\n method: 'PUT',\n path: `/${info.singularName}`,\n handler: `${uid}.update`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n body: { 'application/json': validator.partialBody },\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n delete: {\n method: 'DELETE',\n path: `/${info.singularName}`,\n handler: `${uid}.delete`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n };\n};\n\nconst getCollectionTypeRoutes = (\n schema: Schema.ContentType,\n strapi: Core.Strapi\n): Record<string, Partial<Core.Route>> => {\n const { uid, info } = schema;\n\n const validator = new CoreContentTypeRouteValidator(strapi, uid);\n const conditionalQueryParams = getConditionalQueryParams(schema);\n\n return {\n find: {\n method: 'GET',\n path: `/${info.pluralName}`,\n handler: `${uid}.find`,\n request: {\n query: validator.queryParams([\n 'fields',\n 'filters',\n '_q',\n 'pagination',\n 'sort',\n 'populate',\n ...conditionalQueryParams,\n ]),\n },\n response: z.object({ data: validator.documents }),\n config: {},\n },\n findOne: {\n method: 'GET',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.findOne`,\n request: {\n params: { id: validator.documentID },\n query: validator.queryParams([\n 'fields',\n 'populate',\n 'filters',\n 'sort',\n ...conditionalQueryParams,\n ]),\n },\n response: z.object({ data: validator.document }),\n },\n create: {\n method: 'POST',\n path: `/${info.pluralName}`,\n handler: `${uid}.create`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n body: { 'application/json': validator.body },\n },\n response: z.object({ data: validator.document }),\n config: {},\n },\n update: {\n method: 'PUT',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.update`,\n request: {\n query: validator.queryParams(['fields', 'populate', ...conditionalQueryParams]),\n params: { id: validator.documentID },\n body: { 'application/json': validator.partialBody },\n },\n response: z.object({ data: validator.document }),\n },\n delete: {\n method: 'DELETE',\n path: `/${info.pluralName}/:id`,\n handler: `${uid}.delete`,\n request: {\n query: validator.queryParams(['fields', 'populate', 'filters', ...conditionalQueryParams]),\n params: { id: validator.documentID },\n },\n response: z.object({ data: validator.document }),\n },\n };\n};\n\n/**\n * Query params that are conditionally part of this route's contract (and OpenAPI spec)\n * based on the content type: e.g. locale only for localized types, status only for draft & publish.\n *\n * This is separate from the runtime allowlist used when api.rest.strictParams is on\n * (ALLOWED_QUERY_PARAM_KEYS + registerQueryParam in @strapi/utils). That allowlist is global\n * (locale and status are always allowed); validate/sanitize then pass them through and the\n * document service or i18n layer ignores them when not applicable.\n *\n * So the two can differ: a non-localized route will not declare \"locale\" here (OpenAPI says\n * no locale param), but the runtime allowlist still allows the key and downstream ignores it.\n * That is intentional: this drives the route contract/docs; the allowlist drives enforcement.\n */\nconst getConditionalQueryParams = (schema: Schema.ContentType) => {\n const isLocalized = strapi.localization.isLocalizedContentType(schema);\n const hasDraftAndPublish = contentTypes.hasDraftAndPublish(schema);\n\n return [\n ...(isLocalized ? ['locale'] : []),\n ...(hasDraftAndPublish\n ? [\n 'status',\n 'publicationFilter',\n // Deprecated: replaced by `publicationFilter`; kept for OpenAPI/clients still using the boolean.\n 'hasPublishedVersion',\n ]\n : []),\n ] as QueryParam[];\n};\n"],"names":["createRoutes","strapi","contentType","contentTypeUtils","isSingleType","getSingleTypeRoutes","getCollectionTypeRoutes","schema","uid","info","validator","CoreContentTypeRouteValidator","conditionalQueryParams","getConditionalQueryParams","find","method","path","singularName","handler","request","query","queryParams","response","z","object","data","document","config","update","body","partialBody","delete","pluralName","documents","findOne","params","id","documentID","create","isLocalized","localization","isLocalizedContentType","hasDraftAndPublish","contentTypes"],"mappings":"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"}
@@ -1,18 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var strapiUtils = require('@strapi/utils');
5
5
 
6
6
  /**
7
7
  * Default limit values from config
8
8
  */ const getLimitConfigDefaults = ()=>({
9
- defaultLimit: fp.toNumber(strapi.config.get('api.rest.defaultLimit', 25)),
10
- maxLimit: fp.toNumber(strapi.config.get('api.rest.maxLimit')) || null
9
+ defaultLimit: _.toNumber(strapi.config.get('api.rest.defaultLimit', 25)),
10
+ maxLimit: _.toNumber(strapi.config.get('api.rest.maxLimit')) || null
11
11
  });
12
- const isOffsetPagination = (pagination)=>fp.has('start', pagination) || fp.has('limit', pagination);
13
- const isPagedPagination = (pagination)=>fp.has('page', pagination) || fp.has('pageSize', pagination) || !isOffsetPagination(pagination);
12
+ const isOffsetPagination = (pagination)=>_.has(pagination, 'start') || _.has(pagination, 'limit');
13
+ const isPagedPagination = (pagination)=>_.has(pagination, 'page') || _.has(pagination, 'pageSize') || !isOffsetPagination(pagination);
14
14
  const shouldCount = (params)=>{
15
- if (fp.has('pagination.withCount', params)) {
15
+ if (_.has(params, 'pagination.withCount')) {
16
16
  const withCount = params.pagination?.withCount;
17
17
  if (typeof withCount === 'boolean') {
18
18
  return withCount;
@@ -61,12 +61,12 @@ const getPaginationInfo = (params)=>{
61
61
  const transformPaginationResponse = (paginationInfo, total, isPaged)=>{
62
62
  const transform = isPaged ? strapiUtils.pagination.transformPagedPaginationInfo : strapiUtils.pagination.transformOffsetPaginationInfo;
63
63
  const paginationResponse = transform(paginationInfo, total);
64
- if (fp.isNil(total)) {
64
+ if (total == null) {
65
65
  // Ignore total and pageCount if `total` value is not available.
66
- return fp.omit([
66
+ return _.omit(paginationResponse, [
67
67
  'total',
68
68
  'pageCount'
69
- ], paginationResponse);
69
+ ]);
70
70
  }
71
71
  return paginationResponse;
72
72
  };
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { omit, has, toNumber, isNil } from 'lodash/fp';\n\nimport { errors, pagination } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has('start', pagination) || has('limit', pagination);\n\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has('page', pagination) || has('pageSize', pagination) || !isOffsetPagination(pagination);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has('pagination.withCount', params)) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { start, limit } = pagination.withDefaultPagination(params.pagination || {}, {\n defaults: { offset: { limit: defaultLimit }, page: { pageSize: defaultLimit } },\n maxLimit: maxLimit || -1,\n });\n\n return { start, limit };\n};\n\nconst transformPaginationResponse = (\n paginationInfo: PaginationInfo,\n total: number | undefined,\n isPaged: boolean\n) => {\n const transform = isPaged\n ? pagination.transformPagedPaginationInfo\n : pagination.transformOffsetPaginationInfo;\n\n const paginationResponse = transform(paginationInfo, total!);\n\n if (isNil(total)) {\n // Ignore total and pageCount if `total` value is not available.\n return omit(['total', 'pageCount'], paginationResponse) as ReturnType<typeof transform>;\n }\n\n return paginationResponse;\n};\n\nexport { isPagedPagination, shouldCount, getPaginationInfo, transformPaginationResponse };\n"],"names":["getLimitConfigDefaults","defaultLimit","toNumber","strapi","config","get","maxLimit","isOffsetPagination","pagination","has","isPagedPagination","shouldCount","params","withCount","includes","errors","ValidationError","Boolean","getPaginationInfo","start","limit","withDefaultPagination","defaults","offset","page","pageSize","transformPaginationResponse","paginationInfo","total","isPaged","transform","transformPagedPaginationInfo","transformOffsetPaginationInfo","paginationResponse","isNil","omit"],"mappings":";;;;;AA8BA;;IAGA,MAAMA,sBAAAA,GAAyB,KAAO;AACpCC,QAAAA,YAAAA,EAAcC,YAASC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,uBAAA,EAAyB,EAAA,CAAA,CAAA;AAClEC,QAAAA,QAAAA,EAAUJ,YAASC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,mBAAA,CAAA,CAAA,IAAyB;KAChE,CAAA;AAEA,MAAME,qBAAqB,CAACC,UAAAA,GAC1BC,OAAI,OAAA,EAASD,UAAAA,CAAAA,IAAeC,OAAI,OAAA,EAASD,UAAAA,CAAAA;AAE3C,MAAME,iBAAAA,GAAoB,CAACF,UAAAA,GACzBC,MAAAA,CAAI,MAAA,EAAQD,eAAeC,MAAAA,CAAI,UAAA,EAAYD,UAAAA,CAAAA,IAAe,CAACD,kBAAAA,CAAmBC,UAAAA;AAEhF,MAAMG,cAAc,CAACC,MAAAA,GAAAA;IACnB,IAAIH,MAAAA,CAAI,wBAAwBG,MAAAA,CAAAA,EAAS;QACvC,MAAMC,SAAAA,GAAYD,MAAAA,CAAOJ,UAAU,EAAEK,SAAAA;QAErC,IAAI,OAAOA,cAAc,SAAA,EAAW;YAClC,OAAOA,SAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,cAAc,WAAA,EAAa;YACpC,OAAO,KAAA;AACT,QAAA;QAEA,IAAI;AAAC,YAAA,MAAA;AAAQ,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACC,QAAQ,CAACD,SAAAA,CAAAA,EAAY;YAC7C,OAAO,IAAA;AACT,QAAA;QAEA,IAAI;AAAC,YAAA,OAAA;AAAS,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACC,QAAQ,CAACD,SAAAA,CAAAA,EAAY;YAC9C,OAAO,KAAA;AACT,QAAA;QAEA,MAAM,IAAIE,kBAAAA,CAAOC,eAAe,CAC9B,sEAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,OAAOC,QAAQd,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,oBAAA,EAAsB,IAAA,CAAA,CAAA;AACzD;AAEA,MAAMa,oBAAoB,CAACN,MAAAA,GAAAA;AACzB,IAAA,MAAM,EAAEX,YAAY,EAAEK,QAAQ,EAAE,GAAGN,sBAAAA,EAAAA;AAEnC,IAAA,MAAM,EAAEmB,KAAK,EAAEC,KAAK,EAAE,GAAGZ,sBAAAA,CAAWa,qBAAqB,CAACT,MAAAA,CAAOJ,UAAU,IAAI,EAAC,EAAG;QACjFc,QAAAA,EAAU;YAAEC,MAAAA,EAAQ;gBAAEH,KAAAA,EAAOnB;AAAa,aAAA;YAAGuB,IAAAA,EAAM;gBAAEC,QAAAA,EAAUxB;AAAa;AAAE,SAAA;AAC9EK,QAAAA,QAAAA,EAAUA,YAAY;AACxB,KAAA,CAAA;IAEA,OAAO;AAAEa,QAAAA,KAAAA;AAAOC,QAAAA;AAAM,KAAA;AACxB;AAEA,MAAMM,2BAAAA,GAA8B,CAClCC,cAAAA,EACAC,KAAAA,EACAC,OAAAA,GAAAA;AAEA,IAAA,MAAMC,YAAYD,OAAAA,GACdrB,sBAAAA,CAAWuB,4BAA4B,GACvCvB,uBAAWwB,6BAA6B;IAE5C,MAAMC,kBAAAA,GAAqBH,UAAUH,cAAAA,EAAgBC,KAAAA,CAAAA;AAErD,IAAA,IAAIM,SAAMN,KAAAA,CAAAA,EAAQ;;AAEhB,QAAA,OAAOO,OAAAA,CAAK;AAAC,YAAA,OAAA;AAAS,YAAA;SAAY,EAAEF,kBAAAA,CAAAA;AACtC,IAAA;IAEA,OAAOA,kBAAAA;AACT;;;;;;;"}
1
+ {"version":3,"file":"pagination.js","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { has, omit, toNumber } from 'lodash';\n\nimport { errors, pagination } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has(pagination, 'start') || has(pagination, 'limit');\n\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has(pagination, 'page') || has(pagination, 'pageSize') || !isOffsetPagination(pagination);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has(params, 'pagination.withCount')) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { start, limit } = pagination.withDefaultPagination(params.pagination || {}, {\n defaults: { offset: { limit: defaultLimit }, page: { pageSize: defaultLimit } },\n maxLimit: maxLimit || -1,\n });\n\n return { start, limit };\n};\n\nconst transformPaginationResponse = (\n paginationInfo: PaginationInfo,\n total: number | undefined,\n isPaged: boolean\n) => {\n const transform = isPaged\n ? pagination.transformPagedPaginationInfo\n : pagination.transformOffsetPaginationInfo;\n\n const paginationResponse = transform(paginationInfo, total!);\n\n if (total == null) {\n // Ignore total and pageCount if `total` value is not available.\n return omit(paginationResponse, ['total', 'pageCount']) as ReturnType<typeof transform>;\n }\n\n return paginationResponse;\n};\n\nexport { isPagedPagination, shouldCount, getPaginationInfo, transformPaginationResponse };\n"],"names":["getLimitConfigDefaults","defaultLimit","toNumber","strapi","config","get","maxLimit","isOffsetPagination","pagination","has","isPagedPagination","shouldCount","params","withCount","includes","errors","ValidationError","Boolean","getPaginationInfo","start","limit","withDefaultPagination","defaults","offset","page","pageSize","transformPaginationResponse","paginationInfo","total","isPaged","transform","transformPagedPaginationInfo","transformOffsetPaginationInfo","paginationResponse","omit"],"mappings":";;;;;AA8BA;;IAGA,MAAMA,sBAAAA,GAAyB,KAAO;AACpCC,QAAAA,YAAAA,EAAcC,WAASC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,uBAAA,EAAyB,EAAA,CAAA,CAAA;AAClEC,QAAAA,QAAAA,EAAUJ,WAASC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,mBAAA,CAAA,CAAA,IAAyB;KAChE,CAAA;AAEA,MAAME,qBAAqB,CAACC,UAAAA,GAC1BC,MAAID,UAAAA,EAAY,OAAA,CAAA,IAAYC,MAAID,UAAAA,EAAY,OAAA,CAAA;AAE9C,MAAME,iBAAAA,GAAoB,CAACF,UAAAA,GACzBC,KAAAA,CAAID,UAAAA,EAAY,WAAWC,KAAAA,CAAID,UAAAA,EAAY,UAAA,CAAA,IAAe,CAACD,kBAAAA,CAAmBC,UAAAA;AAEhF,MAAMG,cAAc,CAACC,MAAAA,GAAAA;IACnB,IAAIH,KAAAA,CAAIG,QAAQ,sBAAA,CAAA,EAAyB;QACvC,MAAMC,SAAAA,GAAYD,MAAAA,CAAOJ,UAAU,EAAEK,SAAAA;QAErC,IAAI,OAAOA,cAAc,SAAA,EAAW;YAClC,OAAOA,SAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,cAAc,WAAA,EAAa;YACpC,OAAO,KAAA;AACT,QAAA;QAEA,IAAI;AAAC,YAAA,MAAA;AAAQ,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACC,QAAQ,CAACD,SAAAA,CAAAA,EAAY;YAC7C,OAAO,IAAA;AACT,QAAA;QAEA,IAAI;AAAC,YAAA,OAAA;AAAS,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACC,QAAQ,CAACD,SAAAA,CAAAA,EAAY;YAC9C,OAAO,KAAA;AACT,QAAA;QAEA,MAAM,IAAIE,kBAAAA,CAAOC,eAAe,CAC9B,sEAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,OAAOC,QAAQd,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,oBAAA,EAAsB,IAAA,CAAA,CAAA;AACzD;AAEA,MAAMa,oBAAoB,CAACN,MAAAA,GAAAA;AACzB,IAAA,MAAM,EAAEX,YAAY,EAAEK,QAAQ,EAAE,GAAGN,sBAAAA,EAAAA;AAEnC,IAAA,MAAM,EAAEmB,KAAK,EAAEC,KAAK,EAAE,GAAGZ,sBAAAA,CAAWa,qBAAqB,CAACT,MAAAA,CAAOJ,UAAU,IAAI,EAAC,EAAG;QACjFc,QAAAA,EAAU;YAAEC,MAAAA,EAAQ;gBAAEH,KAAAA,EAAOnB;AAAa,aAAA;YAAGuB,IAAAA,EAAM;gBAAEC,QAAAA,EAAUxB;AAAa;AAAE,SAAA;AAC9EK,QAAAA,QAAAA,EAAUA,YAAY;AACxB,KAAA,CAAA;IAEA,OAAO;AAAEa,QAAAA,KAAAA;AAAOC,QAAAA;AAAM,KAAA;AACxB;AAEA,MAAMM,2BAAAA,GAA8B,CAClCC,cAAAA,EACAC,KAAAA,EACAC,OAAAA,GAAAA;AAEA,IAAA,MAAMC,YAAYD,OAAAA,GACdrB,sBAAAA,CAAWuB,4BAA4B,GACvCvB,uBAAWwB,6BAA6B;IAE5C,MAAMC,kBAAAA,GAAqBH,UAAUH,cAAAA,EAAgBC,KAAAA,CAAAA;AAErD,IAAA,IAAIA,SAAS,IAAA,EAAM;;AAEjB,QAAA,OAAOM,OAAKD,kBAAAA,EAAoB;AAAC,YAAA,OAAA;AAAS,YAAA;AAAY,SAAA,CAAA;AACxD,IAAA;IAEA,OAAOA,kBAAAA;AACT;;;;;;;"}
@@ -1,4 +1,4 @@
1
- import { has, isNil, omit, toNumber } from 'lodash/fp';
1
+ import { has, omit, toNumber } from 'lodash';
2
2
  import { pagination, errors } from '@strapi/utils';
3
3
 
4
4
  /**
@@ -7,10 +7,10 @@ import { pagination, errors } from '@strapi/utils';
7
7
  defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),
8
8
  maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null
9
9
  });
10
- const isOffsetPagination = (pagination)=>has('start', pagination) || has('limit', pagination);
11
- const isPagedPagination = (pagination)=>has('page', pagination) || has('pageSize', pagination) || !isOffsetPagination(pagination);
10
+ const isOffsetPagination = (pagination)=>has(pagination, 'start') || has(pagination, 'limit');
11
+ const isPagedPagination = (pagination)=>has(pagination, 'page') || has(pagination, 'pageSize') || !isOffsetPagination(pagination);
12
12
  const shouldCount = (params)=>{
13
- if (has('pagination.withCount', params)) {
13
+ if (has(params, 'pagination.withCount')) {
14
14
  const withCount = params.pagination?.withCount;
15
15
  if (typeof withCount === 'boolean') {
16
16
  return withCount;
@@ -59,12 +59,12 @@ const getPaginationInfo = (params)=>{
59
59
  const transformPaginationResponse = (paginationInfo, total, isPaged)=>{
60
60
  const transform = isPaged ? pagination.transformPagedPaginationInfo : pagination.transformOffsetPaginationInfo;
61
61
  const paginationResponse = transform(paginationInfo, total);
62
- if (isNil(total)) {
62
+ if (total == null) {
63
63
  // Ignore total and pageCount if `total` value is not available.
64
- return omit([
64
+ return omit(paginationResponse, [
65
65
  'total',
66
66
  'pageCount'
67
- ], paginationResponse);
67
+ ]);
68
68
  }
69
69
  return paginationResponse;
70
70
  };
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.mjs","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { omit, has, toNumber, isNil } from 'lodash/fp';\n\nimport { errors, pagination } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has('start', pagination) || has('limit', pagination);\n\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has('page', pagination) || has('pageSize', pagination) || !isOffsetPagination(pagination);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has('pagination.withCount', params)) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { start, limit } = pagination.withDefaultPagination(params.pagination || {}, {\n defaults: { offset: { limit: defaultLimit }, page: { pageSize: defaultLimit } },\n maxLimit: maxLimit || -1,\n });\n\n return { start, limit };\n};\n\nconst transformPaginationResponse = (\n paginationInfo: PaginationInfo,\n total: number | undefined,\n isPaged: boolean\n) => {\n const transform = isPaged\n ? pagination.transformPagedPaginationInfo\n : pagination.transformOffsetPaginationInfo;\n\n const paginationResponse = transform(paginationInfo, total!);\n\n if (isNil(total)) {\n // Ignore total and pageCount if `total` value is not available.\n return omit(['total', 'pageCount'], paginationResponse) as ReturnType<typeof transform>;\n }\n\n return paginationResponse;\n};\n\nexport { isPagedPagination, shouldCount, getPaginationInfo, transformPaginationResponse };\n"],"names":["getLimitConfigDefaults","defaultLimit","toNumber","strapi","config","get","maxLimit","isOffsetPagination","pagination","has","isPagedPagination","shouldCount","params","withCount","includes","errors","ValidationError","Boolean","getPaginationInfo","start","limit","withDefaultPagination","defaults","offset","page","pageSize","transformPaginationResponse","paginationInfo","total","isPaged","transform","transformPagedPaginationInfo","transformOffsetPaginationInfo","paginationResponse","isNil","omit"],"mappings":";;;AA8BA;;IAGA,MAAMA,sBAAAA,GAAyB,KAAO;AACpCC,QAAAA,YAAAA,EAAcC,SAASC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,uBAAA,EAAyB,EAAA,CAAA,CAAA;AAClEC,QAAAA,QAAAA,EAAUJ,SAASC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,mBAAA,CAAA,CAAA,IAAyB;KAChE,CAAA;AAEA,MAAME,qBAAqB,CAACC,UAAAA,GAC1BC,IAAI,OAAA,EAASD,UAAAA,CAAAA,IAAeC,IAAI,OAAA,EAASD,UAAAA,CAAAA;AAE3C,MAAME,iBAAAA,GAAoB,CAACF,UAAAA,GACzBC,GAAAA,CAAI,MAAA,EAAQD,eAAeC,GAAAA,CAAI,UAAA,EAAYD,UAAAA,CAAAA,IAAe,CAACD,kBAAAA,CAAmBC,UAAAA;AAEhF,MAAMG,cAAc,CAACC,MAAAA,GAAAA;IACnB,IAAIH,GAAAA,CAAI,wBAAwBG,MAAAA,CAAAA,EAAS;QACvC,MAAMC,SAAAA,GAAYD,MAAAA,CAAOJ,UAAU,EAAEK,SAAAA;QAErC,IAAI,OAAOA,cAAc,SAAA,EAAW;YAClC,OAAOA,SAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,cAAc,WAAA,EAAa;YACpC,OAAO,KAAA;AACT,QAAA;QAEA,IAAI;AAAC,YAAA,MAAA;AAAQ,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACC,QAAQ,CAACD,SAAAA,CAAAA,EAAY;YAC7C,OAAO,IAAA;AACT,QAAA;QAEA,IAAI;AAAC,YAAA,OAAA;AAAS,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACC,QAAQ,CAACD,SAAAA,CAAAA,EAAY;YAC9C,OAAO,KAAA;AACT,QAAA;QAEA,MAAM,IAAIE,MAAAA,CAAOC,eAAe,CAC9B,sEAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,OAAOC,QAAQd,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,oBAAA,EAAsB,IAAA,CAAA,CAAA;AACzD;AAEA,MAAMa,oBAAoB,CAACN,MAAAA,GAAAA;AACzB,IAAA,MAAM,EAAEX,YAAY,EAAEK,QAAQ,EAAE,GAAGN,sBAAAA,EAAAA;AAEnC,IAAA,MAAM,EAAEmB,KAAK,EAAEC,KAAK,EAAE,GAAGZ,UAAAA,CAAWa,qBAAqB,CAACT,MAAAA,CAAOJ,UAAU,IAAI,EAAC,EAAG;QACjFc,QAAAA,EAAU;YAAEC,MAAAA,EAAQ;gBAAEH,KAAAA,EAAOnB;AAAa,aAAA;YAAGuB,IAAAA,EAAM;gBAAEC,QAAAA,EAAUxB;AAAa;AAAE,SAAA;AAC9EK,QAAAA,QAAAA,EAAUA,YAAY;AACxB,KAAA,CAAA;IAEA,OAAO;AAAEa,QAAAA,KAAAA;AAAOC,QAAAA;AAAM,KAAA;AACxB;AAEA,MAAMM,2BAAAA,GAA8B,CAClCC,cAAAA,EACAC,KAAAA,EACAC,OAAAA,GAAAA;AAEA,IAAA,MAAMC,YAAYD,OAAAA,GACdrB,UAAAA,CAAWuB,4BAA4B,GACvCvB,WAAWwB,6BAA6B;IAE5C,MAAMC,kBAAAA,GAAqBH,UAAUH,cAAAA,EAAgBC,KAAAA,CAAAA;AAErD,IAAA,IAAIM,MAAMN,KAAAA,CAAAA,EAAQ;;AAEhB,QAAA,OAAOO,IAAAA,CAAK;AAAC,YAAA,OAAA;AAAS,YAAA;SAAY,EAAEF,kBAAAA,CAAAA;AACtC,IAAA;IAEA,OAAOA,kBAAAA;AACT;;;;"}
1
+ {"version":3,"file":"pagination.mjs","sources":["../../../src/core-api/service/pagination.ts"],"sourcesContent":["import { has, omit, toNumber } from 'lodash';\n\nimport { errors, pagination } from '@strapi/utils';\n\ninterface BasePaginationParams {\n withCount?: boolean | 't' | '1' | 'true' | 'f' | '0' | 'false' | 0 | 1;\n}\n\ntype PagedPagination = BasePaginationParams & {\n page?: number;\n pageSize?: number;\n};\n\ntype OffsetPagination = BasePaginationParams & {\n start?: number;\n limit?: number;\n};\n\nexport type PaginationParams = PagedPagination | OffsetPagination;\n\ntype PaginationInfo =\n | {\n page: number;\n pageSize: number;\n }\n | {\n start: number;\n limit: number;\n };\n\n/**\n * Default limit values from config\n */\nconst getLimitConfigDefaults = () => ({\n defaultLimit: toNumber(strapi.config.get('api.rest.defaultLimit', 25)),\n maxLimit: toNumber(strapi.config.get('api.rest.maxLimit')) || null,\n});\n\nconst isOffsetPagination = (pagination?: PaginationParams): pagination is OffsetPagination =>\n has(pagination, 'start') || has(pagination, 'limit');\n\nconst isPagedPagination = (pagination?: PaginationParams): pagination is PagedPagination =>\n has(pagination, 'page') || has(pagination, 'pageSize') || !isOffsetPagination(pagination);\n\nconst shouldCount = (params: { pagination?: PaginationParams }) => {\n if (has(params, 'pagination.withCount')) {\n const withCount = params.pagination?.withCount;\n\n if (typeof withCount === 'boolean') {\n return withCount;\n }\n\n if (typeof withCount === 'undefined') {\n return false;\n }\n\n if (['true', 't', '1', 1].includes(withCount)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(withCount)) {\n return false;\n }\n\n throw new errors.ValidationError(\n 'Invalid withCount parameter. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"'\n );\n }\n\n return Boolean(strapi.config.get('api.rest.withCount', true));\n};\n\nconst getPaginationInfo = (params: { pagination?: PaginationParams }): PaginationInfo => {\n const { defaultLimit, maxLimit } = getLimitConfigDefaults();\n\n const { start, limit } = pagination.withDefaultPagination(params.pagination || {}, {\n defaults: { offset: { limit: defaultLimit }, page: { pageSize: defaultLimit } },\n maxLimit: maxLimit || -1,\n });\n\n return { start, limit };\n};\n\nconst transformPaginationResponse = (\n paginationInfo: PaginationInfo,\n total: number | undefined,\n isPaged: boolean\n) => {\n const transform = isPaged\n ? pagination.transformPagedPaginationInfo\n : pagination.transformOffsetPaginationInfo;\n\n const paginationResponse = transform(paginationInfo, total!);\n\n if (total == null) {\n // Ignore total and pageCount if `total` value is not available.\n return omit(paginationResponse, ['total', 'pageCount']) as ReturnType<typeof transform>;\n }\n\n return paginationResponse;\n};\n\nexport { isPagedPagination, shouldCount, getPaginationInfo, transformPaginationResponse };\n"],"names":["getLimitConfigDefaults","defaultLimit","toNumber","strapi","config","get","maxLimit","isOffsetPagination","pagination","has","isPagedPagination","shouldCount","params","withCount","includes","errors","ValidationError","Boolean","getPaginationInfo","start","limit","withDefaultPagination","defaults","offset","page","pageSize","transformPaginationResponse","paginationInfo","total","isPaged","transform","transformPagedPaginationInfo","transformOffsetPaginationInfo","paginationResponse","omit"],"mappings":";;;AA8BA;;IAGA,MAAMA,sBAAAA,GAAyB,KAAO;AACpCC,QAAAA,YAAAA,EAAcC,SAASC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,uBAAA,EAAyB,EAAA,CAAA,CAAA;AAClEC,QAAAA,QAAAA,EAAUJ,SAASC,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,mBAAA,CAAA,CAAA,IAAyB;KAChE,CAAA;AAEA,MAAME,qBAAqB,CAACC,UAAAA,GAC1BC,IAAID,UAAAA,EAAY,OAAA,CAAA,IAAYC,IAAID,UAAAA,EAAY,OAAA,CAAA;AAE9C,MAAME,iBAAAA,GAAoB,CAACF,UAAAA,GACzBC,GAAAA,CAAID,UAAAA,EAAY,WAAWC,GAAAA,CAAID,UAAAA,EAAY,UAAA,CAAA,IAAe,CAACD,kBAAAA,CAAmBC,UAAAA;AAEhF,MAAMG,cAAc,CAACC,MAAAA,GAAAA;IACnB,IAAIH,GAAAA,CAAIG,QAAQ,sBAAA,CAAA,EAAyB;QACvC,MAAMC,SAAAA,GAAYD,MAAAA,CAAOJ,UAAU,EAAEK,SAAAA;QAErC,IAAI,OAAOA,cAAc,SAAA,EAAW;YAClC,OAAOA,SAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,cAAc,WAAA,EAAa;YACpC,OAAO,KAAA;AACT,QAAA;QAEA,IAAI;AAAC,YAAA,MAAA;AAAQ,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACC,QAAQ,CAACD,SAAAA,CAAAA,EAAY;YAC7C,OAAO,IAAA;AACT,QAAA;QAEA,IAAI;AAAC,YAAA,OAAA;AAAS,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;SAAE,CAACC,QAAQ,CAACD,SAAAA,CAAAA,EAAY;YAC9C,OAAO,KAAA;AACT,QAAA;QAEA,MAAM,IAAIE,MAAAA,CAAOC,eAAe,CAC9B,sEAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,OAAOC,QAAQd,MAAAA,CAAOC,MAAM,CAACC,GAAG,CAAC,oBAAA,EAAsB,IAAA,CAAA,CAAA;AACzD;AAEA,MAAMa,oBAAoB,CAACN,MAAAA,GAAAA;AACzB,IAAA,MAAM,EAAEX,YAAY,EAAEK,QAAQ,EAAE,GAAGN,sBAAAA,EAAAA;AAEnC,IAAA,MAAM,EAAEmB,KAAK,EAAEC,KAAK,EAAE,GAAGZ,UAAAA,CAAWa,qBAAqB,CAACT,MAAAA,CAAOJ,UAAU,IAAI,EAAC,EAAG;QACjFc,QAAAA,EAAU;YAAEC,MAAAA,EAAQ;gBAAEH,KAAAA,EAAOnB;AAAa,aAAA;YAAGuB,IAAAA,EAAM;gBAAEC,QAAAA,EAAUxB;AAAa;AAAE,SAAA;AAC9EK,QAAAA,QAAAA,EAAUA,YAAY;AACxB,KAAA,CAAA;IAEA,OAAO;AAAEa,QAAAA,KAAAA;AAAOC,QAAAA;AAAM,KAAA;AACxB;AAEA,MAAMM,2BAAAA,GAA8B,CAClCC,cAAAA,EACAC,KAAAA,EACAC,OAAAA,GAAAA;AAEA,IAAA,MAAMC,YAAYD,OAAAA,GACdrB,UAAAA,CAAWuB,4BAA4B,GACvCvB,WAAWwB,6BAA6B;IAE5C,MAAMC,kBAAAA,GAAqBH,UAAUH,cAAAA,EAAgBC,KAAAA,CAAAA;AAErD,IAAA,IAAIA,SAAS,IAAA,EAAM;;AAEjB,QAAA,OAAOM,KAAKD,kBAAAA,EAAoB;AAAC,YAAA,OAAA;AAAS,YAAA;AAAY,SAAA,CAAA;AACxD,IAAA;IAEA,OAAOA,kBAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/content-type/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAWF,QAAA,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,YAAY,qBAAqB,oEAqCxE,CAAC;AAwFF,QAAA,MAAM,WAAW,GAAI,QAAQ,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,WAK/D,CAAC;AAqBF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/content-type/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAWF,QAAA,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,YAAY,qBAAqB,oEAqCxE,CAAC;AAwFF,QAAA,MAAM,WAAW,GAAI,QAAQ,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,WAK/D,CAAC;AAqBF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC"}
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
4
3
  var _ = require('lodash');
5
4
  var strapiUtils = require('@strapi/utils');
6
5
  var validator = require('./validator.js');
@@ -19,7 +18,7 @@ const createContentType = (uid, definition)=>{
19
18
  }
20
19
  throw e;
21
20
  }
22
- const { schema, actions, lifecycles } = fp.cloneDeep(definition);
21
+ const { schema, actions, lifecycles } = _.cloneDeep(definition);
23
22
  // general info
24
23
  Object.assign(schema, {
25
24
  uid,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n 'indexes',\n 'foreignKeys',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import _, { cloneDeep } from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n 'indexes',\n 'foreignKeys',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- import { cloneDeep } from 'lodash/fp';
2
- import _ from 'lodash';
1
+ import _, { cloneDeep } from 'lodash';
3
2
  import { contentTypes, yup } from '@strapi/utils';
4
3
  import { validateContentTypeDefinition } from './validator.mjs';
5
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n 'indexes',\n 'foreignKeys',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import _, { cloneDeep } from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n 'indexes',\n 'foreignKeys',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":"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"}
package/dist/ee/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var fetch = require('../utils/fetch.js');
5
5
  var license = require('./license.js');
6
6
  var cron = require('../utils/cron.js');
@@ -17,10 +17,10 @@ const disable = (message)=>{
17
17
  const shouldEmitEvent = ee.enabled !== false;
18
18
  ee.logger?.warn(`${message} Switching to CE.`);
19
19
  // Only keep the license key and isTrial for potential re-enabling during a later check
20
- ee.licenseInfo = fp.pick([
20
+ ee.licenseInfo = _.pick(ee.licenseInfo, [
21
21
  'licenseKey',
22
22
  'isTrial'
23
- ], ee.licenseInfo);
23
+ ]);
24
24
  ee.licenseInfo.isTrial = false;
25
25
  ee.enabled = false;
26
26
  if (shouldEmitEvent) {
@@ -96,7 +96,7 @@ let initialized = false;
96
96
  try {
97
97
  // Verify license and check if its info changed
98
98
  const newLicenseInfo = license.verifyLicense(license$1);
99
- const licenseInfoChanged = !fp.isEqual(newLicenseInfo.features, ee.licenseInfo.features) || newLicenseInfo.seats !== ee.licenseInfo.seats || newLicenseInfo.type !== ee.licenseInfo.type;
99
+ const licenseInfoChanged = !_.isEqual(newLicenseInfo.features, ee.licenseInfo.features) || newLicenseInfo.seats !== ee.licenseInfo.seats || newLicenseInfo.type !== ee.licenseInfo.type;
100
100
  // Store the new license info
101
101
  ee.licenseInfo = newLicenseInfo;
102
102
  const wasEnabled = ee.enabled;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/ee/index.ts"],"sourcesContent":["import { pick, isEqual } from 'lodash/fp';\nimport type { Logger } from '@strapi/logger';\nimport type { Core } from '@strapi/types';\nimport { createStrapiFetch } from '../utils/fetch';\nimport {\n readLicense,\n verifyLicense,\n fetchLicense,\n LicenseCheckError,\n LICENSE_REGISTRY_URI,\n} from './license';\nimport { shiftCronExpression } from '../utils/cron';\n\nconst ONE_MINUTE = 1000 * 60;\n\ninterface EE {\n enabled: boolean;\n licenseInfo: {\n licenseKey?: string;\n features?: Array<{ name: string; [key: string]: any } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n isTrial: boolean;\n subscriptionId?: string;\n planPriceId?: string;\n };\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {\n isTrial: false,\n },\n};\n\nconst disable = (message: string) => {\n // Prevent emitting ee.disable if it was already disabled\n const shouldEmitEvent = ee.enabled !== false;\n\n ee.logger?.warn(`${message} Switching to CE.`);\n // Only keep the license key and isTrial for potential re-enabling during a later check\n ee.licenseInfo = pick(['licenseKey', 'isTrial'], ee.licenseInfo);\n\n ee.licenseInfo.isTrial = false;\n\n ee.enabled = false;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.disable');\n }\n};\n\nconst enable = () => {\n // Prevent emitting ee.enable if it was already enabled\n const shouldEmitEvent = ee.enabled !== true;\n\n ee.enabled = true;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.enable');\n }\n};\n\nlet initialized = false;\n\n/**\n * Optimistically enable EE if the format of the license is valid, only run once.\n */\nconst init = (licenseDir: string, logger?: Logger) => {\n if (initialized) {\n return;\n }\n\n initialized = true;\n ee.logger = logger;\n\n if (process.env.STRAPI_DISABLE_EE?.toLowerCase() === 'true') {\n return;\n }\n\n try {\n const license = process.env.STRAPI_LICENSE || readLicense(licenseDir);\n\n if (license) {\n ee.licenseInfo = verifyLicense(license);\n enable();\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n};\n\n/**\n * Contact the license registry to update the license to its latest state.\n *\n * Store the result in database to avoid unecessary requests, and will fallback to that in case of a network failure.\n */\nconst onlineUpdate = async ({ strapi }: { strapi: Core.Strapi }) => {\n const { get, commit, rollback } = await strapi.db.transaction();\n const transaction = get();\n\n try {\n const storedInfo = await strapi.db\n ?.queryBuilder('strapi::core-store')\n .where({ key: 'ee_information' })\n .select('value')\n .first()\n .transacting(transaction)\n .forUpdate()\n .execute()\n .then((result: any) => (result ? JSON.parse(result.value) : result));\n\n const shouldContactRegistry = (storedInfo?.lastCheckAt ?? 0) < Date.now() - ONE_MINUTE;\n const result: {\n license?: string | null;\n error?: string;\n lastCheckAt?: number;\n } = { lastCheckAt: Date.now() };\n\n const fallback = (error: Error) => {\n if (error instanceof LicenseCheckError && error.shouldFallback && storedInfo?.license) {\n ee.logger?.warn(\n `${error.message} The last stored one will be used as a potential fallback.`\n );\n return storedInfo.license;\n }\n\n result.error = error.message;\n disable(error.message);\n };\n\n if (!ee?.licenseInfo?.licenseKey) {\n throw new Error('Missing license key.');\n }\n\n const license = shouldContactRegistry\n ? await fetchLicense({ strapi }, ee.licenseInfo.licenseKey, strapi.config.get('uuid')).catch(\n fallback\n )\n : storedInfo.license;\n\n if (license) {\n try {\n // Verify license and check if its info changed\n const newLicenseInfo = verifyLicense(license);\n const licenseInfoChanged =\n !isEqual(newLicenseInfo.features, ee.licenseInfo.features) ||\n newLicenseInfo.seats !== ee.licenseInfo.seats ||\n newLicenseInfo.type !== ee.licenseInfo.type;\n\n // Store the new license info\n ee.licenseInfo = newLicenseInfo;\n const wasEnabled = ee.enabled;\n validateInfo();\n\n // Notify EE features\n if (licenseInfoChanged && wasEnabled) {\n strapi.eventHub.emit('ee.update');\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n } else if (!shouldContactRegistry) {\n disable(storedInfo.error);\n }\n\n if (shouldContactRegistry) {\n result.license = license ?? null;\n const query = strapi.db.queryBuilder('strapi::core-store').transacting(transaction);\n\n if (!storedInfo) {\n query.insert({ key: 'ee_information', value: JSON.stringify(result) });\n } else {\n query.update({ value: JSON.stringify(result) }).where({ key: 'ee_information' });\n }\n\n await query.execute();\n }\n\n await commit();\n } catch {\n // Example of errors: SQLite does not support FOR UPDATE\n await rollback();\n }\n};\n\nconst validateInfo = () => {\n if (typeof ee.licenseInfo.expireAt === 'undefined') {\n throw new Error('Missing license key.');\n }\n\n const expirationTime = new Date(ee.licenseInfo.expireAt).getTime();\n\n if (expirationTime < new Date().getTime()) {\n return disable('License expired.');\n }\n\n enable();\n};\n\nconst checkLicense = async ({ strapi }: { strapi: Core.Strapi }) => {\n const shouldStayOffline =\n ee.licenseInfo.type === 'gold' &&\n // This env variable support is temporarily used to ease the migration between online vs offline\n process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true';\n\n if (!shouldStayOffline) {\n await onlineUpdate({ strapi });\n\n strapi.cron.add({\n onlineUpdate: {\n task: () => onlineUpdate({ strapi }),\n options: shiftCronExpression('0 0 */12 * * *'),\n },\n });\n } else {\n if (!ee.licenseInfo.expireAt) {\n return disable('Your license does not have offline support.');\n }\n\n validateInfo();\n }\n};\n\nconst getTrialEndDate = async ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): Promise<{ trialEndsAt: string } | null> => {\n const silentFetch = createStrapiFetch(strapi, {\n logs: false,\n });\n\n const res = await silentFetch(\n `${LICENSE_REGISTRY_URI}/api/licenses/${ee.licenseInfo.licenseKey}/trial-countdown`,\n {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n }\n ).catch(() => {\n throw new LicenseCheckError(\n 'Could not proceed to retrieve the trial time left for your license.',\n true\n );\n });\n\n const data = (await res.json()) as { trialEndsAt: string } | null;\n\n return data;\n};\n\nconst list = () => {\n return (\n ee.licenseInfo.features?.map((feature) =>\n typeof feature === 'object' ? feature : { name: feature }\n ) || []\n );\n};\n\nconst get = (featureName: string) => list().find((feature) => feature.name === featureName);\n\nexport default Object.freeze({\n init,\n checkLicense,\n getTrialEndDate,\n\n get isEE() {\n return ee.enabled;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n get type() {\n return ee.licenseInfo.type;\n },\n\n get isTrial() {\n return ee.licenseInfo.isTrial;\n },\n\n get planPriceId() {\n return ee.licenseInfo.planPriceId;\n },\n\n get subscriptionId() {\n return ee.licenseInfo.subscriptionId;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n});\n"],"names":["ONE_MINUTE","ee","enabled","licenseInfo","isTrial","disable","message","shouldEmitEvent","logger","warn","pick","strapi","eventHub","emit","enable","initialized","init","licenseDir","process","env","STRAPI_DISABLE_EE","toLowerCase","license","STRAPI_LICENSE","readLicense","verifyLicense","error","Error","onlineUpdate","get","commit","rollback","db","transaction","storedInfo","queryBuilder","where","key","select","first","transacting","forUpdate","execute","then","result","JSON","parse","value","shouldContactRegistry","lastCheckAt","Date","now","fallback","LicenseCheckError","shouldFallback","licenseKey","fetchLicense","config","catch","newLicenseInfo","licenseInfoChanged","isEqual","features","seats","type","wasEnabled","validateInfo","query","insert","stringify","update","expireAt","expirationTime","getTime","checkLicense","shouldStayOffline","STRAPI_DISABLE_LICENSE_PING","cron","add","task","options","shiftCronExpression","getTrialEndDate","silentFetch","createStrapiFetch","logs","res","LICENSE_REGISTRY_URI","method","headers","data","json","list","map","feature","name","featureName","find","Object","freeze","isEE","planPriceId","subscriptionId","isEnabled","undefined"],"mappings":";;;;;;;AAaA,MAAMA,aAAa,IAAA,GAAO,EAAA;AAiB1B,MAAMC,EAAAA,GAAS;IACbC,OAAAA,EAAS,KAAA;IACTC,WAAAA,EAAa;QACXC,OAAAA,EAAS;AACX;AACF,CAAA;AAEA,MAAMC,UAAU,CAACC,OAAAA,GAAAA;;IAEf,MAAMC,eAAAA,GAAkBN,EAAAA,CAAGC,OAAO,KAAK,KAAA;AAEvCD,IAAAA,EAAAA,CAAGO,MAAM,EAAEC,IAAAA,CAAK,CAAA,EAAGH,OAAAA,CAAQ,iBAAiB,CAAC,CAAA;;IAE7CL,EAAAA,CAAGE,WAAW,GAAGO,OAAAA,CAAK;AAAC,QAAA,YAAA;AAAc,QAAA;AAAU,KAAA,EAAET,GAAGE,WAAW,CAAA;IAE/DF,EAAAA,CAAGE,WAAW,CAACC,OAAO,GAAG,KAAA;AAEzBH,IAAAA,EAAAA,CAAGC,OAAO,GAAG,KAAA;AAEb,IAAA,IAAIK,eAAAA,EAAiB;;QAEnBI,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAAC,YAAA,CAAA;AACvB,IAAA;AACF,CAAA;AAEA,MAAMC,MAAAA,GAAS,IAAA;;IAEb,MAAMP,eAAAA,GAAkBN,EAAAA,CAAGC,OAAO,KAAK,IAAA;AAEvCD,IAAAA,EAAAA,CAAGC,OAAO,GAAG,IAAA;AAEb,IAAA,IAAIK,eAAAA,EAAiB;;QAEnBI,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAAC,WAAA,CAAA;AACvB,IAAA;AACF,CAAA;AAEA,IAAIE,WAAAA,GAAc,KAAA;AAElB;;IAGA,MAAMC,IAAAA,GAAO,CAACC,UAAAA,EAAoBT,MAAAA,GAAAA;AAChC,IAAA,IAAIO,WAAAA,EAAa;AACf,QAAA;AACF,IAAA;IAEAA,WAAAA,GAAc,IAAA;AACdd,IAAAA,EAAAA,CAAGO,MAAM,GAAGA,MAAAA;AAEZ,IAAA,IAAIU,QAAQC,GAAG,CAACC,iBAAiB,EAAEC,kBAAkB,MAAA,EAAQ;AAC3D,QAAA;AACF,IAAA;IAEA,IAAI;AACF,QAAA,MAAMC,YAAUJ,OAAAA,CAAQC,GAAG,CAACI,cAAc,IAAIC,mBAAAA,CAAYP,UAAAA,CAAAA;AAE1D,QAAA,IAAIK,SAAAA,EAAS;YACXrB,EAAAA,CAAGE,WAAW,GAAGsB,qBAAAA,CAAcH,SAAAA,CAAAA;AAC/BR,YAAAA,MAAAA,EAAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAE,OAAOY,KAAAA,EAAO;AACd,QAAA,IAAIA,iBAAiBC,KAAAA,EAAO;AAC1BtB,YAAAA,OAAAA,CAAQqB,MAAMpB,OAAO,CAAA;QACvB,CAAA,MAAO;YACLD,OAAAA,CAAQ,kBAAA,CAAA;AACV,QAAA;AACF,IAAA;AACF,CAAA;AAEA;;;;AAIC,IACD,MAAMuB,YAAAA,GAAe,OAAO,EAAEjB,MAAAA,EAAAA,OAAM,EAA2B,GAAA;AAC7D,IAAA,MAAM,EAAEkB,GAAG,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAG,MAAMpB,OAAAA,CAAOqB,EAAE,CAACC,WAAW,EAAA;AAC7D,IAAA,MAAMA,WAAAA,GAAcJ,GAAAA,EAAAA;IAEpB,IAAI;AACF,QAAA,MAAMK,aAAa,MAAMvB,OAAAA,CAAOqB,EAAE,EAC9BG,YAAAA,CAAa,sBACdC,KAAAA,CAAM;YAAEC,GAAAA,EAAK;AAAiB,SAAA,CAAA,CAC9BC,OAAO,OAAA,CAAA,CACPC,KAAAA,EAAAA,CACAC,WAAAA,CAAYP,WAAAA,CAAAA,CACZQ,YACAC,OAAAA,EAAAA,CACAC,IAAAA,CAAK,CAACC,MAAAA,GAAiBA,SAASC,IAAAA,CAAKC,KAAK,CAACF,MAAAA,CAAOG,KAAK,CAAA,GAAIH,MAAAA,CAAAA;QAE9D,MAAMI,qBAAAA,GAAwB,CAACd,UAAAA,EAAYe,eAAe,CAAA,IAAKC,IAAAA,CAAKC,GAAG,EAAA,GAAKnD,UAAAA;AAC5E,QAAA,MAAM4C,MAAAA,GAIF;AAAEK,YAAAA,WAAAA,EAAaC,KAAKC,GAAG;AAAG,SAAA;AAE9B,QAAA,MAAMC,WAAW,CAAC1B,KAAAA,GAAAA;AAChB,YAAA,IAAIA,iBAAiB2B,yBAAAA,IAAqB3B,KAAAA,CAAM4B,cAAc,IAAIpB,YAAYZ,OAAAA,EAAS;gBACrFrB,EAAAA,CAAGO,MAAM,EAAEC,IAAAA,CACT,CAAA,EAAGiB,MAAMpB,OAAO,CAAC,0DAA0D,CAAC,CAAA;AAE9E,gBAAA,OAAO4B,WAAWZ,OAAO;AAC3B,YAAA;YAEAsB,MAAAA,CAAOlB,KAAK,GAAGA,KAAAA,CAAMpB,OAAO;AAC5BD,YAAAA,OAAAA,CAAQqB,MAAMpB,OAAO,CAAA;AACvB,QAAA,CAAA;QAEA,IAAI,CAACL,EAAAA,EAAIE,WAAAA,EAAaoD,UAAAA,EAAY;AAChC,YAAA,MAAM,IAAI5B,KAAAA,CAAM,sBAAA,CAAA;AAClB,QAAA;QAEA,MAAML,SAAAA,GAAU0B,qBAAAA,GACZ,MAAMQ,oBAAAA,CAAa;YAAE7C,MAAAA,EAAAA;AAAO,SAAA,EAAGV,EAAAA,CAAGE,WAAW,CAACoD,UAAU,EAAE5C,OAAAA,CAAO8C,MAAM,CAAC5B,GAAG,CAAC,MAAA,CAAA,CAAA,CAAS6B,KAAK,CACxFN,QAAAA,CAAAA,GAEFlB,WAAWZ,OAAO;AAEtB,QAAA,IAAIA,SAAAA,EAAS;YACX,IAAI;;AAEF,gBAAA,MAAMqC,iBAAiBlC,qBAAAA,CAAcH,SAAAA,CAAAA;gBACrC,MAAMsC,kBAAAA,GACJ,CAACC,UAAAA,CAAQF,cAAAA,CAAeG,QAAQ,EAAE7D,EAAAA,CAAGE,WAAW,CAAC2D,QAAQ,CAAA,IACzDH,cAAAA,CAAeI,KAAK,KAAK9D,EAAAA,CAAGE,WAAW,CAAC4D,KAAK,IAC7CJ,cAAAA,CAAeK,IAAI,KAAK/D,EAAAA,CAAGE,WAAW,CAAC6D,IAAI;;AAG7C/D,gBAAAA,EAAAA,CAAGE,WAAW,GAAGwD,cAAAA;gBACjB,MAAMM,UAAAA,GAAahE,GAAGC,OAAO;AAC7BgE,gBAAAA,YAAAA,EAAAA;;AAGA,gBAAA,IAAIN,sBAAsBK,UAAAA,EAAY;oBACpCtD,OAAAA,CAAOC,QAAQ,CAACC,IAAI,CAAC,WAAA,CAAA;AACvB,gBAAA;AACF,YAAA,CAAA,CAAE,OAAOa,KAAAA,EAAO;AACd,gBAAA,IAAIA,iBAAiBC,KAAAA,EAAO;AAC1BtB,oBAAAA,OAAAA,CAAQqB,MAAMpB,OAAO,CAAA;gBACvB,CAAA,MAAO;oBACLD,OAAAA,CAAQ,kBAAA,CAAA;AACV,gBAAA;AACF,YAAA;QACF,CAAA,MAAO,IAAI,CAAC2C,qBAAAA,EAAuB;AACjC3C,YAAAA,OAAAA,CAAQ6B,WAAWR,KAAK,CAAA;AAC1B,QAAA;AAEA,QAAA,IAAIsB,qBAAAA,EAAuB;YACzBJ,MAAAA,CAAOtB,OAAO,GAAGA,SAAAA,IAAW,IAAA;YAC5B,MAAM6C,KAAAA,GAAQxD,QAAOqB,EAAE,CAACG,YAAY,CAAC,oBAAA,CAAA,CAAsBK,WAAW,CAACP,WAAAA,CAAAA;AAEvE,YAAA,IAAI,CAACC,UAAAA,EAAY;AACfiC,gBAAAA,KAAAA,CAAMC,MAAM,CAAC;oBAAE/B,GAAAA,EAAK,gBAAA;oBAAkBU,KAAAA,EAAOF,IAAAA,CAAKwB,SAAS,CAACzB,MAAAA;AAAQ,iBAAA,CAAA;YACtE,CAAA,MAAO;AACLuB,gBAAAA,KAAAA,CAAMG,MAAM,CAAC;oBAAEvB,KAAAA,EAAOF,IAAAA,CAAKwB,SAAS,CAACzB,MAAAA;AAAQ,iBAAA,CAAA,CAAGR,KAAK,CAAC;oBAAEC,GAAAA,EAAK;AAAiB,iBAAA,CAAA;AAChF,YAAA;AAEA,YAAA,MAAM8B,MAAMzB,OAAO,EAAA;AACrB,QAAA;QAEA,MAAMZ,MAAAA,EAAAA;AACR,IAAA,CAAA,CAAE,OAAM;;QAEN,MAAMC,QAAAA,EAAAA;AACR,IAAA;AACF,CAAA;AAEA,MAAMmC,YAAAA,GAAe,IAAA;AACnB,IAAA,IAAI,OAAOjE,EAAAA,CAAGE,WAAW,CAACoE,QAAQ,KAAK,WAAA,EAAa;AAClD,QAAA,MAAM,IAAI5C,KAAAA,CAAM,sBAAA,CAAA;AAClB,IAAA;IAEA,MAAM6C,cAAAA,GAAiB,IAAItB,IAAAA,CAAKjD,EAAAA,CAAGE,WAAW,CAACoE,QAAQ,EAAEE,OAAO,EAAA;AAEhE,IAAA,IAAID,cAAAA,GAAiB,IAAItB,IAAAA,EAAAA,CAAOuB,OAAO,EAAA,EAAI;AACzC,QAAA,OAAOpE,OAAAA,CAAQ,kBAAA,CAAA;AACjB,IAAA;AAEAS,IAAAA,MAAAA,EAAAA;AACF,CAAA;AAEA,MAAM4D,YAAAA,GAAe,OAAO,EAAE/D,MAAAA,EAAAA,OAAM,EAA2B,GAAA;AAC7D,IAAA,MAAMgE,oBACJ1E,EAAAA,CAAGE,WAAW,CAAC6D,IAAI,KAAK;AAExB9C,IAAAA,OAAAA,CAAQC,GAAG,CAACyD,2BAA2B,EAAEvD,WAAAA,EAAAA,KAAkB,MAAA;AAE7D,IAAA,IAAI,CAACsD,iBAAAA,EAAmB;AACtB,QAAA,MAAM/C,YAAAA,CAAa;YAAEjB,MAAAA,EAAAA;AAAO,SAAA,CAAA;QAE5BA,OAAAA,CAAOkE,IAAI,CAACC,GAAG,CAAC;YACdlD,YAAAA,EAAc;AACZmD,gBAAAA,IAAAA,EAAM,IAAMnD,YAAAA,CAAa;wBAAEjB,MAAAA,EAAAA;AAAO,qBAAA,CAAA;AAClCqE,gBAAAA,OAAAA,EAASC,wBAAAA,CAAoB,gBAAA;AAC/B;AACF,SAAA,CAAA;IACF,CAAA,MAAO;AACL,QAAA,IAAI,CAAChF,EAAAA,CAAGE,WAAW,CAACoE,QAAQ,EAAE;AAC5B,YAAA,OAAOlE,OAAAA,CAAQ,6CAAA,CAAA;AACjB,QAAA;AAEA6D,QAAAA,YAAAA,EAAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAMgB,eAAAA,GAAkB,OAAO,EAC7BvE,MAAAA,EAAAA,OAAM,EAGP,GAAA;IACC,MAAMwE,WAAAA,GAAcC,wBAAkBzE,OAAAA,EAAQ;QAC5C0E,IAAAA,EAAM;AACR,KAAA,CAAA;AAEA,IAAA,MAAMC,GAAAA,GAAM,MAAMH,WAAAA,CAChB,CAAA,EAAGI,6BAAqB,cAAc,EAAEtF,EAAAA,CAAGE,WAAW,CAACoD,UAAU,CAAC,gBAAgB,CAAC,EACnF;QACEiC,MAAAA,EAAQ,KAAA;QACRC,OAAAA,EAAS;YAAE,cAAA,EAAgB;AAAmB;AAChD,KAAA,CAAA,CACA/B,KAAK,CAAC,IAAA;QACN,MAAM,IAAIL,0BACR,qEAAA,EACA,IAAA,CAAA;AAEJ,IAAA,CAAA,CAAA;IAEA,MAAMqC,IAAAA,GAAQ,MAAMJ,GAAAA,CAAIK,IAAI,EAAA;IAE5B,OAAOD,IAAAA;AACT,CAAA;AAEA,MAAME,IAAAA,GAAO,IAAA;IACX,OACE3F,EAAAA,CAAGE,WAAW,CAAC2D,QAAQ,EAAE+B,GAAAA,CAAI,CAACC,OAAAA,GAC5B,OAAOA,OAAAA,KAAY,QAAA,GAAWA,OAAAA,GAAU;YAAEC,IAAAA,EAAMD;AAAQ,SAAA,CAAA,IACrD,EAAE;AAEX,CAAA;AAEA,MAAMjE,GAAAA,GAAM,CAACmE,WAAAA,GAAwBJ,IAAAA,EAAAA,CAAOK,IAAI,CAAC,CAACH,OAAAA,GAAYA,OAAAA,CAAQC,IAAI,KAAKC,WAAAA,CAAAA;AAE/E,YAAeE,MAAAA,CAAOC,MAAM,CAAC;AAC3BnF,IAAAA,IAAAA;AACA0D,IAAAA,YAAAA;AACAQ,IAAAA,eAAAA;AAEA,IAAA,IAAIkB,IAAAA,CAAAA,GAAO;AACT,QAAA,OAAOnG,GAAGC,OAAO;AACnB,IAAA,CAAA;AAEA,IAAA,IAAI6D,KAAAA,CAAAA,GAAQ;QACV,OAAO9D,EAAAA,CAAGE,WAAW,CAAC4D,KAAK;AAC7B,IAAA,CAAA;AAEA,IAAA,IAAIC,IAAAA,CAAAA,GAAO;QACT,OAAO/D,EAAAA,CAAGE,WAAW,CAAC6D,IAAI;AAC5B,IAAA,CAAA;AAEA,IAAA,IAAI5D,OAAAA,CAAAA,GAAU;QACZ,OAAOH,EAAAA,CAAGE,WAAW,CAACC,OAAO;AAC/B,IAAA,CAAA;AAEA,IAAA,IAAIiG,WAAAA,CAAAA,GAAc;QAChB,OAAOpG,EAAAA,CAAGE,WAAW,CAACkG,WAAW;AACnC,IAAA,CAAA;AAEA,IAAA,IAAIC,cAAAA,CAAAA,GAAiB;QACnB,OAAOrG,EAAAA,CAAGE,WAAW,CAACmG,cAAc;AACtC,IAAA,CAAA;IAEAxC,QAAAA,EAAUoC,MAAAA,CAAOC,MAAM,CAAC;AACtBP,QAAAA,IAAAA;AACA/D,QAAAA,GAAAA;QACA0E,SAAAA,EAAW,CAACP,WAAAA,GAAwBnE,GAAAA,CAAImE,WAAAA,CAAAA,KAAiBQ;AAC3D,KAAA;AACF,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/ee/index.ts"],"sourcesContent":["import { isEqual, pick } from 'lodash';\nimport type { Logger } from '@strapi/logger';\nimport type { Core } from '@strapi/types';\nimport { createStrapiFetch } from '../utils/fetch';\nimport {\n readLicense,\n verifyLicense,\n fetchLicense,\n LicenseCheckError,\n LICENSE_REGISTRY_URI,\n} from './license';\nimport { shiftCronExpression } from '../utils/cron';\n\nconst ONE_MINUTE = 1000 * 60;\n\ninterface EE {\n enabled: boolean;\n licenseInfo: {\n licenseKey?: string;\n features?: Array<{ name: string; [key: string]: any } | string>;\n expireAt?: string;\n seats?: number;\n type?: string;\n isTrial: boolean;\n subscriptionId?: string;\n planPriceId?: string;\n };\n logger?: Logger;\n}\n\nconst ee: EE = {\n enabled: false,\n licenseInfo: {\n isTrial: false,\n },\n};\n\nconst disable = (message: string) => {\n // Prevent emitting ee.disable if it was already disabled\n const shouldEmitEvent = ee.enabled !== false;\n\n ee.logger?.warn(`${message} Switching to CE.`);\n // Only keep the license key and isTrial for potential re-enabling during a later check\n ee.licenseInfo = pick(ee.licenseInfo, ['licenseKey', 'isTrial']);\n\n ee.licenseInfo.isTrial = false;\n\n ee.enabled = false;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.disable');\n }\n};\n\nconst enable = () => {\n // Prevent emitting ee.enable if it was already enabled\n const shouldEmitEvent = ee.enabled !== true;\n\n ee.enabled = true;\n\n if (shouldEmitEvent) {\n // Notify EE features that they should be disabled\n strapi.eventHub.emit('ee.enable');\n }\n};\n\nlet initialized = false;\n\n/**\n * Optimistically enable EE if the format of the license is valid, only run once.\n */\nconst init = (licenseDir: string, logger?: Logger) => {\n if (initialized) {\n return;\n }\n\n initialized = true;\n ee.logger = logger;\n\n if (process.env.STRAPI_DISABLE_EE?.toLowerCase() === 'true') {\n return;\n }\n\n try {\n const license = process.env.STRAPI_LICENSE || readLicense(licenseDir);\n\n if (license) {\n ee.licenseInfo = verifyLicense(license);\n enable();\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n};\n\n/**\n * Contact the license registry to update the license to its latest state.\n *\n * Store the result in database to avoid unecessary requests, and will fallback to that in case of a network failure.\n */\nconst onlineUpdate = async ({ strapi }: { strapi: Core.Strapi }) => {\n const { get, commit, rollback } = await strapi.db.transaction();\n const transaction = get();\n\n try {\n const storedInfo = await strapi.db\n ?.queryBuilder('strapi::core-store')\n .where({ key: 'ee_information' })\n .select('value')\n .first()\n .transacting(transaction)\n .forUpdate()\n .execute()\n .then((result: any) => (result ? JSON.parse(result.value) : result));\n\n const shouldContactRegistry = (storedInfo?.lastCheckAt ?? 0) < Date.now() - ONE_MINUTE;\n const result: {\n license?: string | null;\n error?: string;\n lastCheckAt?: number;\n } = { lastCheckAt: Date.now() };\n\n const fallback = (error: Error) => {\n if (error instanceof LicenseCheckError && error.shouldFallback && storedInfo?.license) {\n ee.logger?.warn(\n `${error.message} The last stored one will be used as a potential fallback.`\n );\n return storedInfo.license;\n }\n\n result.error = error.message;\n disable(error.message);\n };\n\n if (!ee?.licenseInfo?.licenseKey) {\n throw new Error('Missing license key.');\n }\n\n const license = shouldContactRegistry\n ? await fetchLicense({ strapi }, ee.licenseInfo.licenseKey, strapi.config.get('uuid')).catch(\n fallback\n )\n : storedInfo.license;\n\n if (license) {\n try {\n // Verify license and check if its info changed\n const newLicenseInfo = verifyLicense(license);\n const licenseInfoChanged =\n !isEqual(newLicenseInfo.features, ee.licenseInfo.features) ||\n newLicenseInfo.seats !== ee.licenseInfo.seats ||\n newLicenseInfo.type !== ee.licenseInfo.type;\n\n // Store the new license info\n ee.licenseInfo = newLicenseInfo;\n const wasEnabled = ee.enabled;\n validateInfo();\n\n // Notify EE features\n if (licenseInfoChanged && wasEnabled) {\n strapi.eventHub.emit('ee.update');\n }\n } catch (error) {\n if (error instanceof Error) {\n disable(error.message);\n } else {\n disable('Invalid license.');\n }\n }\n } else if (!shouldContactRegistry) {\n disable(storedInfo.error);\n }\n\n if (shouldContactRegistry) {\n result.license = license ?? null;\n const query = strapi.db.queryBuilder('strapi::core-store').transacting(transaction);\n\n if (!storedInfo) {\n query.insert({ key: 'ee_information', value: JSON.stringify(result) });\n } else {\n query.update({ value: JSON.stringify(result) }).where({ key: 'ee_information' });\n }\n\n await query.execute();\n }\n\n await commit();\n } catch {\n // Example of errors: SQLite does not support FOR UPDATE\n await rollback();\n }\n};\n\nconst validateInfo = () => {\n if (typeof ee.licenseInfo.expireAt === 'undefined') {\n throw new Error('Missing license key.');\n }\n\n const expirationTime = new Date(ee.licenseInfo.expireAt).getTime();\n\n if (expirationTime < new Date().getTime()) {\n return disable('License expired.');\n }\n\n enable();\n};\n\nconst checkLicense = async ({ strapi }: { strapi: Core.Strapi }) => {\n const shouldStayOffline =\n ee.licenseInfo.type === 'gold' &&\n // This env variable support is temporarily used to ease the migration between online vs offline\n process.env.STRAPI_DISABLE_LICENSE_PING?.toLowerCase() === 'true';\n\n if (!shouldStayOffline) {\n await onlineUpdate({ strapi });\n\n strapi.cron.add({\n onlineUpdate: {\n task: () => onlineUpdate({ strapi }),\n options: shiftCronExpression('0 0 */12 * * *'),\n },\n });\n } else {\n if (!ee.licenseInfo.expireAt) {\n return disable('Your license does not have offline support.');\n }\n\n validateInfo();\n }\n};\n\nconst getTrialEndDate = async ({\n strapi,\n}: {\n strapi: Core.Strapi;\n}): Promise<{ trialEndsAt: string } | null> => {\n const silentFetch = createStrapiFetch(strapi, {\n logs: false,\n });\n\n const res = await silentFetch(\n `${LICENSE_REGISTRY_URI}/api/licenses/${ee.licenseInfo.licenseKey}/trial-countdown`,\n {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n }\n ).catch(() => {\n throw new LicenseCheckError(\n 'Could not proceed to retrieve the trial time left for your license.',\n true\n );\n });\n\n const data = (await res.json()) as { trialEndsAt: string } | null;\n\n return data;\n};\n\nconst list = () => {\n return (\n ee.licenseInfo.features?.map((feature) =>\n typeof feature === 'object' ? feature : { name: feature }\n ) || []\n );\n};\n\nconst get = (featureName: string) => list().find((feature) => feature.name === featureName);\n\nexport default Object.freeze({\n init,\n checkLicense,\n getTrialEndDate,\n\n get isEE() {\n return ee.enabled;\n },\n\n get seats() {\n return ee.licenseInfo.seats;\n },\n\n get type() {\n return ee.licenseInfo.type;\n },\n\n get isTrial() {\n return ee.licenseInfo.isTrial;\n },\n\n get planPriceId() {\n return ee.licenseInfo.planPriceId;\n },\n\n get subscriptionId() {\n return ee.licenseInfo.subscriptionId;\n },\n\n features: Object.freeze({\n list,\n get,\n isEnabled: (featureName: string) => get(featureName) !== undefined,\n }),\n});\n"],"names":["ONE_MINUTE","ee","enabled","licenseInfo","isTrial","disable","message","shouldEmitEvent","logger","warn","pick","strapi","eventHub","emit","enable","initialized","init","licenseDir","process","env","STRAPI_DISABLE_EE","toLowerCase","license","STRAPI_LICENSE","readLicense","verifyLicense","error","Error","onlineUpdate","get","commit","rollback","db","transaction","storedInfo","queryBuilder","where","key","select","first","transacting","forUpdate","execute","then","result","JSON","parse","value","shouldContactRegistry","lastCheckAt","Date","now","fallback","LicenseCheckError","shouldFallback","licenseKey","fetchLicense","config","catch","newLicenseInfo","licenseInfoChanged","isEqual","features","seats","type","wasEnabled","validateInfo","query","insert","stringify","update","expireAt","expirationTime","getTime","checkLicense","shouldStayOffline","STRAPI_DISABLE_LICENSE_PING","cron","add","task","options","shiftCronExpression","getTrialEndDate","silentFetch","createStrapiFetch","logs","res","LICENSE_REGISTRY_URI","method","headers","data","json","list","map","feature","name","featureName","find","Object","freeze","isEE","planPriceId","subscriptionId","isEnabled","undefined"],"mappings":"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"}