@strapi/plugin-graphql 5.12.1 → 5.12.3

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 (483) hide show
  1. package/dist/admin/index.js +18 -143
  2. package/dist/admin/index.js.map +1 -1
  3. package/dist/admin/index.mjs +14 -141
  4. package/dist/admin/index.mjs.map +1 -1
  5. package/dist/admin/package.json.js +143 -0
  6. package/dist/admin/package.json.js.map +1 -0
  7. package/dist/admin/package.json.mjs +124 -0
  8. package/dist/admin/package.json.mjs.map +1 -0
  9. package/dist/admin/pluginId.js +6 -0
  10. package/dist/admin/pluginId.js.map +1 -0
  11. package/dist/admin/pluginId.mjs +4 -0
  12. package/dist/admin/pluginId.mjs.map +1 -0
  13. package/dist/admin/{chunks/dk-D3k_Atlh.js → translations/dk.json.js} +2 -2
  14. package/dist/admin/translations/dk.json.js.map +1 -0
  15. package/dist/admin/{chunks/dk-Bji21OvY.mjs → translations/dk.json.mjs} +1 -1
  16. package/dist/admin/translations/dk.json.mjs.map +1 -0
  17. package/dist/admin/{chunks/en-DzY_FEd6.js → translations/en.json.js} +2 -2
  18. package/dist/admin/translations/en.json.js.map +1 -0
  19. package/dist/admin/{chunks/en-COko3s6d.mjs → translations/en.json.mjs} +1 -1
  20. package/dist/admin/translations/en.json.mjs.map +1 -0
  21. package/dist/admin/{chunks/es-D02rvX4A.js → translations/es.json.js} +2 -2
  22. package/dist/admin/translations/es.json.js.map +1 -0
  23. package/dist/admin/{chunks/es-BoUVfXlb.mjs → translations/es.json.mjs} +1 -1
  24. package/dist/admin/translations/es.json.mjs.map +1 -0
  25. package/dist/admin/{chunks/fr-D9dcL-gU.js → translations/fr.json.js} +2 -2
  26. package/dist/admin/translations/fr.json.js.map +1 -0
  27. package/dist/admin/{chunks/fr-DFbQQgkK.mjs → translations/fr.json.mjs} +1 -1
  28. package/dist/admin/translations/fr.json.mjs.map +1 -0
  29. package/dist/admin/{chunks/pl-DRSWvr2y.js → translations/pl.json.js} +2 -2
  30. package/dist/admin/translations/pl.json.js.map +1 -0
  31. package/dist/admin/{chunks/pl-Bih5cA3Y.mjs → translations/pl.json.mjs} +1 -1
  32. package/dist/admin/translations/pl.json.mjs.map +1 -0
  33. package/dist/admin/{chunks/ru-zDn7cu6t.js → translations/ru.json.js} +2 -2
  34. package/dist/admin/translations/ru.json.js.map +1 -0
  35. package/dist/admin/{chunks/ru-Bxi2fB6E.mjs → translations/ru.json.mjs} +1 -1
  36. package/dist/admin/translations/ru.json.mjs.map +1 -0
  37. package/dist/admin/{chunks/sv-Dq2aVH0_.js → translations/sv.json.js} +2 -2
  38. package/dist/admin/translations/sv.json.js.map +1 -0
  39. package/dist/admin/{chunks/sv-B2uIJv_a.mjs → translations/sv.json.mjs} +1 -1
  40. package/dist/admin/translations/sv.json.mjs.map +1 -0
  41. package/dist/admin/{chunks/tr-B0yEuVnS.js → translations/tr.json.js} +2 -2
  42. package/dist/admin/translations/tr.json.js.map +1 -0
  43. package/dist/admin/{chunks/tr-DwO6hyQD.mjs → translations/tr.json.mjs} +1 -1
  44. package/dist/admin/translations/tr.json.mjs.map +1 -0
  45. package/dist/admin/{chunks/uk-DJGNjXWk.js → translations/uk.json.js} +2 -2
  46. package/dist/admin/translations/uk.json.js.map +1 -0
  47. package/dist/admin/{chunks/uk-_25RY9BK.mjs → translations/uk.json.mjs} +1 -1
  48. package/dist/admin/translations/uk.json.mjs.map +1 -0
  49. package/dist/admin/{chunks/zh-Hans-DxlDvlSo.js → translations/zh-Hans.json.js} +2 -2
  50. package/dist/admin/translations/zh-Hans.json.js.map +1 -0
  51. package/dist/admin/{chunks/zh-Hans-DUab611K.mjs → translations/zh-Hans.json.mjs} +1 -1
  52. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -0
  53. package/dist/admin/{chunks/zh-BkiTjJnf.js → translations/zh.json.js} +2 -2
  54. package/dist/admin/translations/zh.json.js.map +1 -0
  55. package/dist/admin/{chunks/zh-DVvz1qsT.mjs → translations/zh.json.mjs} +1 -1
  56. package/dist/admin/translations/zh.json.mjs.map +1 -0
  57. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  58. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  59. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  60. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  61. package/dist/server/bootstrap.js +180 -0
  62. package/dist/server/bootstrap.js.map +1 -0
  63. package/dist/server/bootstrap.mjs +177 -0
  64. package/dist/server/bootstrap.mjs.map +1 -0
  65. package/dist/server/config/default-config.js +13 -0
  66. package/dist/server/config/default-config.js.map +1 -0
  67. package/dist/server/config/default-config.mjs +11 -0
  68. package/dist/server/config/default-config.mjs.map +1 -0
  69. package/dist/server/config/index.js +10 -0
  70. package/dist/server/config/index.js.map +1 -0
  71. package/dist/server/config/index.mjs +8 -0
  72. package/dist/server/config/index.mjs.map +1 -0
  73. package/dist/server/format-graphql-error.js +60 -0
  74. package/dist/server/format-graphql-error.js.map +1 -0
  75. package/dist/server/format-graphql-error.mjs +58 -0
  76. package/dist/server/format-graphql-error.mjs.map +1 -0
  77. package/dist/server/index.js +6 -3719
  78. package/dist/server/index.js.map +1 -1
  79. package/dist/server/index.mjs +3 -3698
  80. package/dist/server/index.mjs.map +1 -1
  81. package/dist/server/services/builders/dynamic-zones.js +75 -0
  82. package/dist/server/services/builders/dynamic-zones.js.map +1 -0
  83. package/dist/server/services/builders/dynamic-zones.mjs +73 -0
  84. package/dist/server/services/builders/dynamic-zones.mjs.map +1 -0
  85. package/dist/server/services/builders/entity.js +38 -0
  86. package/dist/server/services/builders/entity.js.map +1 -0
  87. package/dist/server/services/builders/entity.mjs +36 -0
  88. package/dist/server/services/builders/entity.mjs.map +1 -0
  89. package/dist/server/services/builders/enums.js +24 -0
  90. package/dist/server/services/builders/enums.js.map +1 -0
  91. package/dist/server/services/builders/enums.mjs +22 -0
  92. package/dist/server/services/builders/enums.mjs.map +1 -0
  93. package/dist/server/services/builders/filters/content-type.js +94 -0
  94. package/dist/server/services/builders/filters/content-type.js.map +1 -0
  95. package/dist/server/services/builders/filters/content-type.mjs +92 -0
  96. package/dist/server/services/builders/filters/content-type.mjs.map +1 -0
  97. package/dist/server/services/builders/filters/index.js +10 -0
  98. package/dist/server/services/builders/filters/index.js.map +1 -0
  99. package/dist/server/services/builders/filters/index.mjs +8 -0
  100. package/dist/server/services/builders/filters/index.mjs.map +1 -0
  101. package/dist/server/services/builders/filters/operators/and.js +17 -0
  102. package/dist/server/services/builders/filters/operators/and.js.map +1 -0
  103. package/dist/server/services/builders/filters/operators/and.mjs +15 -0
  104. package/dist/server/services/builders/filters/operators/and.mjs.map +1 -0
  105. package/dist/server/services/builders/filters/operators/between.js +17 -0
  106. package/dist/server/services/builders/filters/operators/between.js.map +1 -0
  107. package/dist/server/services/builders/filters/operators/between.mjs +15 -0
  108. package/dist/server/services/builders/filters/operators/between.mjs.map +1 -0
  109. package/dist/server/services/builders/filters/operators/contains.js +15 -0
  110. package/dist/server/services/builders/filters/operators/contains.js.map +1 -0
  111. package/dist/server/services/builders/filters/operators/contains.mjs +13 -0
  112. package/dist/server/services/builders/filters/operators/contains.mjs.map +1 -0
  113. package/dist/server/services/builders/filters/operators/containsi.js +15 -0
  114. package/dist/server/services/builders/filters/operators/containsi.js.map +1 -0
  115. package/dist/server/services/builders/filters/operators/containsi.mjs +13 -0
  116. package/dist/server/services/builders/filters/operators/containsi.mjs.map +1 -0
  117. package/dist/server/services/builders/filters/operators/ends-with.js +15 -0
  118. package/dist/server/services/builders/filters/operators/ends-with.js.map +1 -0
  119. package/dist/server/services/builders/filters/operators/ends-with.mjs +13 -0
  120. package/dist/server/services/builders/filters/operators/ends-with.mjs.map +1 -0
  121. package/dist/server/services/builders/filters/operators/eq.js +22 -0
  122. package/dist/server/services/builders/filters/operators/eq.js.map +1 -0
  123. package/dist/server/services/builders/filters/operators/eq.mjs +20 -0
  124. package/dist/server/services/builders/filters/operators/eq.mjs.map +1 -0
  125. package/dist/server/services/builders/filters/operators/eqi.js +15 -0
  126. package/dist/server/services/builders/filters/operators/eqi.js.map +1 -0
  127. package/dist/server/services/builders/filters/operators/eqi.mjs +13 -0
  128. package/dist/server/services/builders/filters/operators/eqi.mjs.map +1 -0
  129. package/dist/server/services/builders/filters/operators/gt.js +15 -0
  130. package/dist/server/services/builders/filters/operators/gt.js.map +1 -0
  131. package/dist/server/services/builders/filters/operators/gt.mjs +13 -0
  132. package/dist/server/services/builders/filters/operators/gt.mjs.map +1 -0
  133. package/dist/server/services/builders/filters/operators/gte.js +15 -0
  134. package/dist/server/services/builders/filters/operators/gte.js.map +1 -0
  135. package/dist/server/services/builders/filters/operators/gte.mjs +13 -0
  136. package/dist/server/services/builders/filters/operators/gte.mjs.map +1 -0
  137. package/dist/server/services/builders/filters/operators/in.js +17 -0
  138. package/dist/server/services/builders/filters/operators/in.js.map +1 -0
  139. package/dist/server/services/builders/filters/operators/in.mjs +15 -0
  140. package/dist/server/services/builders/filters/operators/in.mjs.map +1 -0
  141. package/dist/server/services/builders/filters/operators/index.js +57 -0
  142. package/dist/server/services/builders/filters/operators/index.js.map +1 -0
  143. package/dist/server/services/builders/filters/operators/index.mjs +55 -0
  144. package/dist/server/services/builders/filters/operators/index.mjs.map +1 -0
  145. package/dist/server/services/builders/filters/operators/lt.js +15 -0
  146. package/dist/server/services/builders/filters/operators/lt.js.map +1 -0
  147. package/dist/server/services/builders/filters/operators/lt.mjs +13 -0
  148. package/dist/server/services/builders/filters/operators/lt.mjs.map +1 -0
  149. package/dist/server/services/builders/filters/operators/lte.js +15 -0
  150. package/dist/server/services/builders/filters/operators/lte.js.map +1 -0
  151. package/dist/server/services/builders/filters/operators/lte.mjs +13 -0
  152. package/dist/server/services/builders/filters/operators/lte.mjs.map +1 -0
  153. package/dist/server/services/builders/filters/operators/ne.js +15 -0
  154. package/dist/server/services/builders/filters/operators/ne.js.map +1 -0
  155. package/dist/server/services/builders/filters/operators/ne.mjs +13 -0
  156. package/dist/server/services/builders/filters/operators/ne.mjs.map +1 -0
  157. package/dist/server/services/builders/filters/operators/nei.js +15 -0
  158. package/dist/server/services/builders/filters/operators/nei.js.map +1 -0
  159. package/dist/server/services/builders/filters/operators/nei.mjs +13 -0
  160. package/dist/server/services/builders/filters/operators/nei.mjs.map +1 -0
  161. package/dist/server/services/builders/filters/operators/not-contains.js +15 -0
  162. package/dist/server/services/builders/filters/operators/not-contains.js.map +1 -0
  163. package/dist/server/services/builders/filters/operators/not-contains.mjs +13 -0
  164. package/dist/server/services/builders/filters/operators/not-contains.mjs.map +1 -0
  165. package/dist/server/services/builders/filters/operators/not-containsi.js +15 -0
  166. package/dist/server/services/builders/filters/operators/not-containsi.js.map +1 -0
  167. package/dist/server/services/builders/filters/operators/not-containsi.mjs +13 -0
  168. package/dist/server/services/builders/filters/operators/not-containsi.mjs.map +1 -0
  169. package/dist/server/services/builders/filters/operators/not-in.js +17 -0
  170. package/dist/server/services/builders/filters/operators/not-in.js.map +1 -0
  171. package/dist/server/services/builders/filters/operators/not-in.mjs +15 -0
  172. package/dist/server/services/builders/filters/operators/not-in.mjs.map +1 -0
  173. package/dist/server/services/builders/filters/operators/not-null.js +13 -0
  174. package/dist/server/services/builders/filters/operators/not-null.js.map +1 -0
  175. package/dist/server/services/builders/filters/operators/not-null.mjs +11 -0
  176. package/dist/server/services/builders/filters/operators/not-null.mjs.map +1 -0
  177. package/dist/server/services/builders/filters/operators/not.js +24 -0
  178. package/dist/server/services/builders/filters/operators/not.js.map +1 -0
  179. package/dist/server/services/builders/filters/operators/not.mjs +22 -0
  180. package/dist/server/services/builders/filters/operators/not.mjs.map +1 -0
  181. package/dist/server/services/builders/filters/operators/null.js +13 -0
  182. package/dist/server/services/builders/filters/operators/null.js.map +1 -0
  183. package/dist/server/services/builders/filters/operators/null.mjs +11 -0
  184. package/dist/server/services/builders/filters/operators/null.mjs.map +1 -0
  185. package/dist/server/services/builders/filters/operators/or.js +17 -0
  186. package/dist/server/services/builders/filters/operators/or.js.map +1 -0
  187. package/dist/server/services/builders/filters/operators/or.mjs +15 -0
  188. package/dist/server/services/builders/filters/operators/or.mjs.map +1 -0
  189. package/dist/server/services/builders/filters/operators/starts-with.js +15 -0
  190. package/dist/server/services/builders/filters/operators/starts-with.js.map +1 -0
  191. package/dist/server/services/builders/filters/operators/starts-with.mjs +13 -0
  192. package/dist/server/services/builders/filters/operators/starts-with.mjs.map +1 -0
  193. package/dist/server/services/builders/generic-morph.js +38 -0
  194. package/dist/server/services/builders/generic-morph.js.map +1 -0
  195. package/dist/server/services/builders/generic-morph.mjs +36 -0
  196. package/dist/server/services/builders/generic-morph.mjs.map +1 -0
  197. package/dist/server/services/builders/index.js +75 -0
  198. package/dist/server/services/builders/index.js.map +1 -0
  199. package/dist/server/services/builders/index.mjs +73 -0
  200. package/dist/server/services/builders/index.mjs.map +1 -0
  201. package/dist/server/services/builders/input.js +89 -0
  202. package/dist/server/services/builders/input.js.map +1 -0
  203. package/dist/server/services/builders/input.mjs +87 -0
  204. package/dist/server/services/builders/input.mjs.map +1 -0
  205. package/dist/server/services/builders/mutations/collection-type.js +155 -0
  206. package/dist/server/services/builders/mutations/collection-type.js.map +1 -0
  207. package/dist/server/services/builders/mutations/collection-type.mjs +153 -0
  208. package/dist/server/services/builders/mutations/collection-type.mjs.map +1 -0
  209. package/dist/server/services/builders/mutations/index.js +12 -0
  210. package/dist/server/services/builders/mutations/index.js.map +1 -0
  211. package/dist/server/services/builders/mutations/index.mjs +10 -0
  212. package/dist/server/services/builders/mutations/index.mjs.map +1 -0
  213. package/dist/server/services/builders/mutations/single-type.js +123 -0
  214. package/dist/server/services/builders/mutations/single-type.js.map +1 -0
  215. package/dist/server/services/builders/mutations/single-type.mjs +121 -0
  216. package/dist/server/services/builders/mutations/single-type.mjs.map +1 -0
  217. package/dist/server/services/builders/queries/collection-type.js +152 -0
  218. package/dist/server/services/builders/queries/collection-type.js.map +1 -0
  219. package/dist/server/services/builders/queries/collection-type.mjs +150 -0
  220. package/dist/server/services/builders/queries/collection-type.mjs.map +1 -0
  221. package/dist/server/services/builders/queries/index.js +12 -0
  222. package/dist/server/services/builders/queries/index.js.map +1 -0
  223. package/dist/server/services/builders/queries/index.mjs +10 -0
  224. package/dist/server/services/builders/queries/index.mjs.map +1 -0
  225. package/dist/server/services/builders/queries/single-type.js +70 -0
  226. package/dist/server/services/builders/queries/single-type.js.map +1 -0
  227. package/dist/server/services/builders/queries/single-type.mjs +68 -0
  228. package/dist/server/services/builders/queries/single-type.mjs.map +1 -0
  229. package/dist/server/services/builders/relation-response-collection.js +35 -0
  230. package/dist/server/services/builders/relation-response-collection.js.map +1 -0
  231. package/dist/server/services/builders/relation-response-collection.mjs +33 -0
  232. package/dist/server/services/builders/relation-response-collection.mjs.map +1 -0
  233. package/dist/server/services/builders/resolvers/association.js +74 -0
  234. package/dist/server/services/builders/resolvers/association.js.map +1 -0
  235. package/dist/server/services/builders/resolvers/association.mjs +72 -0
  236. package/dist/server/services/builders/resolvers/association.mjs.map +1 -0
  237. package/dist/server/services/builders/resolvers/component.js +27 -0
  238. package/dist/server/services/builders/resolvers/component.js.map +1 -0
  239. package/dist/server/services/builders/resolvers/component.mjs +25 -0
  240. package/dist/server/services/builders/resolvers/component.mjs.map +1 -0
  241. package/dist/server/services/builders/resolvers/dynamic-zone.js +12 -0
  242. package/dist/server/services/builders/resolvers/dynamic-zone.js.map +1 -0
  243. package/dist/server/services/builders/resolvers/dynamic-zone.mjs +10 -0
  244. package/dist/server/services/builders/resolvers/dynamic-zone.mjs.map +1 -0
  245. package/dist/server/services/builders/resolvers/index.js +20 -0
  246. package/dist/server/services/builders/resolvers/index.js.map +1 -0
  247. package/dist/server/services/builders/resolvers/index.mjs +18 -0
  248. package/dist/server/services/builders/resolvers/index.mjs.map +1 -0
  249. package/dist/server/services/builders/resolvers/pagination.js +29 -0
  250. package/dist/server/services/builders/resolvers/pagination.js.map +1 -0
  251. package/dist/server/services/builders/resolvers/pagination.mjs +27 -0
  252. package/dist/server/services/builders/resolvers/pagination.mjs.map +1 -0
  253. package/dist/server/services/builders/resolvers/query.js +55 -0
  254. package/dist/server/services/builders/resolvers/query.js.map +1 -0
  255. package/dist/server/services/builders/resolvers/query.mjs +53 -0
  256. package/dist/server/services/builders/resolvers/query.mjs.map +1 -0
  257. package/dist/server/services/builders/response-collection.js +50 -0
  258. package/dist/server/services/builders/response-collection.js.map +1 -0
  259. package/dist/server/services/builders/response-collection.mjs +48 -0
  260. package/dist/server/services/builders/response-collection.mjs.map +1 -0
  261. package/dist/server/services/builders/response.js +28 -0
  262. package/dist/server/services/builders/response.js.map +1 -0
  263. package/dist/server/services/builders/response.mjs +26 -0
  264. package/dist/server/services/builders/response.mjs.map +1 -0
  265. package/dist/server/services/builders/type.js +347 -0
  266. package/dist/server/services/builders/type.js.map +1 -0
  267. package/dist/server/services/builders/type.mjs +345 -0
  268. package/dist/server/services/builders/type.mjs.map +1 -0
  269. package/dist/server/services/builders/utils.js +113 -0
  270. package/dist/server/services/builders/utils.js.map +1 -0
  271. package/dist/server/services/builders/utils.mjs +111 -0
  272. package/dist/server/services/builders/utils.mjs.map +1 -0
  273. package/dist/server/services/constants.js +139 -0
  274. package/dist/server/services/constants.js.map +1 -0
  275. package/dist/server/services/constants.mjs +137 -0
  276. package/dist/server/services/constants.mjs.map +1 -0
  277. package/dist/server/services/content-api/index.js +184 -0
  278. package/dist/server/services/content-api/index.js.map +1 -0
  279. package/dist/server/services/content-api/index.mjs +182 -0
  280. package/dist/server/services/content-api/index.mjs.map +1 -0
  281. package/dist/server/services/content-api/policy.js +54 -0
  282. package/dist/server/services/content-api/policy.js.map +1 -0
  283. package/dist/server/services/content-api/policy.mjs +52 -0
  284. package/dist/server/services/content-api/policy.mjs.map +1 -0
  285. package/dist/server/services/content-api/register-functions/collection-type.js +41 -0
  286. package/dist/server/services/content-api/register-functions/collection-type.js.map +1 -0
  287. package/dist/server/services/content-api/register-functions/collection-type.mjs +39 -0
  288. package/dist/server/services/content-api/register-functions/collection-type.mjs.map +1 -0
  289. package/dist/server/services/content-api/register-functions/component.js +16 -0
  290. package/dist/server/services/content-api/register-functions/component.js.map +1 -0
  291. package/dist/server/services/content-api/register-functions/component.mjs +14 -0
  292. package/dist/server/services/content-api/register-functions/component.mjs.map +1 -0
  293. package/dist/server/services/content-api/register-functions/dynamic-zones.js +31 -0
  294. package/dist/server/services/content-api/register-functions/dynamic-zones.js.map +1 -0
  295. package/dist/server/services/content-api/register-functions/dynamic-zones.mjs +29 -0
  296. package/dist/server/services/content-api/register-functions/dynamic-zones.mjs.map +1 -0
  297. package/dist/server/services/content-api/register-functions/enums.js +23 -0
  298. package/dist/server/services/content-api/register-functions/enums.js.map +1 -0
  299. package/dist/server/services/content-api/register-functions/enums.mjs +21 -0
  300. package/dist/server/services/content-api/register-functions/enums.mjs.map +1 -0
  301. package/dist/server/services/content-api/register-functions/filters.js +16 -0
  302. package/dist/server/services/content-api/register-functions/filters.js.map +1 -0
  303. package/dist/server/services/content-api/register-functions/filters.mjs +14 -0
  304. package/dist/server/services/content-api/register-functions/filters.mjs.map +1 -0
  305. package/dist/server/services/content-api/register-functions/inputs.js +17 -0
  306. package/dist/server/services/content-api/register-functions/inputs.js.map +1 -0
  307. package/dist/server/services/content-api/register-functions/inputs.mjs +15 -0
  308. package/dist/server/services/content-api/register-functions/inputs.mjs.map +1 -0
  309. package/dist/server/services/content-api/register-functions/internals.js +16 -0
  310. package/dist/server/services/content-api/register-functions/internals.js.map +1 -0
  311. package/dist/server/services/content-api/register-functions/internals.mjs +14 -0
  312. package/dist/server/services/content-api/register-functions/internals.mjs.map +1 -0
  313. package/dist/server/services/content-api/register-functions/polymorphic.js +49 -0
  314. package/dist/server/services/content-api/register-functions/polymorphic.js.map +1 -0
  315. package/dist/server/services/content-api/register-functions/polymorphic.mjs +47 -0
  316. package/dist/server/services/content-api/register-functions/polymorphic.mjs.map +1 -0
  317. package/dist/server/services/content-api/register-functions/scalars.js +15 -0
  318. package/dist/server/services/content-api/register-functions/scalars.js.map +1 -0
  319. package/dist/server/services/content-api/register-functions/scalars.mjs +13 -0
  320. package/dist/server/services/content-api/register-functions/scalars.mjs.map +1 -0
  321. package/dist/server/services/content-api/register-functions/single-type.js +41 -0
  322. package/dist/server/services/content-api/register-functions/single-type.js.map +1 -0
  323. package/dist/server/services/content-api/register-functions/single-type.mjs +39 -0
  324. package/dist/server/services/content-api/register-functions/single-type.mjs.map +1 -0
  325. package/dist/server/services/content-api/wrap-resolvers.js +119 -0
  326. package/dist/server/services/content-api/wrap-resolvers.js.map +1 -0
  327. package/dist/server/services/content-api/wrap-resolvers.mjs +117 -0
  328. package/dist/server/services/content-api/wrap-resolvers.mjs.map +1 -0
  329. package/dist/server/services/extension/extension.js +84 -0
  330. package/dist/server/services/extension/extension.js.map +1 -0
  331. package/dist/server/services/extension/extension.mjs +63 -0
  332. package/dist/server/services/extension/extension.mjs.map +1 -0
  333. package/dist/server/services/extension/index.js +8 -0
  334. package/dist/server/services/extension/index.js.map +1 -0
  335. package/dist/server/services/extension/index.mjs +6 -0
  336. package/dist/server/services/extension/index.mjs.map +1 -0
  337. package/dist/server/services/extension/shadow-crud-manager.js +121 -0
  338. package/dist/server/services/extension/shadow-crud-manager.js.map +1 -0
  339. package/dist/server/services/extension/shadow-crud-manager.mjs +119 -0
  340. package/dist/server/services/extension/shadow-crud-manager.mjs.map +1 -0
  341. package/dist/server/services/format/index.js +10 -0
  342. package/dist/server/services/format/index.js.map +1 -0
  343. package/dist/server/services/format/index.mjs +8 -0
  344. package/dist/server/services/format/index.mjs.map +1 -0
  345. package/dist/server/services/format/return-types.js +27 -0
  346. package/dist/server/services/format/return-types.js.map +1 -0
  347. package/dist/server/services/format/return-types.mjs +25 -0
  348. package/dist/server/services/format/return-types.mjs.map +1 -0
  349. package/dist/server/services/index.js +24 -0
  350. package/dist/server/services/index.js.map +1 -0
  351. package/dist/server/services/index.mjs +22 -0
  352. package/dist/server/services/index.mjs.map +1 -0
  353. package/dist/server/services/internals/args/index.js +14 -0
  354. package/dist/server/services/internals/args/index.js.map +1 -0
  355. package/dist/server/services/internals/args/index.mjs +12 -0
  356. package/dist/server/services/internals/args/index.mjs.map +1 -0
  357. package/dist/server/services/internals/args/pagination.js +20 -0
  358. package/dist/server/services/internals/args/pagination.js.map +1 -0
  359. package/dist/server/services/internals/args/pagination.mjs +18 -0
  360. package/dist/server/services/internals/args/pagination.mjs.map +1 -0
  361. package/dist/server/services/internals/args/publication-status.js +14 -0
  362. package/dist/server/services/internals/args/publication-status.js.map +1 -0
  363. package/dist/server/services/internals/args/publication-status.mjs +12 -0
  364. package/dist/server/services/internals/args/publication-status.mjs.map +1 -0
  365. package/dist/server/services/internals/args/sort.js +11 -0
  366. package/dist/server/services/internals/args/sort.js.map +1 -0
  367. package/dist/server/services/internals/args/sort.mjs +9 -0
  368. package/dist/server/services/internals/args/sort.mjs.map +1 -0
  369. package/dist/server/services/internals/helpers/get-enabled-scalars.js +13 -0
  370. package/dist/server/services/internals/helpers/get-enabled-scalars.js.map +1 -0
  371. package/dist/server/services/internals/helpers/get-enabled-scalars.mjs +11 -0
  372. package/dist/server/services/internals/helpers/get-enabled-scalars.mjs.map +1 -0
  373. package/dist/server/services/internals/helpers/index.js +10 -0
  374. package/dist/server/services/internals/helpers/index.js.map +1 -0
  375. package/dist/server/services/internals/helpers/index.mjs +8 -0
  376. package/dist/server/services/internals/helpers/index.mjs.map +1 -0
  377. package/dist/server/services/internals/index.js +16 -0
  378. package/dist/server/services/internals/index.js.map +1 -0
  379. package/dist/server/services/internals/index.mjs +14 -0
  380. package/dist/server/services/internals/index.mjs.map +1 -0
  381. package/dist/server/services/internals/scalars/date.js +18 -0
  382. package/dist/server/services/internals/scalars/date.js.map +1 -0
  383. package/dist/server/services/internals/scalars/date.mjs +15 -0
  384. package/dist/server/services/internals/scalars/date.mjs.map +1 -0
  385. package/dist/server/services/internals/scalars/index.js +17 -0
  386. package/dist/server/services/internals/scalars/index.js.map +1 -0
  387. package/dist/server/services/internals/scalars/index.mjs +15 -0
  388. package/dist/server/services/internals/scalars/index.mjs.map +1 -0
  389. package/dist/server/services/internals/scalars/time.js +38 -0
  390. package/dist/server/services/internals/scalars/time.js.map +1 -0
  391. package/dist/server/services/internals/scalars/time.mjs +36 -0
  392. package/dist/server/services/internals/scalars/time.mjs.map +1 -0
  393. package/dist/server/services/internals/types/delete-mutation-response.js +18 -0
  394. package/dist/server/services/internals/types/delete-mutation-response.js.map +1 -0
  395. package/dist/server/services/internals/types/delete-mutation-response.mjs +16 -0
  396. package/dist/server/services/internals/types/delete-mutation-response.mjs.map +1 -0
  397. package/dist/server/services/internals/types/error.js +32 -0
  398. package/dist/server/services/internals/types/error.js.map +1 -0
  399. package/dist/server/services/internals/types/error.mjs +30 -0
  400. package/dist/server/services/internals/types/error.mjs.map +1 -0
  401. package/dist/server/services/internals/types/filters.js +35 -0
  402. package/dist/server/services/internals/types/filters.js.map +1 -0
  403. package/dist/server/services/internals/types/filters.mjs +33 -0
  404. package/dist/server/services/internals/types/filters.mjs.map +1 -0
  405. package/dist/server/services/internals/types/index.js +30 -0
  406. package/dist/server/services/internals/types/index.js.map +1 -0
  407. package/dist/server/services/internals/types/index.mjs +28 -0
  408. package/dist/server/services/internals/types/index.mjs.map +1 -0
  409. package/dist/server/services/internals/types/pagination.js +24 -0
  410. package/dist/server/services/internals/types/pagination.js.map +1 -0
  411. package/dist/server/services/internals/types/pagination.mjs +22 -0
  412. package/dist/server/services/internals/types/pagination.mjs.map +1 -0
  413. package/dist/server/services/internals/types/publication-status.js +22 -0
  414. package/dist/server/services/internals/types/publication-status.js.map +1 -0
  415. package/dist/server/services/internals/types/publication-status.mjs +20 -0
  416. package/dist/server/services/internals/types/publication-status.mjs.map +1 -0
  417. package/dist/server/services/internals/types/response-collection-meta.js +27 -0
  418. package/dist/server/services/internals/types/response-collection-meta.js.map +1 -0
  419. package/dist/server/services/internals/types/response-collection-meta.mjs +25 -0
  420. package/dist/server/services/internals/types/response-collection-meta.mjs.map +1 -0
  421. package/dist/server/services/type-registry.js +81 -0
  422. package/dist/server/services/type-registry.js.map +1 -0
  423. package/dist/server/services/type-registry.mjs +79 -0
  424. package/dist/server/services/type-registry.mjs.map +1 -0
  425. package/dist/server/services/utils/attributes.js +65 -0
  426. package/dist/server/services/utils/attributes.js.map +1 -0
  427. package/dist/server/services/utils/attributes.mjs +63 -0
  428. package/dist/server/services/utils/attributes.mjs.map +1 -0
  429. package/dist/server/services/utils/index.js +16 -0
  430. package/dist/server/services/utils/index.js.map +1 -0
  431. package/dist/server/services/utils/index.mjs +14 -0
  432. package/dist/server/services/utils/index.mjs.map +1 -0
  433. package/dist/server/services/utils/mappers/entity-to-response-entity.js +16 -0
  434. package/dist/server/services/utils/mappers/entity-to-response-entity.js.map +1 -0
  435. package/dist/server/services/utils/mappers/entity-to-response-entity.mjs +14 -0
  436. package/dist/server/services/utils/mappers/entity-to-response-entity.mjs.map +1 -0
  437. package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.js +95 -0
  438. package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.js.map +1 -0
  439. package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.mjs +93 -0
  440. package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.mjs.map +1 -0
  441. package/dist/server/services/utils/mappers/graphql-scalar-to-operators.js +15 -0
  442. package/dist/server/services/utils/mappers/graphql-scalar-to-operators.js.map +1 -0
  443. package/dist/server/services/utils/mappers/graphql-scalar-to-operators.mjs +13 -0
  444. package/dist/server/services/utils/mappers/graphql-scalar-to-operators.mjs.map +1 -0
  445. package/dist/server/services/utils/mappers/index.js +16 -0
  446. package/dist/server/services/utils/mappers/index.js.map +1 -0
  447. package/dist/server/services/utils/mappers/index.mjs +14 -0
  448. package/dist/server/services/utils/mappers/index.mjs.map +1 -0
  449. package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.js +23 -0
  450. package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.js.map +1 -0
  451. package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.mjs +21 -0
  452. package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.mjs.map +1 -0
  453. package/dist/server/services/utils/naming.js +187 -0
  454. package/dist/server/services/utils/naming.js.map +1 -0
  455. package/dist/server/services/utils/naming.mjs +185 -0
  456. package/dist/server/services/utils/naming.mjs.map +1 -0
  457. package/dist/server/services/utils/playground.js +19 -0
  458. package/dist/server/services/utils/playground.js.map +1 -0
  459. package/dist/server/services/utils/playground.mjs +17 -0
  460. package/dist/server/services/utils/playground.mjs.map +1 -0
  461. package/package.json +6 -6
  462. package/dist/admin/chunks/dk-Bji21OvY.mjs.map +0 -1
  463. package/dist/admin/chunks/dk-D3k_Atlh.js.map +0 -1
  464. package/dist/admin/chunks/en-COko3s6d.mjs.map +0 -1
  465. package/dist/admin/chunks/en-DzY_FEd6.js.map +0 -1
  466. package/dist/admin/chunks/es-BoUVfXlb.mjs.map +0 -1
  467. package/dist/admin/chunks/es-D02rvX4A.js.map +0 -1
  468. package/dist/admin/chunks/fr-D9dcL-gU.js.map +0 -1
  469. package/dist/admin/chunks/fr-DFbQQgkK.mjs.map +0 -1
  470. package/dist/admin/chunks/pl-Bih5cA3Y.mjs.map +0 -1
  471. package/dist/admin/chunks/pl-DRSWvr2y.js.map +0 -1
  472. package/dist/admin/chunks/ru-Bxi2fB6E.mjs.map +0 -1
  473. package/dist/admin/chunks/ru-zDn7cu6t.js.map +0 -1
  474. package/dist/admin/chunks/sv-B2uIJv_a.mjs.map +0 -1
  475. package/dist/admin/chunks/sv-Dq2aVH0_.js.map +0 -1
  476. package/dist/admin/chunks/tr-B0yEuVnS.js.map +0 -1
  477. package/dist/admin/chunks/tr-DwO6hyQD.mjs.map +0 -1
  478. package/dist/admin/chunks/uk-DJGNjXWk.js.map +0 -1
  479. package/dist/admin/chunks/uk-_25RY9BK.mjs.map +0 -1
  480. package/dist/admin/chunks/zh-BkiTjJnf.js.map +0 -1
  481. package/dist/admin/chunks/zh-DVvz1qsT.mjs.map +0 -1
  482. package/dist/admin/chunks/zh-Hans-DUab611K.mjs.map +0 -1
  483. package/dist/admin/chunks/zh-Hans-DxlDvlSo.js.map +0 -1
@@ -1,3726 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
4
- var server = require('@apollo/server');
5
- var _default = require('@apollo/server/plugin/landingPage/default');
6
- var koa = require('@as-integrations/koa');
7
- var depthLimit = require('graphql-depth-limit');
8
- var bodyParser = require('koa-bodyparser');
9
- var cors = require('@koa/cors');
10
- var utils$2 = require('@strapi/utils');
11
- var errors = require('@apollo/server/errors');
12
- var graphql = require('graphql');
13
- var utils$3 = require('@graphql-tools/utils');
14
- var nexus = require('nexus');
15
- var pluralize = require('pluralize');
16
- var graphqlScalars = require('graphql-scalars');
17
-
18
- function _interopNamespaceDefault(e) {
19
- var n = Object.create(null);
20
- if (e) {
21
- Object.keys(e).forEach(function (k) {
22
- if (k !== 'default') {
23
- var d = Object.getOwnPropertyDescriptor(e, k);
24
- Object.defineProperty(n, k, d.get ? d : {
25
- enumerable: true,
26
- get: function () { return e[k]; }
27
- });
28
- }
29
- });
30
- }
31
- n.default = e;
32
- return Object.freeze(n);
33
- }
34
-
35
- var nexus__namespace = /*#__PURE__*/_interopNamespaceDefault(nexus);
36
-
37
- var defaultConfig = {
38
- shadowCRUD: true,
39
- endpoint: '/graphql',
40
- subscriptions: false,
41
- maxLimit: -1,
42
- apolloServer: {},
43
- v4CompatibilityMode: process.env.STRAPI_GRAPHQL_V4_COMPATIBILITY_MODE ?? false
44
- };
45
-
46
- const config = {
47
- default: defaultConfig
48
- };
49
-
50
- const { HttpError, ForbiddenError: ForbiddenError$1, UnauthorizedError, ApplicationError: ApplicationError$5, ValidationError: ValidationError$3 } = utils$2.errors;
51
- const formatToCode = (name)=>`STRAPI_${fp.toUpper(fp.snakeCase(name))}`;
52
- const formatErrorToExtension = (error)=>({
53
- error: fp.pick([
54
- 'name',
55
- 'message',
56
- 'details'
57
- ])(error)
58
- });
59
- function createFormattedError(formattedError, message, code, originalError) {
60
- const options = {
61
- ...formattedError,
62
- extensions: {
63
- ...formattedError.extensions,
64
- ...formatErrorToExtension(originalError),
65
- code
66
- }
67
- };
68
- return new graphql.GraphQLError(message, options);
69
- }
70
- /**
71
- * The handler for Apollo Server v4's formatError config option
72
- *
73
- * Intercepts specific Strapi error types to send custom error response codes in the GraphQL response
74
- */ function formatGraphqlError(formattedError, error) {
75
- const originalError = errors.unwrapResolverError(error);
76
- // If this error doesn't have an associated originalError, it
77
- if (fp.isEmpty(originalError)) {
78
- return formattedError;
79
- }
80
- const { message = '', name = 'UNKNOWN' } = originalError;
81
- if (originalError instanceof ForbiddenError$1 || originalError instanceof UnauthorizedError) {
82
- return createFormattedError(formattedError, message, 'FORBIDDEN', originalError);
83
- }
84
- if (originalError instanceof ValidationError$3) {
85
- return createFormattedError(formattedError, message, 'BAD_USER_INPUT', originalError);
86
- }
87
- if (originalError instanceof ApplicationError$5 || originalError instanceof HttpError) {
88
- const errorName = formatToCode(name);
89
- return createFormattedError(formattedError, message, errorName, originalError);
90
- }
91
- if (originalError instanceof graphql.GraphQLError) {
92
- return formattedError;
93
- }
94
- // else if originalError doesn't appear to be from Strapi or GraphQL..
95
- // Log the error
96
- strapi.log.error(originalError);
97
- // Create a generic 500 to send so we don't risk leaking any data
98
- return createFormattedError(new graphql.GraphQLError('Internal Server Error'), 'Internal Server Error', 'INTERNAL_SERVER_ERROR', originalError);
99
- }
100
-
101
- const merge = fp.mergeWith((a, b)=>{
102
- if (fp.isArray(a) && fp.isArray(b)) {
103
- return a.concat(b);
104
- }
105
- });
106
- const determineLandingPage = (strapi)=>{
107
- const { config } = strapi.plugin('graphql');
108
- const utils = strapi.plugin('graphql').service('utils');
109
- /**
110
- * configLanding page may be one of the following:
111
- *
112
- * - true: always use "playground" even in production
113
- * - false: never show "playground" even in non-production
114
- * - undefined: default Apollo behavior (hide playground on production)
115
- * - a function that returns an Apollo plugin that implements renderLandingPage
116
- ** */ const configLandingPage = config('landingPage');
117
- const isProduction = process.env.NODE_ENV === 'production';
118
- const localLanding = ()=>{
119
- strapi.log.debug('Apollo landing page: local');
120
- utils.playground.setEnabled(true);
121
- return _default.ApolloServerPluginLandingPageLocalDefault();
122
- };
123
- const prodLanding = ()=>{
124
- strapi.log.debug('Apollo landing page: production');
125
- utils.playground.setEnabled(false);
126
- return _default.ApolloServerPluginLandingPageProductionDefault();
127
- };
128
- const userLanding = (userFunction)=>{
129
- strapi.log.debug('Apollo landing page: from user-defined function...');
130
- const result = userFunction(strapi);
131
- if (result === true) {
132
- return localLanding();
133
- }
134
- if (result === false) {
135
- return prodLanding();
136
- }
137
- strapi.log.debug('Apollo landing page: user-defined');
138
- return result;
139
- };
140
- // DEPRECATED, remove in Strapi v6
141
- const playgroundAlways = config('playgroundAlways');
142
- if (playgroundAlways !== undefined) {
143
- strapi.log.warn('The graphql config playgroundAlways is deprecated. This will be removed in Strapi 6. Please use landingPage instead. ');
144
- }
145
- if (playgroundAlways === false) {
146
- strapi.log.warn('graphql config playgroundAlways:false has no effect, please use landingPage:false to disable Graphql Playground in all environments');
147
- }
148
- if (playgroundAlways || configLandingPage === true) {
149
- return localLanding();
150
- }
151
- // if landing page has been disabled, use production
152
- if (configLandingPage === false) {
153
- return prodLanding();
154
- }
155
- // If user did not define any settings, use our defaults
156
- if (configLandingPage === undefined) {
157
- return isProduction ? prodLanding() : localLanding();
158
- }
159
- // if user provided a landing page function, return that
160
- if (fp.isFunction(configLandingPage)) {
161
- return userLanding(configLandingPage);
162
- }
163
- // If no other setting could be found, default to production settings
164
- strapi.log.warn('Your Graphql landing page has been disabled because there is a problem with your Graphql settings');
165
- return prodLanding();
166
- };
167
- async function bootstrap({ strapi }) {
168
- // Generate the GraphQL schema for the content API
169
- const schema = strapi.plugin('graphql').service('content-api').buildSchema();
170
- if (fp.isEmpty(schema)) {
171
- strapi.log.warn('The GraphQL schema has not been generated because it is empty');
172
- return;
173
- }
174
- const { config } = strapi.plugin('graphql');
175
- const path = config('endpoint');
176
- const landingPage = determineLandingPage(strapi);
177
- const defaultServerConfig = {
178
- // Schema
179
- schema,
180
- // Validation
181
- validationRules: [
182
- depthLimit(config('depthLimit'))
183
- ],
184
- // Errors
185
- formatError: formatGraphqlError,
186
- // Misc
187
- cors: false,
188
- uploads: false,
189
- bodyParserConfig: true,
190
- // send 400 http status instead of 200 for input validation errors
191
- status400ForVariableCoercionErrors: true,
192
- plugins: [
193
- landingPage
194
- ],
195
- cache: 'bounded'
196
- };
197
- const serverConfig = merge(defaultServerConfig, config('apolloServer'));
198
- // Create a new Apollo server
199
- const server$1 = new server.ApolloServer(serverConfig);
200
- try {
201
- // server.start() must be called before using server.applyMiddleware()
202
- await server$1.start();
203
- } catch (error) {
204
- if (error instanceof Error) {
205
- strapi.log.error('Failed to start the Apollo server', error.message);
206
- }
207
- throw error;
208
- }
209
- // Create the route handlers for Strapi
210
- const handler = [];
211
- // add cors middleware
212
- if (cors) {
213
- handler.push(cors());
214
- }
215
- // add koa bodyparser middleware
216
- if (fp.isObject(serverConfig.bodyParserConfig)) {
217
- handler.push(bodyParser(serverConfig.bodyParserConfig));
218
- } else if (serverConfig.bodyParserConfig) {
219
- handler.push(bodyParser());
220
- } else {
221
- strapi.log.debug('Body parser has been disabled for Apollo server');
222
- }
223
- // add the Strapi auth middleware
224
- handler.push((ctx, next)=>{
225
- ctx.state.route = {
226
- info: {
227
- // Indicate it's a content API route
228
- type: 'content-api'
229
- }
230
- };
231
- const isPlaygroundRequest = ctx.request.method === 'GET' && ctx.request.url === path && // Matches the GraphQL endpoint
232
- strapi.plugin('graphql').service('utils').playground.isEnabled() && // Only allow if the Playground is enabled
233
- ctx.request.header.accept?.includes('text/html'); // Specific to Playground UI loading
234
- // Skip authentication for the GraphQL Playground UI
235
- if (isPlaygroundRequest) {
236
- return next();
237
- }
238
- return strapi.auth.authenticate(ctx, next);
239
- });
240
- // add the graphql server for koa
241
- handler.push(koa.koaMiddleware(server$1, {
242
- // Initialize loaders for this request.
243
- context: async ({ ctx })=>({
244
- state: ctx.state,
245
- koaContext: ctx
246
- })
247
- }));
248
- // now that handlers are set up, add the graphql route to our apollo server
249
- strapi.server.routes([
250
- {
251
- method: 'ALL',
252
- path,
253
- handler,
254
- config: {
255
- auth: false
256
- }
257
- }
258
- ]);
259
- // Register destroy behavior
260
- // We're doing it here instead of exposing a destroy method to the strapi-server.js
261
- // file since we need to have access to the ApolloServer instance
262
- strapi.plugin('graphql').destroy = async ()=>{
263
- await server$1.stop();
264
- };
265
- }
266
-
267
- const { PolicyError } = utils$2.errors;
268
- const getPoliciesConfig = fp.propOr([], 'policies');
269
- const createPoliciesMiddleware = (resolverConfig, { strapi })=>{
270
- const resolverPolicies = getPoliciesConfig(resolverConfig);
271
- const policies = strapi.get('policies').resolve(resolverPolicies, {});
272
- return async (resolve, parent, args, context, info)=>{
273
- // Create a graphql policy context
274
- const policyContext = createGraphQLPolicyContext(parent, args, context, info);
275
- // Run policies & throw an error if one of them fails
276
- for (const { handler, config } of policies){
277
- const result = await handler(policyContext, config, {
278
- strapi
279
- });
280
- if (![
281
- true,
282
- undefined
283
- ].includes(result)) {
284
- throw new PolicyError();
285
- }
286
- }
287
- return resolve(parent, args, context, info);
288
- };
289
- };
290
- const createGraphQLPolicyContext = (parent, args, context, info)=>{
291
- const policyContext = {
292
- get parent () {
293
- return parent;
294
- },
295
- get args () {
296
- return args;
297
- },
298
- get context () {
299
- return context;
300
- },
301
- get info () {
302
- return info;
303
- },
304
- get state () {
305
- return this.context.state;
306
- },
307
- get http () {
308
- return this.context.koaContext;
309
- }
310
- };
311
- return utils$2.policy.createPolicyContext('graphql', policyContext);
312
- };
313
-
314
- const { ForbiddenError } = utils$2.errors;
315
- const introspectionQueries = [
316
- '__Schema',
317
- '__Type',
318
- '__Field',
319
- '__InputValue',
320
- '__EnumValue',
321
- '__Directive'
322
- ];
323
- /**
324
- * Get & parse middlewares definitions from the resolver's config
325
- * @param {object} resolverConfig
326
- * @param {object} strapi
327
- * @return {function[]}
328
- */ const parseMiddlewares = (resolverConfig, strapi)=>{
329
- const resolverMiddlewares = fp.getOr([], 'middlewares', resolverConfig);
330
- // TODO: [v4] to factorize with compose endpoints (routes)
331
- return resolverMiddlewares.map((middleware)=>{
332
- if (fp.isFunction(middleware)) {
333
- return middleware;
334
- }
335
- if (typeof middleware === 'string') {
336
- return strapi.middleware(middleware);
337
- }
338
- if (typeof middleware === 'object') {
339
- const { name, options = {} } = middleware;
340
- return strapi.middleware(name)(options, {
341
- strapi
342
- });
343
- }
344
- throw new Error(`Invalid middleware type, expected (function,string,object), received ${typeof middleware}`);
345
- });
346
- };
347
- /**
348
- * Wrap the schema's resolvers if they've been
349
- * customized using the GraphQL extension service
350
- * @param {object} options
351
- * @param {GraphQLSchema} options.schema
352
- * @param {object} options.strapi
353
- * @param {object} options.extension
354
- * @return {GraphQLSchema}
355
- */ const wrapResolvers = ({ schema, strapi, extension = {} })=>{
356
- // Get all the registered resolvers configuration
357
- const { resolversConfig = {} } = extension;
358
- // Fields filters
359
- const isValidFieldName = (field)=>!field.startsWith('__');
360
- const typeMap = schema.getTypeMap();
361
- Object.entries(typeMap).forEach(([type, definition])=>{
362
- const isGraphQLObjectType = definition instanceof graphql.GraphQLObjectType;
363
- const isIgnoredType = introspectionQueries.includes(type);
364
- if (!isGraphQLObjectType || isIgnoredType) {
365
- return;
366
- }
367
- const fields = definition.getFields();
368
- const fieldsToProcess = Object.entries(fields).filter(([field])=>isValidFieldName(field));
369
- for (const [fieldName, fieldDefinition] of fieldsToProcess){
370
- const defaultResolver = fp.get(fieldName);
371
- const path = `${type}.${fieldName}`;
372
- const resolverConfig = fp.getOr({}, path, resolversConfig);
373
- const { resolve: baseResolver = defaultResolver } = fieldDefinition;
374
- // Parse & initialize the middlewares
375
- const middlewares = parseMiddlewares(resolverConfig, strapi);
376
- // Generate the policy middleware
377
- const policyMiddleware = createPoliciesMiddleware(resolverConfig, {
378
- strapi
379
- });
380
- // Add the policyMiddleware at the end of the middlewares collection
381
- middlewares.push(policyMiddleware);
382
- // Bind every middleware to the next one
383
- const boundMiddlewares = middlewares.map((middleware, index, collection)=>{
384
- return (parents, args, context, info)=>middleware(// Make sure the last middleware in the list calls the baseResolver
385
- index >= collection.length - 1 ? baseResolver : boundMiddlewares[index + 1], parents, args, context, info);
386
- });
387
- /**
388
- * GraphQL authorization flow
389
- * @param {object} context
390
- * @return {Promise<void>}
391
- */ const authorize = async ({ context })=>{
392
- const authConfig = fp.get('auth', resolverConfig);
393
- const authContext = fp.get('state.auth', context);
394
- const isValidType = [
395
- 'Mutation',
396
- 'Query',
397
- 'Subscription'
398
- ].includes(type);
399
- const hasConfig = !fp.isNil(authConfig);
400
- const isAuthDisabled = authConfig === false;
401
- if ((isValidType || hasConfig) && !isAuthDisabled) {
402
- try {
403
- await strapi.auth.verify(authContext, authConfig);
404
- } catch (error) {
405
- throw new ForbiddenError();
406
- }
407
- }
408
- };
409
- /**
410
- * Base resolver wrapper that handles authorization, middlewares & policies
411
- * @return {Promise<any>}
412
- */ fieldDefinition.resolve = async (parent, args, context, info)=>{
413
- await authorize({
414
- context
415
- });
416
- // Execute middlewares (including the policy middleware which will always be included)
417
- return fp.first(boundMiddlewares)(parent, args, context, info);
418
- };
419
- }
420
- });
421
- return schema;
422
- };
423
-
424
- const registerCollectionType = (contentType, { registry, strapi, builders })=>{
425
- const { service: getService } = strapi.plugin('graphql');
426
- const { naming } = getService('utils');
427
- const { KINDS } = getService('constants');
428
- const extension = getService('extension');
429
- // Types name (as string)
430
- const types = {
431
- base: naming.getTypeName(contentType),
432
- entity: naming.getEntityName(contentType),
433
- response: naming.getEntityResponseName(contentType),
434
- responseCollection: naming.getEntityResponseCollectionName(contentType),
435
- relationResponseCollection: naming.getRelationResponseCollectionName(contentType),
436
- queries: naming.getEntityQueriesTypeName(contentType),
437
- mutations: naming.getEntityMutationsTypeName(contentType)
438
- };
439
- const getConfig = (kind)=>({
440
- kind,
441
- contentType
442
- });
443
- // Type definition
444
- registry.register(types.base, builders.buildTypeDefinition(contentType), getConfig(KINDS.type));
445
- // Higher level entity definition
446
- registry.register(types.entity, builders.buildEntityDefinition(contentType), getConfig(KINDS.entity));
447
- // Responses definition
448
- registry.register(types.response, builders.buildResponseDefinition(contentType), getConfig(KINDS.entityResponse));
449
- registry.register(types.responseCollection, builders.buildResponseCollectionDefinition(contentType), getConfig(KINDS.entityResponseCollection));
450
- registry.register(types.relationResponseCollection, builders.buildRelationResponseCollectionDefinition(contentType), getConfig(KINDS.relationResponseCollection));
451
- if (extension.shadowCRUD(contentType.uid).areQueriesEnabled()) {
452
- // Query extensions
453
- registry.register(types.queries, builders.buildCollectionTypeQueries(contentType), getConfig(KINDS.query));
454
- }
455
- if (extension.shadowCRUD(contentType.uid).areMutationsEnabled()) {
456
- // Mutation extensions
457
- registry.register(types.mutations, builders.buildCollectionTypeMutations(contentType), getConfig(KINDS.mutation));
458
- }
459
- };
460
-
461
- const registerSingleType = (contentType, { registry, strapi, builders })=>{
462
- const { service: getService } = strapi.plugin('graphql');
463
- const { naming } = getService('utils');
464
- const { KINDS } = getService('constants');
465
- const extension = getService('extension');
466
- const types = {
467
- base: naming.getTypeName(contentType),
468
- entity: naming.getEntityName(contentType),
469
- response: naming.getEntityResponseName(contentType),
470
- responseCollection: naming.getEntityResponseCollectionName(contentType),
471
- relationResponseCollection: naming.getRelationResponseCollectionName(contentType),
472
- queries: naming.getEntityQueriesTypeName(contentType),
473
- mutations: naming.getEntityMutationsTypeName(contentType)
474
- };
475
- const getConfig = (kind)=>({
476
- kind,
477
- contentType
478
- });
479
- // Single type's definition
480
- registry.register(types.base, builders.buildTypeDefinition(contentType), getConfig(KINDS.type));
481
- // Higher level entity definition
482
- registry.register(types.entity, builders.buildEntityDefinition(contentType), getConfig(KINDS.entity));
483
- // Responses definition
484
- registry.register(types.response, builders.buildResponseDefinition(contentType), getConfig(KINDS.entityResponse));
485
- // Response collection definition
486
- registry.register(types.responseCollection, builders.buildResponseCollectionDefinition(contentType), getConfig(KINDS.entityResponseCollection));
487
- registry.register(types.relationResponseCollection, builders.buildRelationResponseCollectionDefinition(contentType), getConfig(KINDS.relationResponseCollection));
488
- if (extension.shadowCRUD(contentType.uid).areQueriesEnabled()) {
489
- // Queries
490
- registry.register(types.queries, builders.buildSingleTypeQueries(contentType), getConfig(KINDS.query));
491
- }
492
- if (extension.shadowCRUD(contentType.uid).areMutationsEnabled()) {
493
- // Mutations
494
- registry.register(types.mutations, builders.buildSingleTypeMutations(contentType), getConfig(KINDS.mutation));
495
- }
496
- };
497
-
498
- const registerComponent = (contentType, { registry, strapi, builders })=>{
499
- const { service: getService } = strapi.plugin('graphql');
500
- const { getComponentName } = getService('utils').naming;
501
- const { KINDS } = getService('constants');
502
- const name = getComponentName(contentType);
503
- const definition = builders.buildTypeDefinition(contentType);
504
- registry.register(name, definition, {
505
- kind: KINDS.component,
506
- contentType
507
- });
508
- };
509
-
510
- const registerPolymorphicContentType = (contentType, { registry, strapi })=>{
511
- const { service: getService } = strapi.plugin('graphql');
512
- const { naming, attributes: { isMorphRelation } } = getService('utils');
513
- const { KINDS } = getService('constants');
514
- const { attributes = {} } = contentType;
515
- // Isolate its polymorphic attributes
516
- const morphAttributes = Object.entries(attributes).filter(([, attribute])=>isMorphRelation(attribute));
517
- // For each one of those polymorphic attribute
518
- for (const [attributeName, attribute] of morphAttributes){
519
- const name = naming.getMorphRelationTypeName(contentType, attributeName);
520
- const { target } = attribute;
521
- // Ignore those whose target is not an array
522
- if (!Array.isArray(target)) {
523
- continue;
524
- }
525
- // Transform target UIDs into types names
526
- const members = target// Get content types definitions
527
- .map((uid)=>strapi.getModel(uid))// Resolve types names
528
- .map((contentType)=>naming.getTypeName(contentType));
529
- // Register the new polymorphic union type
530
- registry.register(name, nexus.unionType({
531
- name,
532
- resolveType (obj) {
533
- const contentType = strapi.getModel(obj.__type);
534
- if (!contentType) {
535
- return null;
536
- }
537
- if (contentType.modelType === 'component') {
538
- return naming.getComponentName(contentType);
539
- }
540
- return naming.getTypeName(contentType);
541
- },
542
- definition (t) {
543
- t.members(...members);
544
- }
545
- }), {
546
- kind: KINDS.morph,
547
- contentType,
548
- attributeName
549
- });
550
- }
551
- };
552
-
553
- const registerScalars = ({ registry, strapi })=>{
554
- const { service: getService } = strapi.plugin('graphql');
555
- const { scalars } = getService('internals');
556
- const { KINDS } = getService('constants');
557
- Object.entries(scalars).forEach(([name, definition])=>{
558
- registry.register(name, definition, {
559
- kind: KINDS.scalar
560
- });
561
- });
562
- };
563
-
564
- const registerInternals = ({ registry, strapi })=>{
565
- const { buildInternalTypes } = strapi.plugin('graphql').service('internals');
566
- const internalTypes = buildInternalTypes({
567
- strapi
568
- });
569
- for (const [kind, definitions] of Object.entries(internalTypes)){
570
- registry.registerMany(Object.entries(definitions), {
571
- kind
572
- });
573
- }
574
- };
575
-
576
- const registerDynamicZonesDefinition = (contentType, { registry, strapi, builders })=>{
577
- const { service: getService } = strapi.plugin('graphql');
578
- const { naming, attributes: { isDynamicZone } } = getService('utils');
579
- const { KINDS } = getService('constants');
580
- const { attributes } = contentType;
581
- const dynamicZoneAttributes = Object.keys(attributes).filter((attributeName)=>isDynamicZone(attributes[attributeName]));
582
- for (const attributeName of dynamicZoneAttributes){
583
- const attribute = attributes[attributeName];
584
- const dzName = naming.getDynamicZoneName(contentType, attributeName);
585
- const dzInputName = naming.getDynamicZoneInputName(contentType, attributeName);
586
- const [type, input] = builders.buildDynamicZoneDefinition(attribute, dzName, dzInputName);
587
- const baseConfig = {
588
- contentType,
589
- attributeName,
590
- attribute
591
- };
592
- registry.register(dzName, type, {
593
- kind: KINDS.dynamicZone,
594
- ...baseConfig
595
- });
596
- registry.register(dzInputName, input, {
597
- kind: KINDS.input,
598
- ...baseConfig
599
- });
600
- }
601
- };
602
-
603
- const registerEnumsDefinition = (contentType, { registry, strapi, builders })=>{
604
- const { service: getService } = strapi.plugin('graphql');
605
- const { naming, attributes: { isEnumeration } } = getService('utils');
606
- const { KINDS } = getService('constants');
607
- const { attributes } = contentType;
608
- const enumAttributes = Object.keys(attributes).filter((attributeName)=>isEnumeration(attributes[attributeName]));
609
- for (const attributeName of enumAttributes){
610
- const attribute = attributes[attributeName];
611
- const enumName = naming.getEnumName(contentType, attributeName);
612
- const enumDefinition = builders.buildEnumTypeDefinition(attribute, enumName);
613
- registry.register(enumName, enumDefinition, {
614
- kind: KINDS.enum,
615
- contentType,
616
- attributeName,
617
- attribute
618
- });
619
- }
620
- };
621
-
622
- const registerInputsDefinition = (contentType, { registry, strapi, builders })=>{
623
- const { service: getService } = strapi.plugin('graphql');
624
- const { getComponentInputName, getContentTypeInputName } = getService('utils').naming;
625
- const { KINDS } = getService('constants');
626
- const { modelType } = contentType;
627
- const type = (modelType === 'component' ? getComponentInputName : getContentTypeInputName).call(null, contentType);
628
- const definition = builders.buildInputType(contentType);
629
- registry.register(type, definition, {
630
- kind: KINDS.input,
631
- contentType
632
- });
633
- };
634
-
635
- const registerFiltersDefinition = (contentType, { registry, strapi, builders })=>{
636
- const { service: getService } = strapi.plugin('graphql');
637
- const { getFiltersInputTypeName } = getService('utils').naming;
638
- const { KINDS } = getService('constants');
639
- const type = getFiltersInputTypeName(contentType);
640
- const definition = builders.buildContentTypeFilters(contentType);
641
- registry.register(type, definition, {
642
- kind: KINDS.filtersInput,
643
- contentType
644
- });
645
- };
646
-
647
- var contentAPI = (({ strapi })=>{
648
- // eslint-disable-next-line @typescript-eslint/no-var-requires
649
- const { mergeSchemas, addResolversToSchema } = require('@graphql-tools/schema');
650
- const { service: getGraphQLService } = strapi.plugin('graphql');
651
- const { config } = strapi.plugin('graphql');
652
- const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');
653
- const extensionService = getGraphQLService('extension');
654
- // Type Registry
655
- let registry;
656
- // Builders Instances
657
- let builders;
658
- const buildSchema = ()=>{
659
- const isShadowCRUDEnabled = !!config('shadowCRUD');
660
- // Create a new empty type registry
661
- registry = getGraphQLService('type-registry').new();
662
- // Reset the builders instances associated to the
663
- // content-api, and link the new type registry
664
- builders = getGraphQLService('builders').new('content-api', registry);
665
- registerScalars({
666
- registry,
667
- strapi
668
- });
669
- registerInternals({
670
- registry,
671
- strapi
672
- });
673
- if (isShadowCRUDEnabled) {
674
- shadowCRUD();
675
- }
676
- // Build a merged schema from both Nexus types & SDL type definitions
677
- const schema = buildMergedSchema({
678
- registry
679
- });
680
- // Generate the extension configuration for the content API.
681
- // This extension instance needs to be generated after the Nexus schema's
682
- // generation, so that configurations created during types definitions
683
- // can be registered before being used in the wrap resolvers operation
684
- const extension = extensionService.generate({
685
- typeRegistry: registry
686
- });
687
- // Add the extension's resolvers to the final schema
688
- const schemaWithResolvers = addResolversToSchema({
689
- schema,
690
- resolvers: extension.resolvers
691
- });
692
- // Create a configuration object for the artifacts generation
693
- const outputs = {
694
- schema: config('artifacts.schema', false),
695
- typegen: config('artifacts.typegen', false)
696
- };
697
- const currentEnv = strapi.config.get('environment');
698
- const nexusSchema = nexus.makeSchema({
699
- types: [],
700
- // Build the schema from the merged GraphQL schema.
701
- // Since we're passing the schema to the mergeSchema property, it'll transform our SDL type definitions
702
- // into Nexus type definition, thus allowing them to be handled by Nexus plugins & other processing
703
- mergeSchema: {
704
- schema: schemaWithResolvers
705
- },
706
- // Apply user-defined plugins
707
- plugins: extension.plugins,
708
- // Whether to generate artifacts (GraphQL schema, TS types definitions) or not.
709
- // By default, we generate artifacts only on development environment
710
- shouldGenerateArtifacts: config('generateArtifacts', currentEnv === 'development'),
711
- // Artifacts generation configuration
712
- outputs
713
- });
714
- // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension
715
- const wrappedNexusSchema = wrapResolvers({
716
- schema: nexusSchema,
717
- strapi,
718
- extension
719
- });
720
- // Prune schema, remove unused types
721
- // eg: removes registered subscriptions if they're disabled in the config)
722
- const prunedNexusSchema = utils$3.pruneSchema(wrappedNexusSchema);
723
- return prunedNexusSchema;
724
- };
725
- const buildMergedSchema = ({ registry })=>{
726
- // Here we extract types, plugins & typeDefs from a temporary generated
727
- // extension since there won't be any addition allowed after schemas generation
728
- const { types, typeDefs = [] } = extensionService.generate({
729
- typeRegistry: registry
730
- });
731
- // Nexus schema built with user-defined & shadow CRUD auto generated Nexus types
732
- const nexusSchema = nexus.makeSchema({
733
- types: [
734
- registry.definitions,
735
- types
736
- ]
737
- });
738
- // Merge type definitions with the Nexus schema
739
- return mergeSchemas({
740
- typeDefs,
741
- // Give access to the shadowCRUD & nexus based types
742
- // Note: This is necessary so that types defined in SDL can reference types defined with Nexus
743
- schemas: [
744
- nexusSchema
745
- ]
746
- });
747
- };
748
- const shadowCRUD = ()=>{
749
- const extensionService = getGraphQLService('extension');
750
- // Get every content type & component defined in Strapi
751
- const contentTypes = [
752
- ...Object.values(strapi.components),
753
- ...Object.values(strapi.contentTypes)
754
- ];
755
- // Disable Shadow CRUD for admin content types
756
- contentTypes.map(fp.prop('uid')).filter(fp.startsWith('admin::')).forEach((uid)=>extensionService.shadowCRUD(uid).disable());
757
- const contentTypesWithShadowCRUD = contentTypes.filter((ct)=>extensionService.shadowCRUD(ct.uid).isEnabled());
758
- // Generate and register definitions for every content type
759
- registerAPITypes(contentTypesWithShadowCRUD);
760
- // Generate and register polymorphic types' definitions
761
- registerMorphTypes(contentTypesWithShadowCRUD);
762
- };
763
- /**
764
- * Register needed GraphQL types for every content type
765
- * @param {object[]} contentTypes
766
- */ const registerAPITypes = (contentTypes)=>{
767
- for (const contentType of contentTypes){
768
- const { modelType } = contentType;
769
- const registerOptions = {
770
- registry,
771
- strapi,
772
- builders
773
- };
774
- // Generate various types associated to the content type
775
- // (enums, dynamic-zones, filters, inputs...)
776
- registerEnumsDefinition(contentType, registerOptions);
777
- registerDynamicZonesDefinition(contentType, registerOptions);
778
- registerFiltersDefinition(contentType, registerOptions);
779
- registerInputsDefinition(contentType, registerOptions);
780
- // Generate & register component's definition
781
- if (modelType === 'component') {
782
- registerComponent(contentType, registerOptions);
783
- continue;
784
- }
785
- const { kind } = contentType;
786
- // Generate & register single type's definition
787
- if (kind === 'singleType') {
788
- registerSingleType(contentType, registerOptions);
789
- } else if (kind === 'collectionType') {
790
- registerCollectionType(contentType, registerOptions);
791
- }
792
- }
793
- };
794
- const registerMorphTypes = (contentTypes)=>{
795
- // Create & register a union type that includes every type or component registered
796
- const genericMorphType = builders.buildGenericMorphDefinition();
797
- registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, {
798
- kind: KINDS.morph
799
- });
800
- for (const contentType of contentTypes){
801
- registerPolymorphicContentType(contentType, {
802
- registry,
803
- strapi
804
- });
805
- }
806
- };
807
- return {
808
- buildSchema
809
- };
810
- });
811
-
812
- const { ApplicationError: ApplicationError$4 } = utils$2.errors;
813
- /**
814
- * Create a new type registry
815
- */ const createTypeRegistry = ()=>{
816
- const registry = new Map();
817
- const typeRegistry = {
818
- /**
819
- * Register a new type definition
820
- */ register (name, definition, config = {}) {
821
- if (registry.has(name)) {
822
- throw new ApplicationError$4(`"${name}" has already been registered`);
823
- }
824
- registry.set(name, {
825
- name,
826
- definition,
827
- config
828
- });
829
- return this;
830
- },
831
- /**
832
- * Register many types definitions at once
833
- * @param {[string, NexusAcceptedTypeDef][]} definitionsEntries
834
- * @param {object | function} [config]
835
- */ registerMany (definitionsEntries, config = {}) {
836
- for (const [name, definition] of definitionsEntries){
837
- this.register(name, definition, fp.isFunction(config) ? config(name, definition) : config);
838
- }
839
- return this;
840
- },
841
- /**
842
- * Check if the given type name has already been added to the registry
843
- * @param {string} name
844
- * @return {boolean}
845
- */ has (name) {
846
- return registry.has(name);
847
- },
848
- /**
849
- * Get the type definition for `name`
850
- * @param {string} name - The name of the type
851
- */ get (name) {
852
- return registry.get(name);
853
- },
854
- /**
855
- * Transform and return the registry as an object
856
- * @return {Object<string, RegisteredTypeDef>}
857
- */ toObject () {
858
- return Object.fromEntries(registry.entries());
859
- },
860
- /**
861
- * Return the name of every registered type
862
- * @return {string[]}
863
- */ get types () {
864
- return Array.from(registry.keys());
865
- },
866
- /**
867
- * Return all the registered definitions as an array
868
- * @return {RegisteredTypeDef[]}
869
- */ get definitions () {
870
- return Array.from(registry.values());
871
- },
872
- /**
873
- * Filter and return the types definitions that matches the given predicate
874
- * @param {function(RegisteredTypeDef): boolean} predicate
875
- * @return {RegisteredTypeDef[]}
876
- */ where (predicate) {
877
- return this.definitions.filter(predicate);
878
- }
879
- };
880
- return typeRegistry;
881
- };
882
- var typeRegistry = (()=>({
883
- new: createTypeRegistry
884
- }));
885
-
886
- const { ApplicationError: ApplicationError$3 } = utils$2.errors;
887
- var strapiScalarToGraphQLScalar = (({ strapi })=>{
888
- const { STRAPI_SCALARS, SCALARS_ASSOCIATIONS } = strapi.plugin('graphql').service('constants');
889
- const missingStrapiScalars = fp.difference(STRAPI_SCALARS, Object.keys(SCALARS_ASSOCIATIONS));
890
- if (missingStrapiScalars.length > 0) {
891
- throw new ApplicationError$3('Some Strapi scalars are not handled in the GraphQL scalars mapper');
892
- }
893
- return {
894
- /**
895
- * Used to transform a Strapi scalar type into its GraphQL equivalent
896
- */ strapiScalarToGraphQLScalar (strapiScalar) {
897
- return fp.get(strapiScalar, SCALARS_ASSOCIATIONS);
898
- }
899
- };
900
- });
901
-
902
- // todo[v4]: Find a way to get that dynamically
903
- const virtualScalarAttributes = [
904
- 'id',
905
- 'documentId'
906
- ];
907
- var graphQLFiltersToStrapiQuery = (({ strapi })=>{
908
- const { service: getService } = strapi.plugin('graphql');
909
- const recursivelyReplaceScalarOperators = (data)=>{
910
- const { operators } = getService('builders').filters;
911
- if (Array.isArray(data)) {
912
- return data.map(recursivelyReplaceScalarOperators);
913
- }
914
- // Note: We need to make an exception for date since GraphQL
915
- // automatically cast date strings to date instances in args
916
- if (fp.isDate(data) || !fp.isObject(data)) {
917
- return data;
918
- }
919
- const result = {};
920
- for (const [key, value] of Object.entries(data)){
921
- const isOperator = !!operators[key];
922
- const newKey = isOperator ? operators[key].strapiOperator : key;
923
- result[newKey] = recursivelyReplaceScalarOperators(value);
924
- }
925
- return result;
926
- };
927
- return {
928
- /**
929
- * Transform one or many GraphQL filters object into a valid Strapi query
930
- * @param {object | object[]} filters
931
- * @param {object} contentType
932
- * @return {object | object[]}
933
- */ graphQLFiltersToStrapiQuery (filters, contentType) {
934
- const { isStrapiScalar, isMedia, isRelation, isComponent } = getService('utils').attributes;
935
- const { operators } = getService('builders').filters;
936
- const ROOT_LEVEL_OPERATORS = [
937
- operators.and,
938
- operators.or,
939
- operators.not
940
- ];
941
- // Handle unwanted scenario where there is no filters defined
942
- if (fp.isNil(filters)) {
943
- return {};
944
- }
945
- // If filters is a collection, then apply the transformation to every item of the list
946
- if (Array.isArray(filters)) {
947
- return filters.map((filtersItem)=>this.graphQLFiltersToStrapiQuery(filtersItem, contentType));
948
- }
949
- const resultMap = {};
950
- const { attributes } = contentType;
951
- const isAttribute = (attributeName)=>{
952
- return virtualScalarAttributes.includes(attributeName) || fp.has(attributeName, attributes);
953
- };
954
- for (const [key, value] of Object.entries(filters)){
955
- // If the key is an attribute, update the value
956
- if (isAttribute(key)) {
957
- const attribute = attributes[key];
958
- // If it's a scalar attribute
959
- if (virtualScalarAttributes.includes(key) || isStrapiScalar(attribute)) {
960
- // Replace (recursively) every GraphQL scalar operator with the associated Strapi operator
961
- resultMap[key] = recursivelyReplaceScalarOperators(value);
962
- } else if (isRelation(attribute) || isMedia(attribute)) {
963
- // Fetch the model from the relation
964
- const relModel = strapi.getModel(attribute.target);
965
- // Recursively apply the mapping to the value using the fetched model,
966
- // and update the value within `resultMap`
967
- resultMap[key] = this.graphQLFiltersToStrapiQuery(value, relModel);
968
- } else if (isComponent(attribute)) {
969
- // Fetch the model from the component attribute
970
- const componentModel = strapi.getModel(attribute.component);
971
- // Recursively apply the mapping to the value using the fetched model,
972
- // and update the value within `resultMap`
973
- resultMap[key] = this.graphQLFiltersToStrapiQuery(value, componentModel);
974
- }
975
- } else {
976
- const rootLevelOperator = ROOT_LEVEL_OPERATORS.find(fp.propEq('fieldName', key));
977
- // If it's a root level operator (AND, NOT, OR, ...)
978
- if (rootLevelOperator) {
979
- const { strapiOperator } = rootLevelOperator;
980
- // Transform the current value recursively and add it to the resultMap
981
- // object using the strapiOperator equivalent of the GraphQL key
982
- resultMap[strapiOperator] = this.graphQLFiltersToStrapiQuery(value, contentType);
983
- }
984
- }
985
- }
986
- return resultMap;
987
- }
988
- };
989
- });
990
-
991
- var graphqlScalarToOperators = (({ strapi })=>({
992
- graphqlScalarToOperators (graphqlScalar) {
993
- const { GRAPHQL_SCALAR_OPERATORS } = strapi.plugin('graphql').service('constants');
994
- const { operators } = strapi.plugin('graphql').service('builders').filters;
995
- const associations = fp.mapValues(fp.map((operatorName)=>operators[operatorName]), GRAPHQL_SCALAR_OPERATORS);
996
- return fp.get(graphqlScalar, associations);
997
- }
998
- }));
999
-
1000
- const entityToResponseEntity = (entity)=>({
1001
- id: entity.id,
1002
- attributes: entity
1003
- });
1004
- const entitiesToResponseEntities = fp.map(entityToResponseEntity);
1005
- var entityToResponseEntity$1 = (()=>({
1006
- entityToResponseEntity,
1007
- entitiesToResponseEntities
1008
- }));
1009
-
1010
- var mappers = ((context)=>({
1011
- ...strapiScalarToGraphQLScalar(context),
1012
- ...graphQLFiltersToStrapiQuery(context),
1013
- ...graphqlScalarToOperators(context),
1014
- ...entityToResponseEntity$1()
1015
- }));
1016
-
1017
- var attributes = (({ strapi })=>{
1018
- /**
1019
- * Check if the given attribute is a Strapi scalar
1020
- * @param {object} attribute
1021
- * @return {boolean}
1022
- */ const isStrapiScalar = (attribute)=>{
1023
- return strapi.plugin('graphql').service('constants').STRAPI_SCALARS.includes(attribute.type);
1024
- };
1025
- /**
1026
- * Check if the given attribute is a GraphQL scalar
1027
- * @param {object} attribute
1028
- * @return {boolean}
1029
- */ const isGraphQLScalar = (attribute)=>{
1030
- return strapi.plugin('graphql').service('constants').GRAPHQL_SCALARS.includes(attribute.type);
1031
- };
1032
- /**
1033
- * Check if the given attribute is a polymorphic relation
1034
- * @param {object} attribute
1035
- * @return {boolean}
1036
- */ const isMorphRelation = (attribute)=>{
1037
- return attribute.type === 'relation' && attribute.relation.includes('morph');
1038
- };
1039
- /**
1040
- * Check if the given attribute is a media
1041
- * @param {object} attribute
1042
- * @return {boolean}
1043
- */ const isMedia = fp.propEq('type', 'media');
1044
- /**
1045
- * Check if the given attribute is a relation
1046
- * @param {object} attribute
1047
- * @return {boolean}
1048
- */ const isRelation = fp.propEq('type', 'relation');
1049
- /**
1050
- * Check if the given attribute is an enum
1051
- * @param {object} attribute
1052
- * @return {boolean}
1053
- */ const isEnumeration = fp.propEq('type', 'enumeration');
1054
- /**
1055
- * Check if the given attribute is a component
1056
- * @param {object} attribute
1057
- * @return {boolean}
1058
- */ const isComponent = fp.propEq('type', 'component');
1059
- /**
1060
- * Check if the given attribute is a dynamic zone
1061
- * @param {object} attribute
1062
- * @return {boolean}
1063
- */ const isDynamicZone = fp.propEq('type', 'dynamiczone');
1064
- return {
1065
- isStrapiScalar,
1066
- isGraphQLScalar,
1067
- isMorphRelation,
1068
- isMedia,
1069
- isRelation,
1070
- isEnumeration,
1071
- isComponent,
1072
- isDynamicZone
1073
- };
1074
- });
1075
-
1076
- const { ApplicationError: ApplicationError$2 } = utils$2.errors;
1077
- var naming = (({ strapi })=>{
1078
- /**
1079
- * Build a type name for a enum based on a content type & an attribute name
1080
- */ const getEnumName = (contentType, attributeName)=>{
1081
- const { attributes } = contentType;
1082
- const { enumName } = attributes[attributeName];
1083
- const { modelType } = contentType;
1084
- const typeName = modelType === 'component' ? getComponentName(contentType) : getTypeName(contentType);
1085
- const defaultEnumName = `ENUM_${typeName.toUpperCase()}_${attributeName.toUpperCase()}`;
1086
- return enumName || defaultEnumName;
1087
- };
1088
- /**
1089
- * Build the base type name for a given content type
1090
- */ const getTypeName = (contentType, { plurality = 'singular' } = {})=>{
1091
- const plugin = fp.get('plugin', contentType);
1092
- const modelName = fp.get('modelName', contentType);
1093
- const name = plurality === 'singular' ? fp.get('info.singularName', contentType) : fp.get('info.pluralName', contentType);
1094
- const transformedPlugin = fp.upperFirst(fp.camelCase(plugin));
1095
- const transformedModelName = fp.upperFirst(fp.camelCase(name || pluralize.singular(modelName)));
1096
- return `${transformedPlugin}${transformedModelName}`;
1097
- };
1098
- /**
1099
- * Build the entity's type name for a given content type
1100
- */ const getEntityName = (contentType)=>{
1101
- return `${getTypeName(contentType)}Entity`;
1102
- };
1103
- /**
1104
- * Build the entity meta type name for a given content type
1105
- */ const getEntityMetaName = (contentType)=>{
1106
- return `${getEntityName(contentType)}Meta`;
1107
- };
1108
- /**
1109
- * Build the entity response's type name for a given content type
1110
- */ const getEntityResponseName = (contentType)=>{
1111
- return `${getEntityName(contentType)}Response`;
1112
- };
1113
- /**
1114
- * Build the entity response collection's type name for a given content type
1115
- */ const getEntityResponseCollectionName = (contentType)=>{
1116
- return `${getEntityName(contentType)}ResponseCollection`;
1117
- };
1118
- /**
1119
- * Build the relation response collection's type name for a given content type
1120
- */ const getRelationResponseCollectionName = (contentType)=>{
1121
- return `${getTypeName(contentType)}RelationResponseCollection`;
1122
- };
1123
- /**
1124
- * Build a component type name based on its definition
1125
- */ const getComponentName = (contentType)=>{
1126
- return contentType.globalId;
1127
- };
1128
- /**
1129
- * Build a component type name based on a content type's attribute
1130
- */ const getComponentNameFromAttribute = (attribute)=>{
1131
- return strapi.components[attribute.component].globalId;
1132
- };
1133
- /**
1134
- * Build a dynamic zone type name based on a content type and an attribute name
1135
- */ const getDynamicZoneName = (contentType, attributeName)=>{
1136
- const typeName = getTypeName(contentType);
1137
- const dzName = fp.upperFirst(fp.camelCase(attributeName));
1138
- const suffix = 'DynamicZone';
1139
- return `${typeName}${dzName}${suffix}`;
1140
- };
1141
- /**
1142
- * Build a dynamic zone input type name based on a content type and an attribute name
1143
- */ const getDynamicZoneInputName = (contentType, attributeName)=>{
1144
- const dzName = getDynamicZoneName(contentType, attributeName);
1145
- return `${dzName}Input`;
1146
- };
1147
- /**
1148
- * Build a component input type name based on a content type and an attribute name
1149
- */ const getComponentInputName = (contentType)=>{
1150
- const componentName = getComponentName(contentType);
1151
- return `${componentName}Input`;
1152
- };
1153
- /**
1154
- * Build a content type input name based on a content type and an attribute name
1155
- */ const getContentTypeInputName = (contentType)=>{
1156
- const typeName = getTypeName(contentType);
1157
- return `${typeName}Input`;
1158
- };
1159
- /**
1160
- * Build the queries type name for a given content type
1161
- */ const getEntityQueriesTypeName = (contentType)=>{
1162
- return `${getEntityName(contentType)}Queries`;
1163
- };
1164
- /**
1165
- * Build the mutations type name for a given content type
1166
- */ const getEntityMutationsTypeName = (contentType)=>{
1167
- return `${getEntityName(contentType)}Mutations`;
1168
- };
1169
- /**
1170
- * Build the filters type name for a given content type
1171
- */ const getFiltersInputTypeName = (contentType)=>{
1172
- const isComponent = contentType.modelType === 'component';
1173
- const baseName = isComponent ? getComponentName(contentType) : getTypeName(contentType);
1174
- return `${baseName}FiltersInput`;
1175
- };
1176
- /**
1177
- * Build a filters type name for a given GraphQL scalar type
1178
- */ const getScalarFilterInputTypeName = (scalarType)=>{
1179
- return `${scalarType}FilterInput`;
1180
- };
1181
- /**
1182
- * Build a type name for a given content type & polymorphic attribute
1183
- */ const getMorphRelationTypeName = (contentType, attributeName)=>{
1184
- const typeName = getTypeName(contentType);
1185
- const formattedAttr = fp.upperFirst(fp.camelCase(attributeName));
1186
- return `${typeName}${formattedAttr}Morph`;
1187
- };
1188
- /**
1189
- * Build a custom type name generator with different customization options
1190
- */ const buildCustomTypeNameGenerator = (options)=>{
1191
- // todo[v4]: use singularName & pluralName is available
1192
- const { prefix = '', suffix = '', plurality = 'singular', firstLetterCase = 'upper' } = options;
1193
- if (![
1194
- 'plural',
1195
- 'singular'
1196
- ].includes(plurality)) {
1197
- throw new ApplicationError$2(`"plurality" param must be either "plural" or "singular", but got: "${plurality}"`);
1198
- }
1199
- const getCustomTypeName = fp.pipe((ct)=>getTypeName(ct, {
1200
- plurality
1201
- }), firstLetterCase === 'upper' ? fp.upperFirst : fp.lowerFirst);
1202
- return (contentType)=>`${prefix}${getCustomTypeName(contentType)}${suffix}`;
1203
- };
1204
- const getFindQueryName = buildCustomTypeNameGenerator({
1205
- plurality: 'plural',
1206
- firstLetterCase: 'lower'
1207
- });
1208
- const getFindConnectionQueryName = (contentType)=>{
1209
- return `${getFindQueryName(contentType)}_connection`;
1210
- };
1211
- const getFindOneQueryName = buildCustomTypeNameGenerator({
1212
- firstLetterCase: 'lower'
1213
- });
1214
- const getCreateMutationTypeName = buildCustomTypeNameGenerator({
1215
- prefix: 'create',
1216
- firstLetterCase: 'upper'
1217
- });
1218
- const getUpdateMutationTypeName = buildCustomTypeNameGenerator({
1219
- prefix: 'update',
1220
- firstLetterCase: 'upper'
1221
- });
1222
- const getDeleteMutationTypeName = buildCustomTypeNameGenerator({
1223
- prefix: 'delete',
1224
- firstLetterCase: 'upper'
1225
- });
1226
- return {
1227
- getEnumName,
1228
- getTypeName,
1229
- getEntityName,
1230
- getEntityMetaName,
1231
- getEntityResponseName,
1232
- getEntityResponseCollectionName,
1233
- getRelationResponseCollectionName,
1234
- getComponentName,
1235
- getComponentNameFromAttribute,
1236
- getDynamicZoneName,
1237
- getDynamicZoneInputName,
1238
- getComponentInputName,
1239
- getContentTypeInputName,
1240
- getEntityQueriesTypeName,
1241
- getEntityMutationsTypeName,
1242
- getFiltersInputTypeName,
1243
- getScalarFilterInputTypeName,
1244
- getMorphRelationTypeName,
1245
- buildCustomTypeNameGenerator,
1246
- getFindQueryName,
1247
- getFindOneQueryName,
1248
- getCreateMutationTypeName,
1249
- getUpdateMutationTypeName,
1250
- getDeleteMutationTypeName,
1251
- getFindConnectionQueryName
1252
- };
1253
- });
1254
-
1255
- // TODO: deprecate and remove this because it is only used to determine if we need helmet security exceptions
1256
- // stores the state of the Apollo landingPage (playground)
1257
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
1258
- var playground = ((ctx)=>{
1259
- let enabled = false;
1260
- return {
1261
- setEnabled (val) {
1262
- enabled = val;
1263
- },
1264
- isEnabled () {
1265
- return enabled;
1266
- }
1267
- };
1268
- });
1269
-
1270
- var utils$1 = ((context)=>({
1271
- playground: playground(),
1272
- naming: naming(context),
1273
- attributes: attributes(context),
1274
- mappers: mappers(context)
1275
- }));
1276
-
1277
- const PAGINATION_TYPE_NAME = 'Pagination';
1278
- const DELETE_MUTATION_RESPONSE_TYPE_NAME = 'DeleteMutationResponse';
1279
- const PUBLICATION_STATUS_TYPE_NAME = 'PublicationStatus';
1280
- const ERROR_TYPE_NAME = 'Error';
1281
- const RESPONSE_COLLECTION_META_TYPE_NAME = 'ResponseCollectionMeta';
1282
- const GRAPHQL_SCALARS = [
1283
- 'ID',
1284
- 'Boolean',
1285
- 'Int',
1286
- 'String',
1287
- 'Long',
1288
- 'Float',
1289
- 'JSON',
1290
- 'Date',
1291
- 'Time',
1292
- 'DateTime'
1293
- ];
1294
- const STRAPI_SCALARS = [
1295
- 'boolean',
1296
- 'integer',
1297
- 'string',
1298
- 'richtext',
1299
- 'blocks',
1300
- 'enumeration',
1301
- 'biginteger',
1302
- 'float',
1303
- 'decimal',
1304
- 'json',
1305
- 'date',
1306
- 'time',
1307
- 'datetime',
1308
- 'timestamp',
1309
- 'uid',
1310
- 'email',
1311
- 'password',
1312
- 'text'
1313
- ];
1314
- const SCALARS_ASSOCIATIONS = {
1315
- uid: 'String',
1316
- email: 'String',
1317
- password: 'String',
1318
- text: 'String',
1319
- boolean: 'Boolean',
1320
- integer: 'Int',
1321
- string: 'String',
1322
- enumeration: 'String',
1323
- richtext: 'String',
1324
- blocks: 'JSON',
1325
- biginteger: 'Long',
1326
- float: 'Float',
1327
- decimal: 'Float',
1328
- json: 'JSON',
1329
- date: 'Date',
1330
- time: 'Time',
1331
- datetime: 'DateTime',
1332
- timestamp: 'DateTime'
1333
- };
1334
- const GENERIC_MORPH_TYPENAME = 'GenericMorph';
1335
- const KINDS = {
1336
- type: 'type',
1337
- component: 'component',
1338
- dynamicZone: 'dynamic-zone',
1339
- enum: 'enum',
1340
- entity: 'entity',
1341
- entityResponse: 'entity-response',
1342
- entityResponseCollection: 'entity-response-collection',
1343
- relationResponseCollection: 'relation-response-collection',
1344
- query: 'query',
1345
- mutation: 'mutation',
1346
- input: 'input',
1347
- filtersInput: 'filters-input',
1348
- scalar: 'scalar',
1349
- morph: 'polymorphic',
1350
- internal: 'internal'
1351
- };
1352
- const allOperators = [
1353
- 'and',
1354
- 'or',
1355
- 'not',
1356
- 'eq',
1357
- 'eqi',
1358
- 'ne',
1359
- 'nei',
1360
- 'startsWith',
1361
- 'endsWith',
1362
- 'contains',
1363
- 'notContains',
1364
- 'containsi',
1365
- 'notContainsi',
1366
- 'gt',
1367
- 'gte',
1368
- 'lt',
1369
- 'lte',
1370
- 'null',
1371
- 'notNull',
1372
- 'in',
1373
- 'notIn',
1374
- 'between'
1375
- ];
1376
- const GRAPHQL_SCALAR_OPERATORS = {
1377
- // ID
1378
- ID: allOperators,
1379
- // Booleans
1380
- Boolean: allOperators,
1381
- // Strings
1382
- String: allOperators,
1383
- // Numbers
1384
- Int: allOperators,
1385
- Long: allOperators,
1386
- Float: allOperators,
1387
- // Dates
1388
- Date: allOperators,
1389
- Time: allOperators,
1390
- DateTime: allOperators,
1391
- // Others
1392
- JSON: allOperators
1393
- };
1394
- const ERROR_CODES = {
1395
- emptyDynamicZone: 'dynamiczone.empty'
1396
- };
1397
- var constants = (()=>({
1398
- PAGINATION_TYPE_NAME,
1399
- RESPONSE_COLLECTION_META_TYPE_NAME,
1400
- DELETE_MUTATION_RESPONSE_TYPE_NAME,
1401
- PUBLICATION_STATUS_TYPE_NAME,
1402
- GRAPHQL_SCALARS,
1403
- STRAPI_SCALARS,
1404
- GENERIC_MORPH_TYPENAME,
1405
- KINDS,
1406
- GRAPHQL_SCALAR_OPERATORS,
1407
- SCALARS_ASSOCIATIONS,
1408
- ERROR_CODES,
1409
- ERROR_TYPE_NAME
1410
- }));
1411
-
1412
- const SortArg = nexus.arg({
1413
- type: nexus.list('String'),
1414
- default: []
1415
- });
1416
-
1417
- var publicationStatus$1 = (({ strapi })=>{
1418
- const { PUBLICATION_STATUS_TYPE_NAME } = strapi.plugin('graphql').service('constants');
1419
- return nexus.arg({
1420
- type: PUBLICATION_STATUS_TYPE_NAME,
1421
- default: 'published'
1422
- });
1423
- });
1424
-
1425
- const PaginationInputType = nexus.inputObjectType({
1426
- name: 'PaginationArg',
1427
- definition (t) {
1428
- t.int('page');
1429
- t.int('pageSize');
1430
- t.int('start');
1431
- t.int('limit');
1432
- }
1433
- });
1434
- var PaginationArg = nexus.arg({
1435
- type: PaginationInputType,
1436
- default: {}
1437
- });
1438
-
1439
- var args = ((context)=>({
1440
- SortArg,
1441
- PaginationArg,
1442
- PublicationStatusArg: publicationStatus$1(context)
1443
- }));
1444
-
1445
- const { ValidationError: ValidationError$2 } = utils$2.errors;
1446
- /**
1447
- * A GraphQL scalar used to store Time (HH:mm:ss.SSS) values
1448
- * @type {GraphQLScalarType}
1449
- */ const TimeScalar = new graphql.GraphQLScalarType({
1450
- name: 'Time',
1451
- description: 'A time string with format HH:mm:ss.SSS',
1452
- serialize (value) {
1453
- return utils$2.parseType({
1454
- type: 'time',
1455
- value
1456
- });
1457
- },
1458
- parseValue (value) {
1459
- return utils$2.parseType({
1460
- type: 'time',
1461
- value
1462
- });
1463
- },
1464
- parseLiteral (ast) {
1465
- if (ast.kind !== graphql.Kind.STRING) {
1466
- throw new ValidationError$2('Time cannot represent non string type');
1467
- }
1468
- const { value } = ast;
1469
- return utils$2.parseType({
1470
- type: 'time',
1471
- value
1472
- });
1473
- }
1474
- });
1475
-
1476
- const parseAndCast = (parseFn)=>(...args)=>{
1477
- const parsedValue = parseFn(...args);
1478
- if (parsedValue instanceof Date) {
1479
- return parsedValue.toISOString().split('T')[0];
1480
- }
1481
- return parsedValue;
1482
- };
1483
- // GraphQLDate casts the date string to new Date, we want to keep it as a string so we cast it back to a string
1484
- // see https://github.com/excitement-engineer/graphql-iso-date/issues/106
1485
- graphqlScalars.GraphQLDate.parseValue = parseAndCast(graphqlScalars.GraphQLDate.parseValue);
1486
- graphqlScalars.GraphQLDate.parseLiteral = parseAndCast(graphqlScalars.GraphQLDate.parseLiteral);
1487
-
1488
- var scalars = (()=>({
1489
- JSON: nexus.asNexusMethod(graphqlScalars.GraphQLJSON, 'json'),
1490
- DateTime: nexus.asNexusMethod(graphqlScalars.GraphQLDateTime, 'dateTime'),
1491
- Time: nexus.asNexusMethod(TimeScalar, 'time'),
1492
- Date: nexus.asNexusMethod(graphqlScalars.GraphQLDate, 'date'),
1493
- Long: nexus.asNexusMethod(graphqlScalars.GraphQLLong, 'long')
1494
- }));
1495
-
1496
- var pagination = (({ strapi })=>{
1497
- const { PAGINATION_TYPE_NAME } = strapi.plugin('graphql').service('constants');
1498
- return {
1499
- /**
1500
- * Type definition for a Pagination object
1501
- * @type {NexusObjectTypeDef}
1502
- */ Pagination: nexus.objectType({
1503
- name: PAGINATION_TYPE_NAME,
1504
- definition (t) {
1505
- t.nonNull.int('total');
1506
- t.nonNull.int('page');
1507
- t.nonNull.int('pageSize');
1508
- t.nonNull.int('pageCount');
1509
- }
1510
- })
1511
- };
1512
- });
1513
-
1514
- var buildResponseCollectionMeta = (({ strapi })=>{
1515
- const { service: getService } = strapi.plugin('graphql');
1516
- const { RESPONSE_COLLECTION_META_TYPE_NAME, PAGINATION_TYPE_NAME } = getService('constants');
1517
- return {
1518
- /**
1519
- * A shared type definition used in EntitiesResponseCollection
1520
- * to have information about the collection as a whole
1521
- * @type {NexusObjectTypeDef}
1522
- */ ResponseCollectionMeta: nexus.objectType({
1523
- name: RESPONSE_COLLECTION_META_TYPE_NAME,
1524
- definition (t) {
1525
- const { resolvePagination } = getService('builders').get('content-api');
1526
- t.nonNull.field('pagination', {
1527
- type: PAGINATION_TYPE_NAME,
1528
- resolve: resolvePagination
1529
- });
1530
- }
1531
- })
1532
- };
1533
- });
1534
-
1535
- var buildDeleteMutationResponse = (({ strapi })=>{
1536
- const { DELETE_MUTATION_RESPONSE_TYPE_NAME } = strapi.plugin('graphql').service('constants');
1537
- return {
1538
- DeleteMutationResponse: nexus.objectType({
1539
- name: DELETE_MUTATION_RESPONSE_TYPE_NAME,
1540
- definition (t) {
1541
- t.nonNull.id('documentId');
1542
- }
1543
- })
1544
- };
1545
- });
1546
-
1547
- var publicationStatus = (({ strapi })=>{
1548
- const { PUBLICATION_STATUS_TYPE_NAME } = strapi.plugin('graphql').service('constants');
1549
- return {
1550
- /**
1551
- * An enum type definition representing a publication status
1552
- * @type {NexusEnumTypeDef}
1553
- */ PublicationStatus: nexus.enumType({
1554
- name: PUBLICATION_STATUS_TYPE_NAME,
1555
- members: {
1556
- DRAFT: 'draft',
1557
- PUBLISHED: 'published'
1558
- }
1559
- })
1560
- };
1561
- });
1562
-
1563
- /**
1564
- * Build a map of filters type for every GraphQL scalars
1565
- * @return {Object<string, NexusInputTypeDef>}
1566
- */ const buildScalarFilters = ({ strapi })=>{
1567
- const { naming, mappers } = strapi.plugin('graphql').service('utils');
1568
- const { helpers } = strapi.plugin('graphql').service('internals');
1569
- return helpers.getEnabledScalars().reduce((acc, type)=>{
1570
- const operators = mappers.graphqlScalarToOperators(type);
1571
- const typeName = naming.getScalarFilterInputTypeName(type);
1572
- if (!operators || operators.length === 0) {
1573
- return acc;
1574
- }
1575
- return {
1576
- ...acc,
1577
- [typeName]: nexus.inputObjectType({
1578
- name: typeName,
1579
- definition (t) {
1580
- for (const operator of operators){
1581
- operator.add(t, type);
1582
- }
1583
- }
1584
- })
1585
- };
1586
- }, {});
1587
- };
1588
- var filters$1 = ((context)=>({
1589
- scalars: buildScalarFilters(context)
1590
- }));
1591
-
1592
- const { ValidationError: ValidationError$1 } = utils$2.errors;
1593
- /**
1594
- * Build an Error object type
1595
- * @return {Object<string, NexusObjectTypeDef>}
1596
- */ var error = (({ strapi })=>{
1597
- const { ERROR_CODES, ERROR_TYPE_NAME } = strapi.plugin('graphql').service('constants');
1598
- return nexus.objectType({
1599
- name: ERROR_TYPE_NAME,
1600
- definition (t) {
1601
- t.nonNull.string('code', {
1602
- resolve (parent) {
1603
- const code = fp.get('code', parent);
1604
- const isValidPlaceholderCode = Object.values(ERROR_CODES).includes(code);
1605
- if (!isValidPlaceholderCode) {
1606
- throw new ValidationError$1(`"${code}" is not a valid code value`);
1607
- }
1608
- return code;
1609
- }
1610
- });
1611
- t.string('message');
1612
- }
1613
- });
1614
- });
1615
-
1616
- var types = ((context)=>()=>{
1617
- const { strapi } = context;
1618
- const { KINDS } = strapi.plugin('graphql').service('constants');
1619
- return {
1620
- [KINDS.internal]: {
1621
- error: error(context),
1622
- pagination: pagination(context),
1623
- responseCollectionMeta: buildResponseCollectionMeta(context),
1624
- deleteDocumentResponse: buildDeleteMutationResponse(context)
1625
- },
1626
- [KINDS.enum]: {
1627
- publicationStatus: publicationStatus(context)
1628
- },
1629
- [KINDS.filtersInput]: {
1630
- ...filters$1(context)
1631
- }
1632
- };
1633
- });
1634
-
1635
- var getEnabledScalars = (({ strapi })=>()=>{
1636
- const { GRAPHQL_SCALAR_OPERATORS } = strapi.plugin('graphql').service('constants');
1637
- return Object.entries(GRAPHQL_SCALAR_OPERATORS)// To be valid, a GraphQL scalar must have at least one operator enabled
1638
- .filter(([, value])=>value.length > 0)// Only keep the key (the scalar name)
1639
- .map(fp.first);
1640
- });
1641
-
1642
- var helpers = ((context)=>({
1643
- getEnabledScalars: getEnabledScalars(context)
1644
- }));
1645
-
1646
- var internals = ((context)=>({
1647
- args: args(context),
1648
- scalars: scalars(),
1649
- buildInternalTypes: types(context),
1650
- helpers: helpers(context)
1651
- }));
1652
-
1653
- /**
1654
- * Build a Nexus enum type from a Strapi enum attribute
1655
- * @param {object} definition - The definition of the enum
1656
- * @param {string[]} definition.enum - The params of the enum
1657
- * @param {string} name - The name of the enum
1658
- * @return {NexusEnumTypeDef}
1659
- */ const buildEnumTypeDefinition = (definition, name)=>{
1660
- return nexus.enumType({
1661
- name,
1662
- members: definition.enum.reduce((acc, value)=>fp.set(utils$2.strings.toRegressedEnumValue(value), value, acc), {})
1663
- });
1664
- };
1665
- var enums = (()=>({
1666
- buildEnumTypeDefinition
1667
- }));
1668
-
1669
- const { ApplicationError: ApplicationError$1 } = utils$2.errors;
1670
- var dynamicZone = (({ strapi })=>{
1671
- const buildTypeDefinition = (name, components)=>{
1672
- const { ERROR_TYPE_NAME } = strapi.plugin('graphql').service('constants');
1673
- const isEmpty = components.length === 0;
1674
- const componentsTypeNames = components.map((componentUID)=>{
1675
- const component = strapi.components[componentUID];
1676
- if (!component) {
1677
- throw new ApplicationError$1(`Trying to create a dynamic zone type with an unknown component: "${componentUID}"`);
1678
- }
1679
- return component.globalId;
1680
- });
1681
- return nexus.unionType({
1682
- name,
1683
- resolveType (obj) {
1684
- if (isEmpty) {
1685
- return ERROR_TYPE_NAME;
1686
- }
1687
- return strapi.components[obj.__component].globalId;
1688
- },
1689
- definition (t) {
1690
- t.members(...componentsTypeNames, ERROR_TYPE_NAME);
1691
- }
1692
- });
1693
- };
1694
- const buildInputDefinition = (name, components)=>{
1695
- const parseData = (value)=>{
1696
- const component = Object.values(strapi.components).find((component)=>component.globalId === value.__typename);
1697
- if (!component) {
1698
- throw new ApplicationError$1(`Component not found. expected one of: ${components.map((uid)=>strapi.components[uid].globalId).join(', ')}`);
1699
- }
1700
- return {
1701
- __component: component.uid,
1702
- ...fp.omit([
1703
- '__typename'
1704
- ], value)
1705
- };
1706
- };
1707
- return nexus.scalarType({
1708
- name,
1709
- serialize: (value)=>value,
1710
- parseValue: (value)=>parseData(value),
1711
- parseLiteral (ast, variables) {
1712
- if (ast.kind !== graphql.Kind.OBJECT) {
1713
- return undefined;
1714
- }
1715
- const value = graphql.valueFromASTUntyped(ast, variables);
1716
- return parseData(value);
1717
- }
1718
- });
1719
- };
1720
- return {
1721
- /**
1722
- * Build a Nexus dynamic zone type from a Strapi dz attribute
1723
- */ buildDynamicZoneDefinition (definition, name, inputName) {
1724
- const { components } = definition;
1725
- const typeDefinition = buildTypeDefinition(name, components);
1726
- const inputDefinition = buildInputDefinition(inputName, components);
1727
- return [
1728
- typeDefinition,
1729
- inputDefinition
1730
- ];
1731
- }
1732
- };
1733
- });
1734
-
1735
- var entity = (({ strapi })=>{
1736
- const { naming } = strapi.plugin('graphql').service('utils');
1737
- return {
1738
- /**
1739
- * Build a higher level type for a content type which contains the attributes, the ID and the metadata
1740
- * @param {object} contentType The content type which will be used to build its entity type
1741
- * @return {NexusObjectTypeDef}
1742
- */ buildEntityDefinition (contentType) {
1743
- const { attributes } = contentType;
1744
- const name = naming.getEntityName(contentType);
1745
- const typeName = naming.getTypeName(contentType);
1746
- return nexus.objectType({
1747
- name,
1748
- definition (t) {
1749
- // Keep the ID attribute at the top level
1750
- t.id('id', {
1751
- resolve: fp.prop('id')
1752
- });
1753
- if (!fp.isEmpty(attributes)) {
1754
- // Keep the fetched object into a dedicated `attributes` field
1755
- t.field('attributes', {
1756
- type: typeName,
1757
- resolve: fp.identity
1758
- });
1759
- }
1760
- }
1761
- });
1762
- }
1763
- };
1764
- });
1765
-
1766
- var typeBuilder = ((context)=>{
1767
- const { strapi } = context;
1768
- const getGraphQLService = strapi.plugin('graphql').service;
1769
- const extension = getGraphQLService('extension');
1770
- /**
1771
- * Add a scalar attribute to the type definition
1772
- *
1773
- * The attribute is added based on a simple association between a Strapi
1774
- * type and a GraphQL type (the map is defined in `strapiTypeToGraphQLScalar`)
1775
- */ const addScalarAttribute = (options)=>{
1776
- const { builder, attributeName, attribute } = options;
1777
- const { mappers } = getGraphQLService('utils');
1778
- const gqlType = mappers.strapiScalarToGraphQLScalar(attribute.type);
1779
- builder.field(attributeName, {
1780
- type: gqlType
1781
- });
1782
- };
1783
- /**
1784
- * Add a component attribute to the type definition
1785
- *
1786
- * The attribute is added by fetching the component's type
1787
- * name and using it as the attribute's type
1788
- */ const addComponentAttribute = (options)=>{
1789
- const { builder, attributeName, contentType, attribute } = options;
1790
- let localBuilder = builder;
1791
- const { naming } = getGraphQLService('utils');
1792
- const { getContentTypeArgs } = getGraphQLService('builders').utils;
1793
- const { buildComponentResolver } = getGraphQLService('builders').get('content-api');
1794
- const type = naming.getComponentNameFromAttribute(attribute);
1795
- if (attribute.repeatable) {
1796
- localBuilder = localBuilder.list;
1797
- }
1798
- const targetComponent = strapi.getModel(attribute.component);
1799
- const resolve = buildComponentResolver({
1800
- contentTypeUID: contentType.uid,
1801
- attributeName,
1802
- strapi
1803
- });
1804
- const args = getContentTypeArgs(targetComponent, {
1805
- multiple: !!attribute.repeatable,
1806
- isNested: true
1807
- });
1808
- localBuilder.field(attributeName, {
1809
- type,
1810
- resolve,
1811
- args
1812
- });
1813
- };
1814
- /**
1815
- * Add a dynamic zone attribute to the type definition
1816
- *
1817
- * The attribute is added by fetching the dynamic zone's
1818
- * type name and using it as the attribute's type
1819
- */ const addDynamicZoneAttribute = (options)=>{
1820
- const { builder, attributeName, contentType } = options;
1821
- const { naming } = getGraphQLService('utils');
1822
- const { ERROR_CODES } = getGraphQLService('constants');
1823
- const { buildDynamicZoneResolver } = getGraphQLService('builders').get('content-api');
1824
- const { components } = contentType.attributes[attributeName];
1825
- const isEmpty = components.length === 0;
1826
- const type = naming.getDynamicZoneName(contentType, attributeName);
1827
- const resolve = isEmpty ? fp.constant({
1828
- code: ERROR_CODES.emptyDynamicZone,
1829
- message: `This dynamic zone don't have any component attached to it`
1830
- }) : buildDynamicZoneResolver({
1831
- contentTypeUID: contentType.uid,
1832
- attributeName
1833
- });
1834
- builder.list.field(attributeName, {
1835
- type,
1836
- resolve
1837
- });
1838
- };
1839
- /**
1840
- * Add an enum attribute to the type definition
1841
- *
1842
- * The attribute is added by fetching the enum's type
1843
- * name and using it as the attribute's type
1844
- */ const addEnumAttribute = (options)=>{
1845
- const { builder, attributeName, contentType } = options;
1846
- const { naming } = getGraphQLService('utils');
1847
- const type = naming.getEnumName(contentType, attributeName);
1848
- builder.field(attributeName, {
1849
- type
1850
- });
1851
- };
1852
- /**
1853
- * Add a media attribute to the type definition
1854
- */ const addMediaAttribute = (options)=>{
1855
- const { naming } = getGraphQLService('utils');
1856
- const { getContentTypeArgs } = getGraphQLService('builders').utils;
1857
- const { buildAssociationResolver } = getGraphQLService('builders').get('content-api');
1858
- const extension = getGraphQLService('extension');
1859
- const { builder } = options;
1860
- const { attributeName, attribute, contentType } = options;
1861
- const fileUID = 'plugin::upload.file';
1862
- if (extension.shadowCRUD(fileUID).isDisabled()) {
1863
- return;
1864
- }
1865
- const fileContentType = strapi.contentTypes[fileUID];
1866
- const resolve = buildAssociationResolver({
1867
- contentTypeUID: contentType.uid,
1868
- attributeName,
1869
- strapi
1870
- });
1871
- const args = attribute.multiple ? getContentTypeArgs(fileContentType, {
1872
- isNested: true
1873
- }) : undefined;
1874
- const typeName = naming.getTypeName(fileContentType);
1875
- if (attribute.multiple) {
1876
- builder.field(`${attributeName}_connection`, {
1877
- type: naming.getRelationResponseCollectionName(fileContentType),
1878
- resolve,
1879
- args
1880
- });
1881
- builder.field(attributeName, {
1882
- type: nexus.nonNull(nexus.list(typeName)),
1883
- async resolve (...args) {
1884
- const res = await resolve(...args);
1885
- return res.nodes ?? [];
1886
- },
1887
- args
1888
- });
1889
- } else {
1890
- builder.field(attributeName, {
1891
- type: typeName,
1892
- async resolve (...args) {
1893
- const res = await resolve(...args);
1894
- return res.value;
1895
- },
1896
- args
1897
- });
1898
- }
1899
- };
1900
- /**
1901
- * Add a polymorphic relational attribute to the type definition
1902
- */ const addPolymorphicRelationalAttribute = (options)=>{
1903
- const { GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');
1904
- const { naming } = getGraphQLService('utils');
1905
- const { buildAssociationResolver } = getGraphQLService('builders').get('content-api');
1906
- let { builder } = options;
1907
- const { attributeName, attribute, contentType } = options;
1908
- const { target } = attribute;
1909
- const isToManyRelation = attribute.relation.endsWith('Many');
1910
- if (isToManyRelation) {
1911
- builder = builder.list;
1912
- }
1913
- // todo[v4]: How to handle polymorphic relation w/ entity response collection types?
1914
- // -> Currently return raw polymorphic entities
1915
- const resolve = buildAssociationResolver({
1916
- contentTypeUID: contentType.uid,
1917
- attributeName,
1918
- strapi
1919
- });
1920
- // If there is no specific target specified, then use the GenericMorph type
1921
- if (fp.isUndefined(target)) {
1922
- builder.field(attributeName, {
1923
- type: GENERIC_MORPH_TYPENAME,
1924
- resolve
1925
- });
1926
- } else if (fp.isArray(target) && target.every(fp.isString)) {
1927
- const type = naming.getMorphRelationTypeName(contentType, attributeName);
1928
- builder.field(attributeName, {
1929
- type,
1930
- resolve
1931
- });
1932
- }
1933
- };
1934
- /**
1935
- * Add a regular relational attribute to the type definition
1936
- */ const addRegularRelationalAttribute = (options)=>{
1937
- const { naming } = getGraphQLService('utils');
1938
- const { getContentTypeArgs } = getGraphQLService('builders').utils;
1939
- const { buildAssociationResolver } = getGraphQLService('builders').get('content-api');
1940
- const extension = getGraphQLService('extension');
1941
- const { builder } = options;
1942
- const { attributeName, attribute, contentType } = options;
1943
- if (extension.shadowCRUD(attribute.target).isDisabled()) {
1944
- return;
1945
- }
1946
- const isToManyRelation = attribute.relation.endsWith('Many');
1947
- const resolve = buildAssociationResolver({
1948
- contentTypeUID: contentType.uid,
1949
- attributeName,
1950
- strapi
1951
- });
1952
- const targetContentType = strapi.getModel(attribute.target);
1953
- const typeName = naming.getTypeName(targetContentType);
1954
- const args = isToManyRelation ? getContentTypeArgs(targetContentType, {
1955
- isNested: true
1956
- }) : undefined;
1957
- const resolverScope = `${targetContentType.uid}.find`;
1958
- const resolverPath = `${naming.getTypeName(contentType)}.${attributeName}`;
1959
- extension.use({
1960
- resolversConfig: {
1961
- [resolverPath]: {
1962
- auth: {
1963
- scope: [
1964
- resolverScope
1965
- ]
1966
- }
1967
- }
1968
- }
1969
- });
1970
- if (isToManyRelation) {
1971
- builder.field(`${attributeName}_connection`, {
1972
- type: naming.getRelationResponseCollectionName(targetContentType),
1973
- resolve,
1974
- args
1975
- });
1976
- extension.use({
1977
- resolversConfig: {
1978
- [`${resolverPath}_connection`]: {
1979
- auth: {
1980
- scope: [
1981
- resolverScope
1982
- ]
1983
- }
1984
- }
1985
- }
1986
- });
1987
- builder.field(attributeName, {
1988
- type: nexus.nonNull(nexus.list(typeName)),
1989
- async resolve (...args) {
1990
- const res = await resolve(...args);
1991
- return res.nodes ?? [];
1992
- },
1993
- args
1994
- });
1995
- } else {
1996
- builder.field(attributeName, {
1997
- type: typeName,
1998
- async resolve (...args) {
1999
- const res = await resolve(...args);
2000
- return res.value;
2001
- },
2002
- args
2003
- });
2004
- }
2005
- };
2006
- const isNotPrivate = (contentType)=>(attributeName)=>{
2007
- return !utils$2.contentTypes.isPrivateAttribute(contentType, attributeName);
2008
- };
2009
- const isNotDisabled = (contentType)=>(attributeName)=>{
2010
- return extension.shadowCRUD(contentType.uid).field(attributeName).hasOutputEnabled();
2011
- };
2012
- return {
2013
- /**
2014
- * Create a type definition for a given content type
2015
- * @param contentType - The content type used to created the definition
2016
- * @return {NexusObjectTypeDef}
2017
- */ buildTypeDefinition (contentType) {
2018
- const utils = getGraphQLService('utils');
2019
- const { getComponentName, getTypeName } = utils.naming;
2020
- const { isStrapiScalar, isComponent, isDynamicZone, isEnumeration, isMedia, isMorphRelation, isRelation } = utils.attributes;
2021
- const { attributes, modelType } = contentType;
2022
- const attributesKey = Object.keys(attributes);
2023
- const name = (modelType === 'component' ? getComponentName : getTypeName).call(null, contentType);
2024
- return nexus.objectType({
2025
- name,
2026
- definition (t) {
2027
- // add back the old id attribute on contentType if v4 compat is enabled
2028
- if (modelType !== 'component' && isNotDisabled(contentType)('id') && strapi.plugin('graphql').config('v4CompatibilityMode', false)) {
2029
- t.nonNull.id('id', {
2030
- deprecation: 'Use `documentId` instead'
2031
- });
2032
- }
2033
- if (modelType === 'component' && isNotDisabled(contentType)('id')) {
2034
- t.nonNull.id('id');
2035
- }
2036
- if (modelType !== 'component' && isNotDisabled(contentType)('documentId')) {
2037
- t.nonNull.id('documentId');
2038
- }
2039
- if (strapi.plugin('graphql').config('v4CompatibilityMode', false)) {
2040
- t.nonNull.field('attributes', {
2041
- deprecation: 'Use root level fields instead',
2042
- type: name,
2043
- resolve: (parent)=>parent
2044
- });
2045
- t.nonNull.field('data', {
2046
- deprecation: 'Use root level fields instead',
2047
- type: name,
2048
- resolve: (parent)=>parent
2049
- });
2050
- }
2051
- /** Attributes
2052
- *
2053
- * Attributes can be of 7 different kind:
2054
- * - Scalar
2055
- * - Component
2056
- * - Dynamic Zone
2057
- * - Enum
2058
- * - Media
2059
- * - Polymorphic Relations
2060
- * - Regular Relations
2061
- *
2062
- * Here, we iterate over each non-private attribute
2063
- * and add it to the type definition based on its type
2064
- */ attributesKey// Ignore private attributes
2065
- .filter(isNotPrivate(contentType))// Ignore disabled fields (from extension service)
2066
- .filter(isNotDisabled(contentType))// Add each attribute to the type definition
2067
- .forEach((attributeName)=>{
2068
- const attribute = attributes[attributeName];
2069
- // We create a copy of the builder (t) to apply custom
2070
- // rules only on the current attribute (eg: nonNull, list, ...)
2071
- let builder = t;
2072
- if (attribute.required) {
2073
- builder = builder.nonNull;
2074
- }
2075
- const options = {
2076
- builder,
2077
- attributeName,
2078
- attribute,
2079
- contentType,
2080
- context
2081
- };
2082
- // Enums
2083
- if (isEnumeration(attribute)) {
2084
- addEnumAttribute(options);
2085
- } else if (isStrapiScalar(attribute)) {
2086
- addScalarAttribute(options);
2087
- } else if (isComponent(attribute)) {
2088
- addComponentAttribute(options);
2089
- } else if (isDynamicZone(attribute)) {
2090
- addDynamicZoneAttribute(options);
2091
- } else if (isMedia(attribute)) {
2092
- addMediaAttribute(options);
2093
- } else if (isMorphRelation(attribute)) {
2094
- addPolymorphicRelationalAttribute(options);
2095
- } else if (isRelation(attribute)) {
2096
- addRegularRelationalAttribute(options);
2097
- }
2098
- });
2099
- }
2100
- });
2101
- }
2102
- };
2103
- });
2104
-
2105
- var response = (({ strapi })=>{
2106
- const { naming } = strapi.plugin('graphql').service('utils');
2107
- return {
2108
- /**
2109
- * Build a type definition for a content API response for a given content type
2110
- */ buildResponseDefinition (contentType) {
2111
- const name = naming.getEntityResponseName(contentType);
2112
- const typeName = naming.getTypeName(contentType);
2113
- return nexus.objectType({
2114
- name,
2115
- definition (t) {
2116
- t.field('data', {
2117
- type: typeName,
2118
- resolve: fp.prop('value')
2119
- });
2120
- }
2121
- });
2122
- }
2123
- };
2124
- });
2125
-
2126
- var responseCollection = (({ strapi })=>{
2127
- const { service: getService } = strapi.plugin('graphql');
2128
- const { naming } = getService('utils');
2129
- const { RESPONSE_COLLECTION_META_TYPE_NAME, PAGINATION_TYPE_NAME } = getService('constants');
2130
- return {
2131
- /**
2132
- * Build a type definition for a content API collection response for a given content type
2133
- * @param {Schema.ContentType} contentType The content type which will be used to build its content API response definition
2134
- * @return {NexusObjectTypeDef}
2135
- */ buildResponseCollectionDefinition (contentType) {
2136
- const name = naming.getEntityResponseCollectionName(contentType);
2137
- const typeName = naming.getTypeName(contentType);
2138
- const { resolvePagination } = getService('builders').get('content-api');
2139
- return nexus.objectType({
2140
- name,
2141
- definition (t) {
2142
- // NOTE: add edges & cursor based pagination to support the relay spec in a later version
2143
- t.nonNull.list.field('nodes', {
2144
- type: nexus.nonNull(typeName),
2145
- resolve: fp.pipe(fp.prop('nodes'), fp.defaultTo([]))
2146
- });
2147
- t.nonNull.field('pageInfo', {
2148
- type: PAGINATION_TYPE_NAME,
2149
- resolve: resolvePagination
2150
- });
2151
- if (strapi.plugin('graphql').config('v4CompatibilityMode', false)) {
2152
- t.nonNull.list.field('data', {
2153
- deprecation: 'Use `nodes` field instead',
2154
- type: nexus.nonNull(typeName),
2155
- resolve: fp.pipe(fp.prop('nodes'), fp.defaultTo([]))
2156
- });
2157
- t.nonNull.field('meta', {
2158
- deprecation: 'Use the `pageInfo` field instead',
2159
- type: RESPONSE_COLLECTION_META_TYPE_NAME,
2160
- resolve: fp.identity
2161
- });
2162
- }
2163
- }
2164
- });
2165
- }
2166
- };
2167
- });
2168
-
2169
- var relationResponseCollection = (({ strapi })=>{
2170
- const { naming } = strapi.plugin('graphql').service('utils');
2171
- return {
2172
- /**
2173
- * Build a type definition for a content API relation's collection response for a given content type
2174
- */ buildRelationResponseCollectionDefinition (contentType) {
2175
- const name = naming.getRelationResponseCollectionName(contentType);
2176
- const typeName = naming.getTypeName(contentType);
2177
- return nexus.objectType({
2178
- name,
2179
- definition (t) {
2180
- t.nonNull.list.field('nodes', {
2181
- type: nexus.nonNull(typeName),
2182
- resolve: fp.pipe(fp.prop('nodes'), fp.defaultTo([]))
2183
- });
2184
- if (strapi.plugin('graphql').config('v4CompatibilityMode', false)) {
2185
- t.nonNull.list.field('data', {
2186
- deprecation: 'Use `nodes` field instead',
2187
- type: nexus.nonNull(typeName),
2188
- resolve: fp.pipe(fp.prop('nodes'), fp.defaultTo([]))
2189
- });
2190
- }
2191
- }
2192
- });
2193
- }
2194
- };
2195
- });
2196
-
2197
- var createCollectionTypeQueriesBuilder = (({ strapi })=>{
2198
- const { service: getService } = strapi.plugin('graphql');
2199
- const { naming } = getService('utils');
2200
- const { transformArgs, getContentTypeArgs } = getService('builders').utils;
2201
- const { toEntityResponseCollection } = getService('format').returnTypes;
2202
- const { getFindOneQueryName, getTypeName, getFindQueryName, getFindConnectionQueryName, getEntityResponseCollectionName } = naming;
2203
- const buildCollectionTypeQueries = (contentType)=>{
2204
- const findOneQueryName = `Query.${getFindOneQueryName(contentType)}`;
2205
- const findQueryName = `Query.${getFindQueryName(contentType)}`;
2206
- const findConnectionQueryName = `Query.${getFindConnectionQueryName(contentType)}`;
2207
- const extension = getService('extension');
2208
- const registerAuthConfig = (action, auth)=>{
2209
- return extension.use({
2210
- resolversConfig: {
2211
- [action]: {
2212
- auth
2213
- }
2214
- }
2215
- });
2216
- };
2217
- const isActionEnabled = (action)=>{
2218
- return extension.shadowCRUD(contentType.uid).isActionEnabled(action);
2219
- };
2220
- const isFindOneEnabled = isActionEnabled('findOne');
2221
- const isFindEnabled = isActionEnabled('find');
2222
- if (isFindOneEnabled) {
2223
- registerAuthConfig(findOneQueryName, {
2224
- scope: [
2225
- `${contentType.uid}.findOne`
2226
- ]
2227
- });
2228
- }
2229
- if (isFindEnabled) {
2230
- registerAuthConfig(findQueryName, {
2231
- scope: [
2232
- `${contentType.uid}.find`
2233
- ]
2234
- });
2235
- registerAuthConfig(findConnectionQueryName, {
2236
- scope: [
2237
- `${contentType.uid}.find`
2238
- ]
2239
- });
2240
- }
2241
- return nexus.extendType({
2242
- type: 'Query',
2243
- definition (t) {
2244
- if (isFindOneEnabled) {
2245
- addFindOneQuery(t, contentType);
2246
- }
2247
- if (isFindEnabled) {
2248
- addFindConnectionQuery(t, contentType);
2249
- addFindQuery(t, contentType);
2250
- }
2251
- }
2252
- });
2253
- };
2254
- /**
2255
- * Register a "find one" query field to the nexus type definition
2256
- */ const addFindOneQuery = (t, contentType)=>{
2257
- const findOneQueryName = getFindOneQueryName(contentType);
2258
- const typeName = getTypeName(contentType);
2259
- t.field(findOneQueryName, {
2260
- type: typeName,
2261
- extensions: {
2262
- strapi: {
2263
- contentType
2264
- }
2265
- },
2266
- args: getContentTypeArgs(contentType, {
2267
- multiple: false
2268
- }),
2269
- async resolve (parent, args, ctx) {
2270
- const transformedArgs = transformArgs(args, {
2271
- contentType
2272
- });
2273
- const { findOne } = getService('builders').get('content-api').buildQueriesResolvers({
2274
- contentType
2275
- });
2276
- // queryResolvers will sanitize params
2277
- return findOne(parent, transformedArgs, ctx);
2278
- }
2279
- });
2280
- };
2281
- /**
2282
- * Register a "find" query field to the nexus type definition
2283
- */ const addFindQuery = (t, contentType)=>{
2284
- const findQueryName = getFindQueryName(contentType);
2285
- const typeName = getTypeName(contentType);
2286
- t.field(findQueryName, {
2287
- type: nexus.nonNull(nexus.list(typeName)),
2288
- extensions: {
2289
- strapi: {
2290
- contentType
2291
- }
2292
- },
2293
- args: getContentTypeArgs(contentType),
2294
- async resolve (parent, args, ctx) {
2295
- const transformedArgs = transformArgs(args, {
2296
- contentType,
2297
- usePagination: true
2298
- });
2299
- const { findMany } = getService('builders').get('content-api').buildQueriesResolvers({
2300
- contentType
2301
- });
2302
- // queryResolvers will sanitize params
2303
- return findMany(parent, transformedArgs, ctx);
2304
- }
2305
- });
2306
- };
2307
- /**
2308
- * Register a "find" query field to the nexus type definition
2309
- */ const addFindConnectionQuery = (t, contentType)=>{
2310
- const { uid } = contentType;
2311
- const queryName = getFindConnectionQueryName(contentType);
2312
- const responseCollectionTypeName = getEntityResponseCollectionName(contentType);
2313
- t.field(queryName, {
2314
- type: responseCollectionTypeName,
2315
- extensions: {
2316
- strapi: {
2317
- contentType
2318
- }
2319
- },
2320
- args: getContentTypeArgs(contentType),
2321
- async resolve (parent, args, ctx) {
2322
- const transformedArgs = transformArgs(args, {
2323
- contentType,
2324
- usePagination: true
2325
- });
2326
- const { findMany } = getService('builders').get('content-api').buildQueriesResolvers({
2327
- contentType
2328
- });
2329
- // queryResolvers will sanitize params
2330
- const nodes = await findMany(parent, transformedArgs, ctx);
2331
- return toEntityResponseCollection(nodes, {
2332
- args: transformedArgs,
2333
- resourceUID: uid
2334
- });
2335
- }
2336
- });
2337
- };
2338
- return {
2339
- buildCollectionTypeQueries
2340
- };
2341
- });
2342
-
2343
- var createSingleTypeQueriesBuilder = (({ strapi })=>{
2344
- const { service: getService } = strapi.plugin('graphql');
2345
- const { naming } = getService('utils');
2346
- const { transformArgs, getContentTypeArgs } = getService('builders').utils;
2347
- const { getFindOneQueryName, getTypeName } = naming;
2348
- const buildSingleTypeQueries = (contentType)=>{
2349
- const findQueryName = `Query.${getFindOneQueryName(contentType)}`;
2350
- const extension = getService('extension');
2351
- const registerAuthConfig = (action, auth)=>{
2352
- return extension.use({
2353
- resolversConfig: {
2354
- [action]: {
2355
- auth
2356
- }
2357
- }
2358
- });
2359
- };
2360
- const isActionEnabled = (action)=>{
2361
- return extension.shadowCRUD(contentType.uid).isActionEnabled(action);
2362
- };
2363
- const isFindEnabled = isActionEnabled('find');
2364
- if (isFindEnabled) {
2365
- registerAuthConfig(findQueryName, {
2366
- scope: [
2367
- `${contentType.uid}.find`
2368
- ]
2369
- });
2370
- }
2371
- return nexus.extendType({
2372
- type: 'Query',
2373
- definition (t) {
2374
- if (isFindEnabled) {
2375
- addFindQuery(t, contentType);
2376
- }
2377
- }
2378
- });
2379
- };
2380
- const addFindQuery = (t, contentType)=>{
2381
- const findQueryName = getFindOneQueryName(contentType);
2382
- const typeName = getTypeName(contentType);
2383
- t.field(findQueryName, {
2384
- type: typeName,
2385
- extensions: {
2386
- strapi: {
2387
- contentType
2388
- }
2389
- },
2390
- args: getContentTypeArgs(contentType),
2391
- async resolve (parent, args, ctx) {
2392
- const transformedArgs = transformArgs(args, {
2393
- contentType
2394
- });
2395
- const { findFirst } = getService('builders').get('content-api').buildQueriesResolvers({
2396
- contentType
2397
- });
2398
- return findFirst(parent, transformedArgs, ctx);
2399
- }
2400
- });
2401
- };
2402
- return {
2403
- buildSingleTypeQueries
2404
- };
2405
- });
2406
-
2407
- var queries = ((context)=>({
2408
- ...createCollectionTypeQueriesBuilder(context),
2409
- ...createSingleTypeQueriesBuilder(context)
2410
- }));
2411
-
2412
- var createCollectionTypeMutationsBuilder = (({ strapi })=>{
2413
- const { service: getService } = strapi.plugin('graphql');
2414
- const { naming } = getService('utils');
2415
- const { args } = getService('internals');
2416
- const { getCreateMutationTypeName, getUpdateMutationTypeName, getDeleteMutationTypeName, getContentTypeInputName, getTypeName } = naming;
2417
- const addCreateMutation = (t, contentType)=>{
2418
- const { uid } = contentType;
2419
- const createMutationName = getCreateMutationTypeName(contentType);
2420
- const typeName = getTypeName(contentType);
2421
- t.field(createMutationName, {
2422
- type: typeName,
2423
- extensions: {
2424
- strapi: {
2425
- contentType
2426
- }
2427
- },
2428
- args: {
2429
- // Create payload
2430
- status: args.PublicationStatusArg,
2431
- data: nexus.nonNull(getContentTypeInputName(contentType))
2432
- },
2433
- async resolve (parent, args, context) {
2434
- const { auth } = context.state;
2435
- // Sanitize input data
2436
- const sanitizedInputData = await strapi.contentAPI.sanitize.input(args.data, contentType, {
2437
- auth
2438
- });
2439
- return strapi.documents(uid).create({
2440
- ...args,
2441
- data: sanitizedInputData
2442
- });
2443
- }
2444
- });
2445
- };
2446
- const addUpdateMutation = (t, contentType)=>{
2447
- const { uid } = contentType;
2448
- const updateMutationName = getUpdateMutationTypeName(contentType);
2449
- const typeName = getTypeName(contentType);
2450
- t.field(updateMutationName, {
2451
- type: typeName,
2452
- extensions: {
2453
- strapi: {
2454
- contentType
2455
- }
2456
- },
2457
- args: {
2458
- documentId: nexus.nonNull(nexus.idArg()),
2459
- status: args.PublicationStatusArg,
2460
- data: nexus.nonNull(getContentTypeInputName(contentType))
2461
- },
2462
- async resolve (parent, args, context) {
2463
- const { auth } = context.state;
2464
- const { data, ...restParams } = args;
2465
- // Sanitize input data
2466
- const sanitizedInputData = await strapi.contentAPI.sanitize.input(data, contentType, {
2467
- auth
2468
- });
2469
- return strapi.documents(uid).update({
2470
- ...restParams,
2471
- data: sanitizedInputData
2472
- });
2473
- }
2474
- });
2475
- };
2476
- const addDeleteMutation = (t, contentType)=>{
2477
- const { uid } = contentType;
2478
- const deleteMutationName = getDeleteMutationTypeName(contentType);
2479
- const { DELETE_MUTATION_RESPONSE_TYPE_NAME } = strapi.plugin('graphql').service('constants');
2480
- t.field(deleteMutationName, {
2481
- type: DELETE_MUTATION_RESPONSE_TYPE_NAME,
2482
- extensions: {
2483
- strapi: {
2484
- contentType
2485
- }
2486
- },
2487
- args: {
2488
- documentId: nexus.nonNull(nexus.idArg())
2489
- },
2490
- async resolve (parent, args) {
2491
- const { documentId } = args;
2492
- await strapi.documents(uid).delete({
2493
- documentId
2494
- });
2495
- return {
2496
- documentId
2497
- };
2498
- }
2499
- });
2500
- };
2501
- return {
2502
- buildCollectionTypeMutations (contentType) {
2503
- const createMutationName = `Mutation.${getCreateMutationTypeName(contentType)}`;
2504
- const updateMutationName = `Mutation.${getUpdateMutationTypeName(contentType)}`;
2505
- const deleteMutationName = `Mutation.${getDeleteMutationTypeName(contentType)}`;
2506
- const extension = getService('extension');
2507
- const registerAuthConfig = (action, auth)=>{
2508
- return extension.use({
2509
- resolversConfig: {
2510
- [action]: {
2511
- auth
2512
- }
2513
- }
2514
- });
2515
- };
2516
- const isActionEnabled = (action)=>{
2517
- return extension.shadowCRUD(contentType.uid).isActionEnabled(action);
2518
- };
2519
- const isCreateEnabled = isActionEnabled('create');
2520
- const isUpdateEnabled = isActionEnabled('update');
2521
- const isDeleteEnabled = isActionEnabled('delete');
2522
- if (isCreateEnabled) {
2523
- registerAuthConfig(createMutationName, {
2524
- scope: [
2525
- `${contentType.uid}.create`
2526
- ]
2527
- });
2528
- }
2529
- if (isUpdateEnabled) {
2530
- registerAuthConfig(updateMutationName, {
2531
- scope: [
2532
- `${contentType.uid}.update`
2533
- ]
2534
- });
2535
- }
2536
- if (isDeleteEnabled) {
2537
- registerAuthConfig(deleteMutationName, {
2538
- scope: [
2539
- `${contentType.uid}.delete`
2540
- ]
2541
- });
2542
- }
2543
- return nexus.extendType({
2544
- type: 'Mutation',
2545
- definition (t) {
2546
- if (isCreateEnabled) {
2547
- addCreateMutation(t, contentType);
2548
- }
2549
- if (isUpdateEnabled) {
2550
- addUpdateMutation(t, contentType);
2551
- }
2552
- if (isDeleteEnabled) {
2553
- addDeleteMutation(t, contentType);
2554
- }
2555
- }
2556
- });
2557
- }
2558
- };
2559
- });
2560
-
2561
- const { NotFoundError } = utils$2.errors;
2562
- var createSingleTypeMutationsBuilder = (({ strapi })=>{
2563
- const { service: getService } = strapi.plugin('graphql');
2564
- const { naming } = getService('utils');
2565
- const { args } = getService('internals');
2566
- const { getUpdateMutationTypeName, getTypeName, getContentTypeInputName, getDeleteMutationTypeName } = naming;
2567
- const addUpdateMutation = (t, contentType)=>{
2568
- const { uid } = contentType;
2569
- const updateMutationName = getUpdateMutationTypeName(contentType);
2570
- const typeName = getTypeName(contentType);
2571
- t.field(updateMutationName, {
2572
- type: typeName,
2573
- extensions: {
2574
- strapi: {
2575
- contentType
2576
- }
2577
- },
2578
- args: {
2579
- // Update payload
2580
- status: args.PublicationStatusArg,
2581
- data: nexus.nonNull(getContentTypeInputName(contentType))
2582
- },
2583
- async resolve (parent, args, context) {
2584
- const { auth } = context.state;
2585
- // Sanitize input data
2586
- const sanitizedInputData = await strapi.contentAPI.sanitize.input(args.data, contentType, {
2587
- auth
2588
- });
2589
- const document = await strapi.db?.query(uid).findOne();
2590
- if (document) {
2591
- return strapi.documents(uid).update({
2592
- ...args,
2593
- documentId: document.documentId,
2594
- data: sanitizedInputData
2595
- });
2596
- }
2597
- return strapi.documents(uid).create({
2598
- ...args,
2599
- data: sanitizedInputData
2600
- });
2601
- }
2602
- });
2603
- };
2604
- const addDeleteMutation = (t, contentType)=>{
2605
- const { uid } = contentType;
2606
- const deleteMutationName = getDeleteMutationTypeName(contentType);
2607
- const { DELETE_MUTATION_RESPONSE_TYPE_NAME } = strapi.plugin('graphql').service('constants');
2608
- t.field(deleteMutationName, {
2609
- type: DELETE_MUTATION_RESPONSE_TYPE_NAME,
2610
- extensions: {
2611
- strapi: {
2612
- contentType
2613
- }
2614
- },
2615
- args: {},
2616
- async resolve (parent, args) {
2617
- const document = await strapi.db?.query(uid).findOne();
2618
- if (!document) {
2619
- throw new NotFoundError('Document not found');
2620
- }
2621
- await strapi.documents(uid).delete({
2622
- ...args,
2623
- documentId: document.documentId
2624
- });
2625
- return document;
2626
- }
2627
- });
2628
- };
2629
- return {
2630
- buildSingleTypeMutations (contentType) {
2631
- const updateMutationName = `Mutation.${getUpdateMutationTypeName(contentType)}`;
2632
- const deleteMutationName = `Mutation.${getDeleteMutationTypeName(contentType)}`;
2633
- const extension = getService('extension');
2634
- const registerAuthConfig = (action, auth)=>{
2635
- return extension.use({
2636
- resolversConfig: {
2637
- [action]: {
2638
- auth
2639
- }
2640
- }
2641
- });
2642
- };
2643
- const isActionEnabled = (action)=>{
2644
- return extension.shadowCRUD(contentType.uid).isActionEnabled(action);
2645
- };
2646
- const isUpdateEnabled = isActionEnabled('update');
2647
- const isDeleteEnabled = isActionEnabled('delete');
2648
- if (isUpdateEnabled) {
2649
- registerAuthConfig(updateMutationName, {
2650
- scope: [
2651
- `${contentType.uid}.update`
2652
- ]
2653
- });
2654
- }
2655
- if (isDeleteEnabled) {
2656
- registerAuthConfig(deleteMutationName, {
2657
- scope: [
2658
- `${contentType.uid}.delete`
2659
- ]
2660
- });
2661
- }
2662
- return nexus.extendType({
2663
- type: 'Mutation',
2664
- definition (t) {
2665
- if (isUpdateEnabled) {
2666
- addUpdateMutation(t, contentType);
2667
- }
2668
- if (isDeleteEnabled) {
2669
- addDeleteMutation(t, contentType);
2670
- }
2671
- }
2672
- });
2673
- }
2674
- };
2675
- });
2676
-
2677
- var mutations = ((context)=>({
2678
- ...createCollectionTypeMutationsBuilder(context),
2679
- ...createSingleTypeMutationsBuilder(context)
2680
- }));
2681
-
2682
- var contentType = (({ strapi })=>{
2683
- const rootLevelOperators = ()=>{
2684
- const { operators } = strapi.plugin('graphql').service('builders').filters;
2685
- return [
2686
- operators.and,
2687
- operators.or,
2688
- operators.not
2689
- ];
2690
- };
2691
- const addScalarAttribute = (builder, attributeName, attribute)=>{
2692
- const { naming, mappers } = strapi.plugin('graphql').service('utils');
2693
- const gqlType = mappers.strapiScalarToGraphQLScalar(attribute.type);
2694
- builder.field(attributeName, {
2695
- type: naming.getScalarFilterInputTypeName(gqlType)
2696
- });
2697
- };
2698
- const addRelationalAttribute = (builder, attributeName, attribute)=>{
2699
- const utils = strapi.plugin('graphql').service('utils');
2700
- const extension = strapi.plugin('graphql').service('extension');
2701
- const { getFiltersInputTypeName } = utils.naming;
2702
- const { isMorphRelation } = utils.attributes;
2703
- const model = 'target' in attribute && strapi.getModel(attribute.target);
2704
- // If there is no model corresponding to the attribute configuration
2705
- // or if the attribute is a polymorphic relation, then ignore it
2706
- if (!model || isMorphRelation(attribute)) return;
2707
- // If the target model is disabled, then ignore it too
2708
- if (extension.shadowCRUD(model.uid).isDisabled()) return;
2709
- builder.field(attributeName, {
2710
- type: getFiltersInputTypeName(model)
2711
- });
2712
- };
2713
- const addComponentAttribute = (builder, attributeName, attribute)=>{
2714
- const utils = strapi.plugin('graphql').service('utils');
2715
- const extension = strapi.plugin('graphql').service('extension');
2716
- const { getFiltersInputTypeName } = utils.naming;
2717
- const component = strapi.getModel(attribute.component);
2718
- // If there is no component corresponding to the attribute configuration, then ignore it
2719
- if (!component) return;
2720
- // If the component is disabled, then ignore it too
2721
- if (extension.shadowCRUD(component.uid).isDisabled()) return;
2722
- builder.field(attributeName, {
2723
- type: getFiltersInputTypeName(component)
2724
- });
2725
- };
2726
- const buildContentTypeFilters = (contentType)=>{
2727
- const utils = strapi.plugin('graphql').service('utils');
2728
- const extension = strapi.plugin('graphql').service('extension');
2729
- const { getFiltersInputTypeName, getScalarFilterInputTypeName } = utils.naming;
2730
- const { isStrapiScalar, isRelation, isComponent } = utils.attributes;
2731
- const { attributes } = contentType;
2732
- const filtersTypeName = getFiltersInputTypeName(contentType);
2733
- return nexus.inputObjectType({
2734
- name: filtersTypeName,
2735
- definition (t) {
2736
- const validAttributes = Object.entries(attributes)// Remove private attributes
2737
- .filter(([attributeName])=>!utils$2.contentTypes.isPrivateAttribute(contentType, attributeName))// Remove attributes that have been disabled using the shadow CRUD extension API
2738
- .filter(([attributeName])=>extension.shadowCRUD(contentType.uid).field(attributeName).hasFiltersEnabeld());
2739
- const isIDFilterEnabled = extension.shadowCRUD(contentType.uid).field('documentId').hasFiltersEnabeld();
2740
- // Add an ID filter to the collection types
2741
- if (contentType.kind === 'collectionType' && isIDFilterEnabled) {
2742
- t.field('documentId', {
2743
- type: getScalarFilterInputTypeName('ID')
2744
- });
2745
- }
2746
- // Add every defined attribute
2747
- for (const [attributeName, attribute] of validAttributes){
2748
- // Handle scalars
2749
- if (isStrapiScalar(attribute)) {
2750
- addScalarAttribute(t, attributeName, attribute);
2751
- } else if (isRelation(attribute)) {
2752
- addRelationalAttribute(t, attributeName, attribute);
2753
- } else if (isComponent(attribute)) {
2754
- addComponentAttribute(t, attributeName, attribute);
2755
- }
2756
- }
2757
- // Conditional clauses
2758
- for (const operator of rootLevelOperators()){
2759
- operator.add(t, filtersTypeName);
2760
- }
2761
- }
2762
- });
2763
- };
2764
- return {
2765
- buildContentTypeFilters
2766
- };
2767
- });
2768
-
2769
- var filters = ((context)=>({
2770
- ...contentType(context)
2771
- }));
2772
-
2773
- const { isWritableAttribute } = utils$2.contentTypes;
2774
- var inputs = (({ strapi })=>{
2775
- const { naming, mappers, attributes } = strapi.plugin('graphql').service('utils');
2776
- const extension = strapi.plugin('graphql').service('extension');
2777
- const { getComponentInputName, getContentTypeInputName, getEnumName, getDynamicZoneInputName } = naming;
2778
- const { isStrapiScalar, isRelation, isMorphRelation, isMedia, isEnumeration, isComponent, isDynamicZone } = attributes;
2779
- return {
2780
- buildInputType (contentType) {
2781
- const { attributes, modelType } = contentType;
2782
- const name = (modelType === 'component' ? getComponentInputName : getContentTypeInputName).call(null, contentType);
2783
- return nexus.inputObjectType({
2784
- name,
2785
- definition (t) {
2786
- const isFieldEnabled = (fieldName)=>{
2787
- return extension.shadowCRUD(contentType.uid).field(fieldName).hasInputEnabled();
2788
- };
2789
- const validAttributes = Object.entries(attributes)// Remove private attributes
2790
- .filter(([attributeName])=>!utils$2.contentTypes.isPrivateAttribute(contentType, attributeName))// Remove non-writable attributes
2791
- .filter(([attributeName])=>isWritableAttribute(contentType, attributeName))// Remove filters that have been disabled using the shadow CRUD extension API
2792
- .filter(([attributeName])=>isFieldEnabled(attributeName));
2793
- // Add the ID for the component to enable inplace updates
2794
- if (modelType === 'component' && isFieldEnabled('id')) {
2795
- t.id('id');
2796
- }
2797
- validAttributes.forEach(([attributeName, attribute])=>{
2798
- // Enums
2799
- if (isEnumeration(attribute)) {
2800
- const enumTypeName = getEnumName(contentType, attributeName);
2801
- t.field(attributeName, {
2802
- type: enumTypeName
2803
- });
2804
- } else if (isStrapiScalar(attribute)) {
2805
- const gqlScalar = mappers.strapiScalarToGraphQLScalar(attribute.type);
2806
- t.field(attributeName, {
2807
- type: gqlScalar
2808
- });
2809
- } else if (isMedia(attribute)) {
2810
- const isMultiple = attribute.multiple === true;
2811
- if (extension.shadowCRUD('plugin::upload.file').isDisabled()) {
2812
- return;
2813
- }
2814
- if (isMultiple) {
2815
- t.list.id(attributeName);
2816
- } else {
2817
- t.id(attributeName);
2818
- }
2819
- } else if (isRelation(attribute) && !isMorphRelation(attribute)) {
2820
- if (extension.shadowCRUD(attribute.target).isDisabled()) {
2821
- return;
2822
- }
2823
- const isToManyRelation = attribute.relation.endsWith('Many');
2824
- if (isToManyRelation) {
2825
- t.list.id(attributeName);
2826
- } else {
2827
- t.id(attributeName);
2828
- }
2829
- } else if (isComponent(attribute)) {
2830
- const isRepeatable = attribute.repeatable === true;
2831
- const component = strapi.components[attribute.component];
2832
- const componentInputType = getComponentInputName(component);
2833
- if (isRepeatable) {
2834
- t.list.field(attributeName, {
2835
- type: componentInputType
2836
- });
2837
- } else {
2838
- t.field(attributeName, {
2839
- type: componentInputType
2840
- });
2841
- }
2842
- } else if (isDynamicZone(attribute)) {
2843
- const dzInputName = getDynamicZoneInputName(contentType, attributeName);
2844
- t.list.field(attributeName, {
2845
- type: nexus.nonNull(dzInputName)
2846
- });
2847
- }
2848
- });
2849
- }
2850
- });
2851
- }
2852
- };
2853
- });
2854
-
2855
- var genericMorph = (({ strapi, registry })=>{
2856
- const { naming } = strapi.plugin('graphql').service('utils');
2857
- const { KINDS, GENERIC_MORPH_TYPENAME } = strapi.plugin('graphql').service('constants');
2858
- return {
2859
- buildGenericMorphDefinition () {
2860
- return nexus.unionType({
2861
- name: GENERIC_MORPH_TYPENAME,
2862
- resolveType (obj) {
2863
- const contentType = strapi.getModel(obj.__type);
2864
- if (!contentType) {
2865
- return null;
2866
- }
2867
- if (contentType.modelType === 'component') {
2868
- return naming.getComponentName(contentType);
2869
- }
2870
- return naming.getTypeName(contentType);
2871
- },
2872
- definition (t) {
2873
- const members = registry// Resolve every content-type or component
2874
- .where(({ config })=>[
2875
- KINDS.type,
2876
- KINDS.component
2877
- ].includes(config.kind))// Only keep their name (the type's id)
2878
- .map(fp.prop('name'));
2879
- t.members(...members);
2880
- }
2881
- });
2882
- }
2883
- };
2884
- });
2885
-
2886
- const { ApplicationError } = utils$2.errors;
2887
- var associationResolvers = (({ strapi })=>{
2888
- const { service: getGraphQLService } = strapi.plugin('graphql');
2889
- const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;
2890
- const { transformArgs } = getGraphQLService('builders').utils;
2891
- const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;
2892
- return {
2893
- buildAssociationResolver ({ contentTypeUID, attributeName }) {
2894
- const contentType = strapi.getModel(contentTypeUID);
2895
- const attribute = contentType.attributes[attributeName];
2896
- if (!attribute) {
2897
- throw new ApplicationError(`Failed to build an association resolver for ${contentTypeUID}::${attributeName}`);
2898
- }
2899
- const isMediaAttribute = isMedia(attribute);
2900
- const isMorphAttribute = isMorphRelation(attribute);
2901
- const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;
2902
- const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');
2903
- const targetContentType = strapi.getModel(targetUID);
2904
- return async (parent, args = {}, context = {})=>{
2905
- const { auth } = context.state;
2906
- const transformedArgs = transformArgs(args, {
2907
- contentType: targetContentType,
2908
- usePagination: true
2909
- });
2910
- await strapi.contentAPI.validate.query(transformedArgs, targetContentType, {
2911
- auth
2912
- });
2913
- const sanitizedQuery = await strapi.contentAPI.sanitize.query(transformedArgs, targetContentType, {
2914
- auth
2915
- });
2916
- const dbQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);
2917
- const data = await strapi.db?.query(contentTypeUID).load(parent, attributeName, dbQuery);
2918
- const info = {
2919
- args: sanitizedQuery,
2920
- resourceUID: targetUID
2921
- };
2922
- // If this a polymorphic association, it sanitizes & returns the raw data
2923
- // Note: The value needs to be wrapped in a fake object that represents its parent
2924
- // so that the sanitize util can work properly.
2925
- if (isMorphAttribute) {
2926
- // Helpers used for the data cleanup
2927
- const wrapData = (dataToWrap)=>({
2928
- [attributeName]: dataToWrap
2929
- });
2930
- const sanitizeData = (dataToSanitize)=>{
2931
- return strapi.contentAPI.sanitize.output(dataToSanitize, contentType, {
2932
- auth
2933
- });
2934
- };
2935
- const unwrapData = fp.get(attributeName);
2936
- // Sanitizer definition
2937
- const sanitizeMorphAttribute = utils$2.async.pipe(wrapData, sanitizeData, unwrapData);
2938
- return sanitizeMorphAttribute(data);
2939
- }
2940
- // If this is a to-many relation, it returns an object that
2941
- // matches what the entity-response-collection's resolvers expect
2942
- if (isToMany) {
2943
- return toEntityResponseCollection(data, info);
2944
- }
2945
- // Else, it returns an object that matches
2946
- // what the entity-response's resolvers expect
2947
- return toEntityResponse(data, info);
2948
- };
2949
- }
2950
- };
2951
- });
2952
-
2953
- var queriesResolvers = (({ strapi })=>({
2954
- buildQueriesResolvers ({ contentType }) {
2955
- const { uid } = contentType;
2956
- return {
2957
- async findMany (parent, args, ctx) {
2958
- await strapi.contentAPI.validate.query(args, contentType, {
2959
- auth: ctx?.state?.auth
2960
- });
2961
- const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
2962
- auth: ctx?.state?.auth
2963
- });
2964
- return strapi.documents(uid).findMany({
2965
- status: 'published',
2966
- ...sanitizedQuery
2967
- });
2968
- },
2969
- async findFirst (parent, args, ctx) {
2970
- await strapi.contentAPI.validate.query(args, contentType, {
2971
- auth: ctx?.state?.auth
2972
- });
2973
- const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
2974
- auth: ctx?.state?.auth
2975
- });
2976
- return strapi.documents(uid).findFirst({
2977
- status: 'published',
2978
- ...sanitizedQuery
2979
- });
2980
- },
2981
- async findOne (parent, args, ctx) {
2982
- const { documentId } = args;
2983
- await strapi.contentAPI.validate.query(args, contentType, {
2984
- auth: ctx?.state?.auth
2985
- });
2986
- const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
2987
- auth: ctx?.state?.auth
2988
- });
2989
- return strapi.documents(uid).findOne({
2990
- status: 'published',
2991
- ...fp.omit([
2992
- 'id',
2993
- 'documentId'
2994
- ], sanitizedQuery),
2995
- documentId
2996
- });
2997
- }
2998
- };
2999
- }
3000
- }));
3001
-
3002
- var componentResolvers = (({ strapi })=>({
3003
- buildComponentResolver ({ contentTypeUID, attributeName }) {
3004
- const { transformArgs } = strapi.plugin('graphql').service('builders').utils;
3005
- return async (parent, args, ctx)=>{
3006
- const contentType = strapi.getModel(contentTypeUID);
3007
- const { component: componentName } = contentType.attributes[attributeName];
3008
- const component = strapi.getModel(componentName);
3009
- const transformedArgs = transformArgs(args, {
3010
- contentType: component,
3011
- usePagination: true
3012
- });
3013
- await strapi.contentAPI.validate.query(transformedArgs, component, {
3014
- auth: ctx?.state?.auth
3015
- });
3016
- const sanitizedQuery = await strapi.contentAPI.sanitize.query(transformedArgs, component, {
3017
- auth: ctx?.state?.auth
3018
- });
3019
- const dbQuery = strapi.get('query-params').transform(component.uid, sanitizedQuery);
3020
- return strapi.db?.query(contentTypeUID).load(parent, attributeName, dbQuery);
3021
- };
3022
- }
3023
- }));
3024
-
3025
- var dynamicZoneResolvers = (({ strapi })=>({
3026
- buildDynamicZoneResolver ({ contentTypeUID, attributeName }) {
3027
- return async (parent)=>{
3028
- return strapi.db?.query(contentTypeUID).load(parent, attributeName);
3029
- };
3030
- }
3031
- }));
3032
-
3033
- var paginationResolvers = (({ strapi })=>({
3034
- async resolvePagination (parent, _, ctx) {
3035
- const { args, resourceUID } = parent.info;
3036
- const { start, limit } = args;
3037
- const safeLimit = Math.max(limit, 1);
3038
- const contentType = strapi.getModel(resourceUID);
3039
- await strapi.contentAPI.validate.query(args, contentType, {
3040
- auth: ctx?.state?.auth
3041
- });
3042
- const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
3043
- auth: ctx?.state?.auth
3044
- });
3045
- const total = await strapi.documents(resourceUID).count(sanitizedQuery);
3046
- const pageSize = limit === -1 ? total - start : safeLimit;
3047
- const pageCount = limit === -1 ? safeLimit : Math.ceil(total / safeLimit);
3048
- const page = limit === -1 ? safeLimit : Math.floor(start / safeLimit) + 1;
3049
- return {
3050
- total,
3051
- page,
3052
- pageSize,
3053
- pageCount
3054
- };
3055
- }
3056
- }));
3057
-
3058
- var resolvers = ((context)=>({
3059
- // Generics
3060
- ...associationResolvers(context),
3061
- // Builders
3062
- ...queriesResolvers(context),
3063
- ...componentResolvers(context),
3064
- ...dynamicZoneResolvers(context),
3065
- ...paginationResolvers(context)
3066
- }));
3067
-
3068
- const AND_FIELD_NAME = 'and';
3069
- var andOperator = (()=>({
3070
- fieldName: AND_FIELD_NAME,
3071
- strapiOperator: '$and',
3072
- add (t, type) {
3073
- t.field(AND_FIELD_NAME, {
3074
- type: nexus.list(type)
3075
- });
3076
- }
3077
- }));
3078
-
3079
- const OR_FIELD_NAME = 'or';
3080
- var orOperator = (()=>({
3081
- fieldName: OR_FIELD_NAME,
3082
- strapiOperator: '$or',
3083
- add (t, type) {
3084
- t.field(OR_FIELD_NAME, {
3085
- type: nexus.list(type)
3086
- });
3087
- }
3088
- }));
3089
-
3090
- const NOT_FIELD_NAME = 'not';
3091
- var notOperator = (({ strapi })=>({
3092
- fieldName: NOT_FIELD_NAME,
3093
- strapiOperator: '$not',
3094
- add (t, type) {
3095
- const { naming, attributes } = strapi.plugin('graphql').service('utils');
3096
- if (attributes.isGraphQLScalar({
3097
- type
3098
- })) {
3099
- t.field(NOT_FIELD_NAME, {
3100
- type: naming.getScalarFilterInputTypeName(type)
3101
- });
3102
- } else {
3103
- t.field(NOT_FIELD_NAME, {
3104
- type
3105
- });
3106
- }
3107
- }
3108
- }));
3109
-
3110
- const { ValidationError } = utils$2.errors;
3111
- const EQ_FIELD_NAME = 'eq';
3112
- var eqOperator = (({ strapi })=>({
3113
- fieldName: EQ_FIELD_NAME,
3114
- strapiOperator: '$eq',
3115
- add (t, type) {
3116
- const { GRAPHQL_SCALARS } = strapi.plugin('graphql').service('constants');
3117
- if (!GRAPHQL_SCALARS.includes(type)) {
3118
- throw new ValidationError(`Can't use "${EQ_FIELD_NAME}" operator. "${type}" is not a valid scalar`);
3119
- }
3120
- t.field(EQ_FIELD_NAME, {
3121
- type
3122
- });
3123
- }
3124
- }));
3125
-
3126
- const EQI_FIELD_NAME = 'eqi';
3127
- var eqiOperator = (()=>({
3128
- fieldName: EQI_FIELD_NAME,
3129
- strapiOperator: '$eqi',
3130
- add (t, type) {
3131
- t.field(EQI_FIELD_NAME, {
3132
- type
3133
- });
3134
- }
3135
- }));
3136
-
3137
- const NE_FIELD_NAME = 'ne';
3138
- var neOperator = (()=>({
3139
- fieldName: NE_FIELD_NAME,
3140
- strapiOperator: '$ne',
3141
- add (t, type) {
3142
- t.field(NE_FIELD_NAME, {
3143
- type
3144
- });
3145
- }
3146
- }));
3147
-
3148
- const NEI_FIELD_NAME = 'nei';
3149
- var neiOperator = (()=>({
3150
- fieldName: NEI_FIELD_NAME,
3151
- strapiOperator: '$nei',
3152
- add (t, type) {
3153
- t.field(NEI_FIELD_NAME, {
3154
- type
3155
- });
3156
- }
3157
- }));
3158
-
3159
- const STARTS_WITH_FIELD_NAME = 'startsWith';
3160
- var startsWithOperator = (()=>({
3161
- fieldName: STARTS_WITH_FIELD_NAME,
3162
- strapiOperator: '$startsWith',
3163
- add (t, type) {
3164
- t.field(STARTS_WITH_FIELD_NAME, {
3165
- type
3166
- });
3167
- }
3168
- }));
3169
-
3170
- const ENDS_WITH_FIELD_NAME = 'endsWith';
3171
- var endsWithOperator = (()=>({
3172
- fieldName: ENDS_WITH_FIELD_NAME,
3173
- strapiOperator: '$endsWith',
3174
- add (t, type) {
3175
- t.field(ENDS_WITH_FIELD_NAME, {
3176
- type
3177
- });
3178
- }
3179
- }));
3180
-
3181
- const CONTAINS_FIELD_NAME = 'contains';
3182
- var containsOperator = (()=>({
3183
- fieldName: CONTAINS_FIELD_NAME,
3184
- strapiOperator: '$contains',
3185
- add (t, type) {
3186
- t.field(CONTAINS_FIELD_NAME, {
3187
- type
3188
- });
3189
- }
3190
- }));
3191
-
3192
- const NOT_CONTAINS_FIELD_NAME = 'notContains';
3193
- var notContainsOperator = (()=>({
3194
- fieldName: NOT_CONTAINS_FIELD_NAME,
3195
- strapiOperator: '$notContains',
3196
- add (t, type) {
3197
- t.field(NOT_CONTAINS_FIELD_NAME, {
3198
- type
3199
- });
3200
- }
3201
- }));
3202
-
3203
- const CONTAINSI_FIELD_NAME = 'containsi';
3204
- var containsiOperator = (()=>({
3205
- fieldName: CONTAINSI_FIELD_NAME,
3206
- strapiOperator: '$containsi',
3207
- add (t, type) {
3208
- t.field(CONTAINSI_FIELD_NAME, {
3209
- type
3210
- });
3211
- }
3212
- }));
3213
-
3214
- const NOT_CONTAINSI_FIELD_NAME = 'notContainsi';
3215
- var notContainsiOperator = (()=>({
3216
- fieldName: NOT_CONTAINSI_FIELD_NAME,
3217
- strapiOperator: '$notContainsi',
3218
- add (t, type) {
3219
- t.field(NOT_CONTAINSI_FIELD_NAME, {
3220
- type
3221
- });
3222
- }
3223
- }));
3224
-
3225
- const GT_FIELD_NAME = 'gt';
3226
- var gtOperator = (()=>({
3227
- fieldName: GT_FIELD_NAME,
3228
- strapiOperator: '$gt',
3229
- add (t, type) {
3230
- t.field(GT_FIELD_NAME, {
3231
- type
3232
- });
3233
- }
3234
- }));
3235
-
3236
- const GTE_FIELD_NAME = 'gte';
3237
- var gteOperator = (()=>({
3238
- fieldName: GTE_FIELD_NAME,
3239
- strapiOperator: '$gte',
3240
- add (t, type) {
3241
- t.field(GTE_FIELD_NAME, {
3242
- type
3243
- });
3244
- }
3245
- }));
3246
-
3247
- const LT_FIELD_NAME = 'lt';
3248
- var ltOperator = (()=>({
3249
- fieldName: LT_FIELD_NAME,
3250
- strapiOperator: '$lt',
3251
- add (t, type) {
3252
- t.field(LT_FIELD_NAME, {
3253
- type
3254
- });
3255
- }
3256
- }));
3257
-
3258
- const LTE_FIELD_NAME = 'lte';
3259
- var lteOperator = (()=>({
3260
- fieldName: LTE_FIELD_NAME,
3261
- strapiOperator: '$lte',
3262
- add (t, type) {
3263
- t.field(LTE_FIELD_NAME, {
3264
- type
3265
- });
3266
- }
3267
- }));
3268
-
3269
- const NULL_FIELD_NAME = 'null';
3270
- var nullOperator = (()=>({
3271
- fieldName: NULL_FIELD_NAME,
3272
- strapiOperator: '$null',
3273
- add (t) {
3274
- t.boolean(NULL_FIELD_NAME);
3275
- }
3276
- }));
3277
-
3278
- const NOT_NULL_FIELD_NAME = 'notNull';
3279
- var notNullOperator = (()=>({
3280
- fieldName: NOT_NULL_FIELD_NAME,
3281
- strapiOperator: '$notNull',
3282
- add (t) {
3283
- t.boolean(NOT_NULL_FIELD_NAME);
3284
- }
3285
- }));
3286
-
3287
- const IN_FIELD_NAME = 'in';
3288
- var inOperator = (()=>({
3289
- fieldName: IN_FIELD_NAME,
3290
- strapiOperator: '$in',
3291
- add (t, type) {
3292
- t.field(IN_FIELD_NAME, {
3293
- type: nexus.list(type)
3294
- });
3295
- }
3296
- }));
3297
-
3298
- const NOT_IN_FIELD_NAME = 'notIn';
3299
- var notInOperator = (()=>({
3300
- fieldName: NOT_IN_FIELD_NAME,
3301
- strapiOperator: '$notIn',
3302
- add (t, type) {
3303
- t.field(NOT_IN_FIELD_NAME, {
3304
- type: nexus.list(type)
3305
- });
3306
- }
3307
- }));
3308
-
3309
- const BETWEEN_FIELD_NAME = 'between';
3310
- var betweenOperator = (()=>({
3311
- fieldName: BETWEEN_FIELD_NAME,
3312
- strapiOperator: '$between',
3313
- add (t, type) {
3314
- t.field(BETWEEN_FIELD_NAME, {
3315
- type: nexus.list(type)
3316
- });
3317
- }
3318
- }));
3319
-
3320
- const operators = {
3321
- and: andOperator,
3322
- or: orOperator,
3323
- not: notOperator,
3324
- eq: eqOperator,
3325
- eqi: eqiOperator,
3326
- ne: neOperator,
3327
- nei: neiOperator,
3328
- startsWith: startsWithOperator,
3329
- endsWith: endsWithOperator,
3330
- contains: containsOperator,
3331
- notContains: notContainsOperator,
3332
- containsi: containsiOperator,
3333
- notContainsi: notContainsiOperator,
3334
- gt: gtOperator,
3335
- gte: gteOperator,
3336
- lt: ltOperator,
3337
- lte: lteOperator,
3338
- null: nullOperator,
3339
- notNull: notNullOperator,
3340
- in: inOperator,
3341
- notIn: notInOperator,
3342
- between: betweenOperator
3343
- };
3344
- // Instantiate every operator with the Strapi instance
3345
- var operators$1 = (({ strapi })=>fp.mapValues((opCtor)=>opCtor({
3346
- strapi
3347
- }), operators));
3348
-
3349
- const { withDefaultPagination } = utils$2.pagination;
3350
- var utils = (({ strapi })=>{
3351
- const { service: getService } = strapi.plugin('graphql');
3352
- return {
3353
- getContentTypeArgs (contentType, { multiple = true, isNested = false } = {}) {
3354
- const { naming } = getService('utils');
3355
- const { args } = getService('internals');
3356
- const { modelType } = contentType;
3357
- // Components
3358
- if (modelType === 'component') {
3359
- if (!multiple) return {};
3360
- return {
3361
- filters: naming.getFiltersInputTypeName(contentType),
3362
- pagination: args.PaginationArg,
3363
- sort: args.SortArg
3364
- };
3365
- }
3366
- const { kind } = contentType;
3367
- // Collection Types
3368
- if (kind === 'collectionType') {
3369
- if (!multiple) {
3370
- return {
3371
- documentId: nexus.nonNull(nexus.idArg()),
3372
- status: args.PublicationStatusArg
3373
- };
3374
- }
3375
- const params = {
3376
- filters: naming.getFiltersInputTypeName(contentType),
3377
- pagination: args.PaginationArg,
3378
- sort: args.SortArg
3379
- };
3380
- if (!isNested) {
3381
- Object.assign(params, {
3382
- status: args.PublicationStatusArg
3383
- });
3384
- }
3385
- return params;
3386
- }
3387
- // Single Types
3388
- if (kind === 'singleType') {
3389
- const params = {};
3390
- if (!isNested) {
3391
- Object.assign(params, {
3392
- status: args.PublicationStatusArg
3393
- });
3394
- }
3395
- return params;
3396
- }
3397
- },
3398
- /**
3399
- * Filter an object entries and keep only those whose value is a unique scalar attribute
3400
- */ getUniqueScalarAttributes (attributes) {
3401
- const { isStrapiScalar } = getService('utils').attributes;
3402
- const uniqueAttributes = fp.entries(attributes).filter(([, attribute])=>isStrapiScalar(attribute) && 'unique' in attribute && attribute.unique);
3403
- return Object.fromEntries(uniqueAttributes);
3404
- },
3405
- /**
3406
- * Map each value from an attribute to a FiltersInput type name
3407
- * @param {object} attributes - The attributes object to transform
3408
- * @return {Object<string, string>}
3409
- */ scalarAttributesToFiltersMap (attributes) {
3410
- return fp.mapValues((attribute)=>{
3411
- const { mappers, naming } = getService('utils');
3412
- const gqlScalar = mappers.strapiScalarToGraphQLScalar(attribute.type);
3413
- return naming.getScalarFilterInputTypeName(gqlScalar);
3414
- }, attributes);
3415
- },
3416
- /**
3417
- * Apply basic transform to GQL args
3418
- */ transformArgs (args, { contentType, usePagination = false }) {
3419
- const { mappers } = getService('utils');
3420
- const { config } = strapi.plugin('graphql');
3421
- const { pagination = {}, filters = {} } = args;
3422
- // Init
3423
- const newArgs = fp.omit([
3424
- 'pagination',
3425
- 'filters'
3426
- ], args);
3427
- // Pagination
3428
- if (usePagination) {
3429
- const defaultLimit = config('defaultLimit');
3430
- const maxLimit = config('maxLimit');
3431
- Object.assign(newArgs, withDefaultPagination(pagination, {
3432
- maxLimit,
3433
- defaults: {
3434
- offset: {
3435
- limit: defaultLimit
3436
- },
3437
- page: {
3438
- pageSize: defaultLimit
3439
- }
3440
- }
3441
- }));
3442
- }
3443
- // Filters
3444
- if (args.filters) {
3445
- Object.assign(newArgs, {
3446
- filters: mappers.graphQLFiltersToStrapiQuery(filters, contentType)
3447
- });
3448
- }
3449
- return newArgs;
3450
- }
3451
- };
3452
- });
3453
-
3454
- const buildersFactories = [
3455
- enums,
3456
- dynamicZone,
3457
- entity,
3458
- typeBuilder,
3459
- response,
3460
- responseCollection,
3461
- relationResponseCollection,
3462
- queries,
3463
- mutations,
3464
- filters,
3465
- inputs,
3466
- genericMorph,
3467
- resolvers
3468
- ];
3469
- var builders = (({ strapi })=>{
3470
- const buildersMap = new Map();
3471
- return {
3472
- /**
3473
- * Instantiate every builder with a strapi instance & a type registry
3474
- */ new (name, registry) {
3475
- const context = {
3476
- strapi,
3477
- registry
3478
- };
3479
- const builders = fp.pipe(// Create a new instance of every builders
3480
- fp.map((factory)=>factory(context)), // Merge every builder into the same object
3481
- fp.reduce(fp.merge, {})).call(null, buildersFactories);
3482
- buildersMap.set(name, builders);
3483
- return builders;
3484
- },
3485
- /**
3486
- * Delete a set of builders instances from
3487
- * the builders map for a given name
3488
- */ delete (name) {
3489
- buildersMap.delete(name);
3490
- },
3491
- /**
3492
- * Retrieve a set of builders instances from
3493
- * the builders map for a given name
3494
- */ get (name) {
3495
- return buildersMap.get(name);
3496
- },
3497
- filters: {
3498
- operators: operators$1({
3499
- strapi
3500
- })
3501
- },
3502
- utils: utils({
3503
- strapi
3504
- })
3505
- };
3506
- });
3507
-
3508
- const getDefaultContentTypeConfig = ()=>({
3509
- enabled: true,
3510
- mutations: true,
3511
- queries: true,
3512
- disabledActions: [],
3513
- fields: new Map()
3514
- });
3515
- const getDefaultFieldConfig = ()=>({
3516
- enabled: true,
3517
- input: true,
3518
- output: true,
3519
- filters: true
3520
- });
3521
- const ALL_ACTIONS = '*';
3522
- var createShadowCRUDManager = (()=>{
3523
- const configs = new Map();
3524
- return (uid)=>{
3525
- if (!configs.has(uid)) {
3526
- configs.set(uid, getDefaultContentTypeConfig());
3527
- }
3528
- return {
3529
- isEnabled () {
3530
- return configs.get(uid).enabled;
3531
- },
3532
- isDisabled () {
3533
- return !this.isEnabled();
3534
- },
3535
- areQueriesEnabled () {
3536
- return configs.get(uid).queries;
3537
- },
3538
- areQueriesDisabled () {
3539
- return !this.areQueriesEnabled();
3540
- },
3541
- areMutationsEnabled () {
3542
- return configs.get(uid).mutations;
3543
- },
3544
- areMutationsDisabled () {
3545
- return !this.areMutationsEnabled();
3546
- },
3547
- isActionEnabled (action) {
3548
- const matchingActions = [
3549
- action,
3550
- ALL_ACTIONS
3551
- ];
3552
- return configs.get(uid).disabledActions.every((action)=>!matchingActions.includes(action));
3553
- },
3554
- isActionDisabled (action) {
3555
- return !this.isActionEnabled(action);
3556
- },
3557
- disable () {
3558
- configs.get(uid).enabled = false;
3559
- return this;
3560
- },
3561
- disableQueries () {
3562
- configs.get(uid).queries = false;
3563
- return this;
3564
- },
3565
- disableMutations () {
3566
- configs.get(uid).mutations = false;
3567
- return this;
3568
- },
3569
- disableAction (action) {
3570
- const config = configs.get(uid);
3571
- if (!config.disabledActions.includes(action)) {
3572
- config.disabledActions.push(action);
3573
- }
3574
- return this;
3575
- },
3576
- disableActions (actions = []) {
3577
- actions.forEach((action)=>this.disableAction(action));
3578
- return this;
3579
- },
3580
- field (fieldName) {
3581
- const { fields } = configs.get(uid);
3582
- if (!fields.has(fieldName)) {
3583
- fields.set(fieldName, getDefaultFieldConfig());
3584
- }
3585
- return {
3586
- isEnabled () {
3587
- return fields.get(fieldName).enabled;
3588
- },
3589
- hasInputEnabled () {
3590
- return fields.get(fieldName).input;
3591
- },
3592
- hasOutputEnabled () {
3593
- return fields.get(fieldName).output;
3594
- },
3595
- hasFiltersEnabeld () {
3596
- return fields.get(fieldName).filters;
3597
- },
3598
- disable () {
3599
- fields.set(fieldName, {
3600
- enabled: false,
3601
- output: false,
3602
- input: false,
3603
- filters: false
3604
- });
3605
- return this;
3606
- },
3607
- disableOutput () {
3608
- fields.get(fieldName).output = false;
3609
- return this;
3610
- },
3611
- disableInput () {
3612
- fields.get(fieldName).input = false;
3613
- return this;
3614
- },
3615
- disableFilters () {
3616
- fields.get(fieldName).filters = false;
3617
- return this;
3618
- }
3619
- };
3620
- }
3621
- };
3622
- };
3623
- });
3624
-
3625
- const getDefaultState = ()=>({
3626
- types: [],
3627
- typeDefs: [],
3628
- resolvers: {},
3629
- resolversConfig: {},
3630
- plugins: []
3631
- });
3632
- const createExtension = ({ strapi })=>{
3633
- const configs = [];
3634
- return {
3635
- shadowCRUD: createShadowCRUDManager(),
3636
- /**
3637
- * Register a new extension configuration
3638
- */ use (configuration) {
3639
- configs.push(configuration);
3640
- return this;
3641
- },
3642
- /**
3643
- * Convert the registered configuration into a single extension object & return it
3644
- */ generate ({ typeRegistry }) {
3645
- const resolveConfig = (config)=>{
3646
- return typeof config === 'function' ? config({
3647
- strapi,
3648
- nexus: nexus__namespace,
3649
- typeRegistry
3650
- }) : config;
3651
- };
3652
- // Evaluate & merge every registered configuration object, then return the result
3653
- return configs.reduce((acc, configuration)=>{
3654
- const { types, typeDefs, resolvers, resolversConfig, plugins } = resolveConfig(configuration);
3655
- // Register type definitions
3656
- if (typeof typeDefs === 'string') {
3657
- acc.typeDefs.push(typeDefs);
3658
- }
3659
- // Register nexus types
3660
- if (Array.isArray(types)) {
3661
- acc.types.push(...types);
3662
- }
3663
- // Register nexus plugins
3664
- if (Array.isArray(plugins)) {
3665
- acc.plugins.push(...plugins);
3666
- }
3667
- // Register resolvers
3668
- if (typeof resolvers === 'object') {
3669
- acc.resolvers = fp.merge(acc.resolvers, resolvers);
3670
- }
3671
- // Register resolvers configuration
3672
- if (typeof resolversConfig === 'object') {
3673
- // TODO: smarter merge for auth, middlewares & policies
3674
- acc.resolversConfig = fp.merge(resolversConfig, acc.resolversConfig);
3675
- }
3676
- return acc;
3677
- }, getDefaultState());
3678
- }
3679
- };
3680
- };
3681
-
3682
- var returnTypes = (()=>({
3683
- toEntityResponse (value, info = {}) {
3684
- const { args = {}, resourceUID } = info;
3685
- return {
3686
- value,
3687
- info: {
3688
- args,
3689
- resourceUID
3690
- }
3691
- };
3692
- },
3693
- toEntityResponseCollection (nodes, info = {}) {
3694
- const { args = {}, resourceUID } = info;
3695
- return {
3696
- nodes,
3697
- info: {
3698
- args,
3699
- resourceUID
3700
- }
3701
- };
3702
- }
3703
- }));
3704
-
3705
- var format = (()=>({
3706
- returnTypes: returnTypes()
3707
- }));
3708
-
3709
- const services = {
3710
- builders,
3711
- 'content-api': contentAPI,
3712
- constants,
3713
- extension: createExtension,
3714
- format,
3715
- internals,
3716
- 'type-registry': typeRegistry,
3717
- utils: utils$1
3718
- };
3
+ var index$1 = require('./config/index.js');
4
+ var bootstrap = require('./bootstrap.js');
5
+ var index$2 = require('./services/index.js');
3719
6
 
3720
7
  var index = {
3721
- config,
3722
- bootstrap,
3723
- services
8
+ config: index$1.config,
9
+ bootstrap: bootstrap.bootstrap,
10
+ services: index$2.services
3724
11
  };
3725
12
 
3726
13
  module.exports = index;