@strapi/plugin-graphql 0.0.0-experimental.a9e9dcd32607b6734b6de5aff3903288e03c9bfa → 0.0.0-experimental.abc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{dk-KmLnUoJC.mjs → dk-BbJCmDw6.mjs} +1 -1
  3. package/dist/_chunks/dk-BbJCmDw6.mjs.map +1 -0
  4. package/dist/_chunks/{dk-SLrLqAtl.js → dk-C9NcSzyg.js} +1 -1
  5. package/dist/_chunks/dk-C9NcSzyg.js.map +1 -0
  6. package/dist/_chunks/{en-WmmC2MW8.js → en-BiKpmhCU.js} +1 -1
  7. package/dist/_chunks/en-BiKpmhCU.js.map +1 -0
  8. package/dist/_chunks/{en-A16mqbIV.mjs → en-YIQYYlvv.mjs} +1 -1
  9. package/dist/_chunks/en-YIQYYlvv.mjs.map +1 -0
  10. package/dist/_chunks/{es-_xZ14QXK.mjs → es-BbsZ5Fh0.mjs} +1 -1
  11. package/dist/_chunks/es-BbsZ5Fh0.mjs.map +1 -0
  12. package/dist/_chunks/{es-4tl6ikyU.js → es-DE22V9D4.js} +1 -1
  13. package/dist/_chunks/es-DE22V9D4.js.map +1 -0
  14. package/dist/_chunks/{fr-4BkQ-Qvt.mjs → fr-BgqFw7G8.mjs} +1 -1
  15. package/dist/_chunks/fr-BgqFw7G8.mjs.map +1 -0
  16. package/dist/_chunks/{fr-cJXSt55N.js → fr-Ca-HowfR.js} +1 -1
  17. package/dist/_chunks/fr-Ca-HowfR.js.map +1 -0
  18. package/dist/_chunks/{pl-TWurBBP_.mjs → pl-CbET57Jb.mjs} +1 -1
  19. package/dist/_chunks/pl-CbET57Jb.mjs.map +1 -0
  20. package/dist/_chunks/{pl-wKw9Xgkw.js → pl-DVnJGR87.js} +1 -1
  21. package/dist/_chunks/pl-DVnJGR87.js.map +1 -0
  22. package/dist/_chunks/{ru-aD804UEo.mjs → ru-BFz40YSA.mjs} +1 -1
  23. package/dist/_chunks/ru-BFz40YSA.mjs.map +1 -0
  24. package/dist/_chunks/{ru-CYAnXR6L.js → ru-o4zaP02C.js} +1 -1
  25. package/dist/_chunks/ru-o4zaP02C.js.map +1 -0
  26. package/dist/_chunks/{sv-XNOe1ctV.js → sv-9qK4y9fb.js} +1 -1
  27. package/dist/_chunks/sv-9qK4y9fb.js.map +1 -0
  28. package/dist/_chunks/{sv-N5RufX6w.mjs → sv-CNYcKBn2.mjs} +1 -1
  29. package/dist/_chunks/sv-CNYcKBn2.mjs.map +1 -0
  30. package/dist/_chunks/{tr-UmSHgD8y.mjs → tr-H1PrR6RM.mjs} +1 -1
  31. package/dist/_chunks/tr-H1PrR6RM.mjs.map +1 -0
  32. package/dist/_chunks/{tr-POFbAHUC.js → tr-fBBDNMBY.js} +1 -1
  33. package/dist/_chunks/tr-fBBDNMBY.js.map +1 -0
  34. package/dist/_chunks/{zh-KvwXXMnA.mjs → zh-BEh3jejH.mjs} +1 -1
  35. package/dist/_chunks/zh-BEh3jejH.mjs.map +1 -0
  36. package/dist/_chunks/{zh-kJ_DkSIe.js → zh-CyCKPuL0.js} +1 -1
  37. package/dist/_chunks/zh-CyCKPuL0.js.map +1 -0
  38. package/dist/_chunks/{zh-Hans-pnigVFnS.js → zh-Hans-Btuz6Y7W.js} +1 -1
  39. package/dist/_chunks/zh-Hans-Btuz6Y7W.js.map +1 -0
  40. package/dist/_chunks/{zh-Hans-ClgXy4wM.mjs → zh-Hans-CRQss50D.mjs} +1 -1
  41. package/dist/_chunks/zh-Hans-CRQss50D.mjs.map +1 -0
  42. package/dist/admin/index.js +41 -31
  43. package/dist/admin/index.js.map +1 -1
  44. package/dist/admin/index.mjs +40 -30
  45. package/dist/admin/index.mjs.map +1 -1
  46. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  47. package/dist/server/index.js +459 -312
  48. package/dist/server/index.js.map +1 -1
  49. package/dist/server/index.mjs +457 -312
  50. package/dist/server/index.mjs.map +1 -1
  51. package/dist/server/src/bootstrap.d.ts +2 -2
  52. package/dist/server/src/bootstrap.d.ts.map +1 -1
  53. package/dist/server/src/config/default-config.d.ts +1 -0
  54. package/dist/server/src/config/default-config.d.ts.map +1 -1
  55. package/dist/server/src/config/index.d.ts +1 -0
  56. package/dist/server/src/config/index.d.ts.map +1 -1
  57. package/dist/server/src/format-graphql-error.d.ts +7 -3
  58. package/dist/server/src/format-graphql-error.d.ts.map +1 -1
  59. package/dist/server/src/index.d.ts +70 -56
  60. package/dist/server/src/index.d.ts.map +1 -1
  61. package/dist/server/src/services/builders/dynamic-zones.d.ts +2 -6
  62. package/dist/server/src/services/builders/dynamic-zones.d.ts.map +1 -1
  63. package/dist/server/src/services/builders/entity.d.ts.map +1 -1
  64. package/dist/server/src/services/builders/filters/content-type.d.ts +2 -2
  65. package/dist/server/src/services/builders/filters/content-type.d.ts.map +1 -1
  66. package/dist/server/src/services/builders/filters/index.d.ts +1 -1
  67. package/dist/server/src/services/builders/filters/operators/eq.d.ts +2 -2
  68. package/dist/server/src/services/builders/filters/operators/eq.d.ts.map +1 -1
  69. package/dist/server/src/services/builders/filters/operators/index.d.ts +2 -2
  70. package/dist/server/src/services/builders/filters/operators/index.d.ts.map +1 -1
  71. package/dist/server/src/services/builders/filters/operators/not.d.ts +2 -2
  72. package/dist/server/src/services/builders/filters/operators/not.d.ts.map +1 -1
  73. package/dist/server/src/services/builders/index.d.ts +15 -11
  74. package/dist/server/src/services/builders/index.d.ts.map +1 -1
  75. package/dist/server/src/services/builders/input.d.ts +2 -2
  76. package/dist/server/src/services/builders/input.d.ts.map +1 -1
  77. package/dist/server/src/services/builders/mutations/collection-type.d.ts +2 -2
  78. package/dist/server/src/services/builders/mutations/collection-type.d.ts.map +1 -1
  79. package/dist/server/src/services/builders/mutations/index.d.ts +2 -2
  80. package/dist/server/src/services/builders/mutations/single-type.d.ts +2 -2
  81. package/dist/server/src/services/builders/mutations/single-type.d.ts.map +1 -1
  82. package/dist/server/src/services/builders/queries/collection-type.d.ts +2 -2
  83. package/dist/server/src/services/builders/queries/collection-type.d.ts.map +1 -1
  84. package/dist/server/src/services/builders/queries/index.d.ts +2 -2
  85. package/dist/server/src/services/builders/queries/single-type.d.ts +2 -2
  86. package/dist/server/src/services/builders/queries/single-type.d.ts.map +1 -1
  87. package/dist/server/src/services/builders/relation-response-collection.d.ts.map +1 -1
  88. package/dist/server/src/services/builders/resolvers/association.d.ts +2 -2
  89. package/dist/server/src/services/builders/resolvers/association.d.ts.map +1 -1
  90. package/dist/server/src/services/builders/resolvers/component.d.ts +2 -2
  91. package/dist/server/src/services/builders/resolvers/component.d.ts.map +1 -1
  92. package/dist/server/src/services/builders/resolvers/dynamic-zone.d.ts +2 -2
  93. package/dist/server/src/services/builders/resolvers/dynamic-zone.d.ts.map +1 -1
  94. package/dist/server/src/services/builders/resolvers/index.d.ts +10 -34
  95. package/dist/server/src/services/builders/resolvers/index.d.ts.map +1 -1
  96. package/dist/server/src/services/builders/resolvers/pagination.d.ts +11 -0
  97. package/dist/server/src/services/builders/resolvers/pagination.d.ts.map +1 -0
  98. package/dist/server/src/services/builders/resolvers/query.d.ts +3 -14
  99. package/dist/server/src/services/builders/resolvers/query.d.ts.map +1 -1
  100. package/dist/server/src/services/builders/response-collection.d.ts.map +1 -1
  101. package/dist/server/src/services/builders/type.d.ts +2 -2
  102. package/dist/server/src/services/builders/type.d.ts.map +1 -1
  103. package/dist/server/src/services/builders/utils.d.ts +18 -20
  104. package/dist/server/src/services/builders/utils.d.ts.map +1 -1
  105. package/dist/server/src/services/constants.d.ts +2 -1
  106. package/dist/server/src/services/constants.d.ts.map +1 -1
  107. package/dist/server/src/services/content-api/index.d.ts +2 -2
  108. package/dist/server/src/services/content-api/index.d.ts.map +1 -1
  109. package/dist/server/src/services/content-api/policy.d.ts +3 -3
  110. package/dist/server/src/services/content-api/policy.d.ts.map +1 -1
  111. package/dist/server/src/services/content-api/register-functions/collection-type.d.ts +3 -3
  112. package/dist/server/src/services/content-api/register-functions/collection-type.d.ts.map +1 -1
  113. package/dist/server/src/services/content-api/register-functions/component.d.ts +3 -3
  114. package/dist/server/src/services/content-api/register-functions/component.d.ts.map +1 -1
  115. package/dist/server/src/services/content-api/register-functions/dynamic-zones.d.ts +9 -0
  116. package/dist/server/src/services/content-api/register-functions/dynamic-zones.d.ts.map +1 -0
  117. package/dist/server/src/services/content-api/register-functions/enums.d.ts +9 -0
  118. package/dist/server/src/services/content-api/register-functions/enums.d.ts.map +1 -0
  119. package/dist/server/src/services/content-api/register-functions/filters.d.ts +9 -0
  120. package/dist/server/src/services/content-api/register-functions/filters.d.ts.map +1 -0
  121. package/dist/server/src/services/content-api/register-functions/index.d.ts +5 -2
  122. package/dist/server/src/services/content-api/register-functions/index.d.ts.map +1 -1
  123. package/dist/server/src/services/content-api/register-functions/inputs.d.ts +9 -0
  124. package/dist/server/src/services/content-api/register-functions/inputs.d.ts.map +1 -0
  125. package/dist/server/src/services/content-api/register-functions/polymorphic.d.ts +2 -2
  126. package/dist/server/src/services/content-api/register-functions/polymorphic.d.ts.map +1 -1
  127. package/dist/server/src/services/content-api/register-functions/single-type.d.ts +3 -3
  128. package/dist/server/src/services/content-api/register-functions/single-type.d.ts.map +1 -1
  129. package/dist/server/src/services/content-api/wrap-resolvers.d.ts +2 -2
  130. package/dist/server/src/services/content-api/wrap-resolvers.d.ts.map +1 -1
  131. package/dist/server/src/services/extension/extension.d.ts +3 -3
  132. package/dist/server/src/services/extension/extension.d.ts.map +1 -1
  133. package/dist/server/src/services/index.d.ts +69 -56
  134. package/dist/server/src/services/index.d.ts.map +1 -1
  135. package/dist/server/src/services/internals/args/index.d.ts +1 -1
  136. package/dist/server/src/services/internals/args/{publication-state.d.ts → publication-status.d.ts} +1 -1
  137. package/dist/server/src/services/internals/args/publication-status.d.ts.map +1 -0
  138. package/dist/server/src/services/internals/index.d.ts +14 -10
  139. package/dist/server/src/services/internals/index.d.ts.map +1 -1
  140. package/dist/server/src/services/internals/scalars/index.d.ts +4 -5
  141. package/dist/server/src/services/internals/scalars/index.d.ts.map +1 -1
  142. package/dist/server/src/services/internals/scalars/time.d.ts +1 -1
  143. package/dist/server/src/services/internals/scalars/time.d.ts.map +1 -1
  144. package/dist/server/src/services/internals/types/delete-mutation-response.d.ts +6 -0
  145. package/dist/server/src/services/internals/types/delete-mutation-response.d.ts.map +1 -0
  146. package/dist/server/src/services/internals/types/index.d.ts +9 -4
  147. package/dist/server/src/services/internals/types/index.d.ts.map +1 -1
  148. package/dist/server/src/services/internals/types/publication-status.d.ts +10 -0
  149. package/dist/server/src/services/internals/types/publication-status.d.ts.map +1 -0
  150. package/dist/server/src/services/internals/types/response-collection-meta.d.ts.map +1 -1
  151. package/dist/server/src/services/types.d.ts +2 -2
  152. package/dist/server/src/services/types.d.ts.map +1 -1
  153. package/dist/server/src/services/utils/attributes.d.ts +4 -4
  154. package/dist/server/src/services/utils/attributes.d.ts.map +1 -1
  155. package/dist/server/src/services/utils/index.d.ts +37 -33
  156. package/dist/server/src/services/utils/index.d.ts.map +1 -1
  157. package/dist/server/src/services/utils/mappers/entity-to-response-entity.d.ts +7 -7
  158. package/dist/server/src/services/utils/mappers/entity-to-response-entity.d.ts.map +1 -1
  159. package/dist/server/src/services/utils/mappers/graphql-filters-to-strapi-query.d.ts +2 -2
  160. package/dist/server/src/services/utils/mappers/graphql-filters-to-strapi-query.d.ts.map +1 -1
  161. package/dist/server/src/services/utils/mappers/index.d.ts +7 -7
  162. package/dist/server/src/services/utils/naming.d.ts +26 -25
  163. package/dist/server/src/services/utils/naming.d.ts.map +1 -1
  164. package/dist/server/src/services/utils/playground.d.ts +6 -0
  165. package/dist/server/src/services/utils/playground.d.ts.map +1 -0
  166. package/package.json +31 -29
  167. package/dist/_chunks/dk-KmLnUoJC.mjs.map +0 -1
  168. package/dist/_chunks/dk-SLrLqAtl.js.map +0 -1
  169. package/dist/_chunks/en-A16mqbIV.mjs.map +0 -1
  170. package/dist/_chunks/en-WmmC2MW8.js.map +0 -1
  171. package/dist/_chunks/es-4tl6ikyU.js.map +0 -1
  172. package/dist/_chunks/es-_xZ14QXK.mjs.map +0 -1
  173. package/dist/_chunks/fr-4BkQ-Qvt.mjs.map +0 -1
  174. package/dist/_chunks/fr-cJXSt55N.js.map +0 -1
  175. package/dist/_chunks/pl-TWurBBP_.mjs.map +0 -1
  176. package/dist/_chunks/pl-wKw9Xgkw.js.map +0 -1
  177. package/dist/_chunks/ru-CYAnXR6L.js.map +0 -1
  178. package/dist/_chunks/ru-aD804UEo.mjs.map +0 -1
  179. package/dist/_chunks/sv-N5RufX6w.mjs.map +0 -1
  180. package/dist/_chunks/sv-XNOe1ctV.js.map +0 -1
  181. package/dist/_chunks/tr-POFbAHUC.js.map +0 -1
  182. package/dist/_chunks/tr-UmSHgD8y.mjs.map +0 -1
  183. package/dist/_chunks/zh-Hans-ClgXy4wM.mjs.map +0 -1
  184. package/dist/_chunks/zh-Hans-pnigVFnS.js.map +0 -1
  185. package/dist/_chunks/zh-KvwXXMnA.mjs.map +0 -1
  186. package/dist/_chunks/zh-kJ_DkSIe.js.map +0 -1
  187. package/dist/server/src/services/builders/entity-meta.d.ts +0 -6
  188. package/dist/server/src/services/builders/entity-meta.d.ts.map +0 -1
  189. package/dist/server/src/services/builders/resolvers/mutation.d.ts +0 -25
  190. package/dist/server/src/services/builders/resolvers/mutation.d.ts.map +0 -1
  191. package/dist/server/src/services/content-api/register-functions/content-type/dynamic-zones.d.ts +0 -9
  192. package/dist/server/src/services/content-api/register-functions/content-type/dynamic-zones.d.ts.map +0 -1
  193. package/dist/server/src/services/content-api/register-functions/content-type/enums.d.ts +0 -9
  194. package/dist/server/src/services/content-api/register-functions/content-type/enums.d.ts.map +0 -1
  195. package/dist/server/src/services/content-api/register-functions/content-type/filters.d.ts +0 -9
  196. package/dist/server/src/services/content-api/register-functions/content-type/filters.d.ts.map +0 -1
  197. package/dist/server/src/services/content-api/register-functions/content-type/index.d.ts +0 -24
  198. package/dist/server/src/services/content-api/register-functions/content-type/index.d.ts.map +0 -1
  199. package/dist/server/src/services/content-api/register-functions/content-type/inputs.d.ts +0 -9
  200. package/dist/server/src/services/content-api/register-functions/content-type/inputs.d.ts.map +0 -1
  201. package/dist/server/src/services/internals/args/publication-state.d.ts.map +0 -1
  202. package/dist/server/src/services/internals/types/publication-state.d.ts +0 -10
  203. package/dist/server/src/services/internals/types/publication-state.d.ts.map +0 -1
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
2
  const fp = require("lodash/fp");
3
- const apolloServerKoa = require("apollo-server-koa");
4
- const apolloServerCore = require("apollo-server-core");
3
+ const server = require("@apollo/server");
4
+ const _default = require("@apollo/server/plugin/landingPage/default");
5
+ const koa = require("@as-integrations/koa");
5
6
  const depthLimit = require("graphql-depth-limit");
6
- const graphqlUpload = require("graphql-upload");
7
+ const bodyParser = require("koa-bodyparser");
8
+ const cors = require("@koa/cors");
7
9
  const utils$2 = require("@strapi/utils");
10
+ const errors = require("@apollo/server/errors");
8
11
  const graphql = require("graphql");
9
12
  const utils$3 = require("@graphql-tools/utils");
10
13
  const nexus = require("nexus");
@@ -30,13 +33,16 @@ function _interopNamespace(e) {
30
33
  return Object.freeze(n);
31
34
  }
32
35
  const depthLimit__default = /* @__PURE__ */ _interopDefault(depthLimit);
36
+ const bodyParser__default = /* @__PURE__ */ _interopDefault(bodyParser);
37
+ const cors__default = /* @__PURE__ */ _interopDefault(cors);
33
38
  const nexus__namespace = /* @__PURE__ */ _interopNamespace(nexus);
34
39
  const defaultConfig = {
35
40
  shadowCRUD: true,
36
41
  endpoint: "/graphql",
37
42
  subscriptions: false,
38
43
  maxLimit: -1,
39
- apolloServer: {}
44
+ apolloServer: {},
45
+ v4CompatibilityMode: process.env.STRAPI_GRAPHQL_V4_COMPATIBILITY_MODE ?? false
40
46
  };
41
47
  const config = {
42
48
  default: defaultConfig
@@ -46,41 +52,49 @@ const formatToCode = (name) => `STRAPI_${fp.toUpper(fp.snakeCase(name))}`;
46
52
  const formatErrorToExtension = (error2) => ({
47
53
  error: fp.pick(["name", "message", "details"])(error2)
48
54
  });
49
- function formatGraphqlError(error2) {
50
- const { originalError } = error2;
55
+ function createFormattedError(formattedError, message, code, originalError) {
56
+ const options = {
57
+ ...formattedError,
58
+ extensions: {
59
+ ...formattedError.extensions,
60
+ ...formatErrorToExtension(originalError),
61
+ code
62
+ }
63
+ };
64
+ return new graphql.GraphQLError(message, options);
65
+ }
66
+ function formatGraphqlError(formattedError, error2) {
67
+ const originalError = errors.unwrapResolverError(error2);
51
68
  if (fp.isEmpty(originalError)) {
52
- return error2;
69
+ return formattedError;
53
70
  }
71
+ const { message = "", name = "UNKNOWN" } = originalError;
54
72
  if (originalError instanceof ForbiddenError$1 || originalError instanceof UnauthorizedError) {
55
- return new apolloServerKoa.ForbiddenError(originalError.message, formatErrorToExtension(originalError));
73
+ return createFormattedError(formattedError, message, "FORBIDDEN", originalError);
56
74
  }
57
75
  if (originalError instanceof ValidationError$3) {
58
- return new apolloServerKoa.UserInputError(originalError.message, formatErrorToExtension(originalError));
76
+ return createFormattedError(formattedError, message, "BAD_USER_INPUT", originalError);
59
77
  }
60
78
  if (originalError instanceof ApplicationError$5 || originalError instanceof HttpError) {
61
- const name = formatToCode(originalError.name);
62
- return new apolloServerKoa.ApolloError(originalError.message, name, formatErrorToExtension(originalError));
79
+ const errorName = formatToCode(name);
80
+ return createFormattedError(formattedError, message, errorName, originalError);
63
81
  }
64
- if (originalError instanceof apolloServerKoa.ApolloError || originalError instanceof graphql.GraphQLError) {
65
- return error2;
82
+ if (originalError instanceof graphql.GraphQLError) {
83
+ return formattedError;
66
84
  }
67
85
  strapi.log.error(originalError);
68
- return new apolloServerKoa.ApolloError("Internal Server Error", "INTERNAL_SERVER_ERROR");
86
+ return createFormattedError(
87
+ new graphql.GraphQLError("Internal Server Error"),
88
+ "Internal Server Error",
89
+ "INTERNAL_SERVER_ERROR",
90
+ originalError
91
+ );
69
92
  }
70
93
  const merge = fp.mergeWith((a, b) => {
71
94
  if (fp.isArray(a) && fp.isArray(b)) {
72
95
  return a.concat(b);
73
96
  }
74
97
  });
75
- const useUploadMiddleware = (strapi2, path) => {
76
- const uploadMiddleware = graphqlUpload.graphqlUploadKoa();
77
- strapi2.server.app.use((ctx, next) => {
78
- if (ctx.path === path) {
79
- return uploadMiddleware(ctx, next);
80
- }
81
- return next();
82
- });
83
- };
84
98
  async function bootstrap({ strapi: strapi2 }) {
85
99
  const schema = strapi2.plugin("graphql").service("content-api").buildSchema();
86
100
  if (fp.isEmpty(schema)) {
@@ -89,14 +103,18 @@ async function bootstrap({ strapi: strapi2 }) {
89
103
  }
90
104
  const { config: config2 } = strapi2.plugin("graphql");
91
105
  const path = config2("endpoint");
106
+ const playgroundEnabled = !(process.env.NODE_ENV === "production" && !config2("playgroundAlways"));
107
+ let landingPage;
108
+ if (playgroundEnabled) {
109
+ landingPage = _default.ApolloServerPluginLandingPageLocalDefault();
110
+ strapi2.log.debug("Using Apollo sandbox landing page");
111
+ } else {
112
+ landingPage = _default.ApolloServerPluginLandingPageProductionDefault();
113
+ strapi2.log.debug("Using Apollo production landing page");
114
+ }
92
115
  const defaultServerConfig = {
93
116
  // Schema
94
117
  schema,
95
- // Initialize loaders for this request.
96
- context: ({ ctx }) => ({
97
- state: ctx.state,
98
- koaContext: ctx
99
- }),
100
118
  // Validation
101
119
  validationRules: [depthLimit__default.default(config2("depthLimit"))],
102
120
  // Errors
@@ -105,59 +123,72 @@ async function bootstrap({ strapi: strapi2 }) {
105
123
  cors: false,
106
124
  uploads: false,
107
125
  bodyParserConfig: true,
108
- plugins: [
109
- process.env.NODE_ENV === "production" && !config2("playgroundAlways") ? apolloServerCore.ApolloServerPluginLandingPageDisabled() : apolloServerCore.ApolloServerPluginLandingPageGraphQLPlayground()
110
- ],
126
+ // send 400 http status instead of 200 for input validation errors
127
+ status400ForVariableCoercionErrors: true,
128
+ plugins: [landingPage],
111
129
  cache: "bounded"
112
130
  };
113
- const serverConfig = merge(defaultServerConfig, config2("apolloServer"));
114
- const server = new apolloServerKoa.ApolloServer(serverConfig);
115
- useUploadMiddleware(strapi2, path);
131
+ const serverConfig = merge(
132
+ defaultServerConfig,
133
+ config2("apolloServer")
134
+ );
135
+ const server$1 = new server.ApolloServer(serverConfig);
116
136
  try {
117
- await server.start();
137
+ await server$1.start();
118
138
  } catch (error2) {
119
139
  if (error2 instanceof Error) {
120
140
  strapi2.log.error("Failed to start the Apollo server", error2.message);
121
141
  }
122
142
  throw error2;
123
143
  }
144
+ const handler = [];
145
+ if (cors__default.default) {
146
+ handler.push(cors__default.default());
147
+ }
148
+ if (fp.isObject(serverConfig.bodyParserConfig)) {
149
+ handler.push(bodyParser__default.default(serverConfig.bodyParserConfig));
150
+ } else if (serverConfig.bodyParserConfig) {
151
+ handler.push(bodyParser__default.default());
152
+ } else {
153
+ strapi2.log.debug("Body parser has been disabled for Apollo server");
154
+ }
155
+ handler.push((ctx, next) => {
156
+ ctx.state.route = {
157
+ info: {
158
+ // Indicate it's a content API route
159
+ type: "content-api"
160
+ }
161
+ };
162
+ return strapi2.auth.authenticate(ctx, next);
163
+ });
164
+ handler.push(
165
+ koa.koaMiddleware(server$1, {
166
+ // Initialize loaders for this request.
167
+ context: async ({ ctx }) => ({
168
+ state: ctx.state,
169
+ koaContext: ctx
170
+ })
171
+ })
172
+ );
124
173
  strapi2.server.routes([
125
174
  {
126
175
  method: "ALL",
127
176
  path,
128
- handler: [
129
- (ctx, next) => {
130
- ctx.state.route = {
131
- info: {
132
- // Indicate it's a content API route
133
- type: "content-api"
134
- }
135
- };
136
- if (ctx.request.method === "GET")
137
- return next();
138
- return strapi2.auth.authenticate(ctx, next);
139
- },
140
- // Apollo Server
141
- server.getMiddleware({
142
- path,
143
- cors: serverConfig.cors,
144
- bodyParserConfig: serverConfig.bodyParserConfig
145
- })
146
- ],
177
+ handler,
147
178
  config: {
148
179
  auth: false
149
180
  }
150
181
  }
151
182
  ]);
152
183
  strapi2.plugin("graphql").destroy = async () => {
153
- await server.stop();
184
+ await server$1.stop();
154
185
  };
155
186
  }
156
187
  const { PolicyError } = utils$2.errors;
157
188
  const getPoliciesConfig = fp.propOr([], "policies");
158
189
  const createPoliciesMiddleware = (resolverConfig, { strapi: strapi2 }) => {
159
190
  const resolverPolicies = getPoliciesConfig(resolverConfig);
160
- const policies = utils$2.policy.resolve(resolverPolicies, {});
191
+ const policies = strapi2.get("policies").resolve(resolverPolicies, {});
161
192
  return async (resolve, parent, args2, context, info) => {
162
193
  const policyContext = createGraphQLPolicyContext(parent, args2, context, info);
163
194
  for (const { handler, config: config2 } of policies) {
@@ -454,7 +485,7 @@ const registerInternals = ({ registry, strapi: strapi2 }) => {
454
485
  registry.registerMany(Object.entries(definitions), { kind });
455
486
  }
456
487
  };
457
- const registerDynamicZonesDefinition$1 = (contentType2, {
488
+ const registerDynamicZonesDefinition = (contentType2, {
458
489
  registry,
459
490
  strapi: strapi2,
460
491
  builders: builders2
@@ -483,7 +514,7 @@ const registerDynamicZonesDefinition$1 = (contentType2, {
483
514
  registry.register(dzInputName, input, { kind: KINDS2.input, ...baseConfig });
484
515
  }
485
516
  };
486
- const registerEnumsDefinition$1 = (contentType2, {
517
+ const registerEnumsDefinition = (contentType2, {
487
518
  registry,
488
519
  strapi: strapi2,
489
520
  builders: builders2
@@ -510,7 +541,7 @@ const registerEnumsDefinition$1 = (contentType2, {
510
541
  });
511
542
  }
512
543
  };
513
- const registerInputsDefinition$1 = (contentType2, {
544
+ const registerInputsDefinition = (contentType2, {
514
545
  registry,
515
546
  strapi: strapi2,
516
547
  builders: builders2
@@ -526,7 +557,7 @@ const registerInputsDefinition$1 = (contentType2, {
526
557
  const definition = builders2.buildInputType(contentType2);
527
558
  registry.register(type, definition, { kind: KINDS2.input, contentType: contentType2 });
528
559
  };
529
- const registerFiltersDefinition$1 = (contentType2, {
560
+ const registerFiltersDefinition = (contentType2, {
530
561
  registry,
531
562
  strapi: strapi2,
532
563
  builders: builders2
@@ -538,18 +569,6 @@ const registerFiltersDefinition$1 = (contentType2, {
538
569
  const definition = builders2.buildContentTypeFilters(contentType2);
539
570
  registry.register(type, definition, { kind: KINDS2.filtersInput, contentType: contentType2 });
540
571
  };
541
- const contentType$1 = {
542
- registerDynamicZonesDefinition: registerDynamicZonesDefinition$1,
543
- registerFiltersDefinition: registerFiltersDefinition$1,
544
- registerInputsDefinition: registerInputsDefinition$1,
545
- registerEnumsDefinition: registerEnumsDefinition$1
546
- };
547
- const {
548
- registerEnumsDefinition,
549
- registerInputsDefinition,
550
- registerFiltersDefinition,
551
- registerDynamicZonesDefinition
552
- } = contentType$1;
553
572
  const contentAPI = ({ strapi: strapi2 }) => {
554
573
  const { mergeSchemas, addResolversToSchema } = require("@graphql-tools/schema");
555
574
  const { service: getGraphQLService } = strapi2.plugin("graphql");
@@ -569,7 +588,10 @@ const contentAPI = ({ strapi: strapi2 }) => {
569
588
  }
570
589
  const schema = buildMergedSchema({ registry });
571
590
  const extension = extensionService.generate({ typeRegistry: registry });
572
- const schemaWithResolvers = addResolversToSchema(schema, extension.resolvers);
591
+ const schemaWithResolvers = addResolversToSchema({
592
+ schema,
593
+ resolvers: extension.resolvers
594
+ });
573
595
  const outputs = {
574
596
  schema: config2("artifacts.schema", false),
575
597
  typegen: config2("artifacts.typegen", false)
@@ -736,7 +758,7 @@ const strapiScalarToGraphQLScalar = ({ strapi: strapi2 }) => {
736
758
  }
737
759
  };
738
760
  };
739
- const virtualScalarAttributes = ["id"];
761
+ const virtualScalarAttributes = ["id", "documentId"];
740
762
  const graphQLFiltersToStrapiQuery = ({ strapi: strapi2 }) => {
741
763
  const { service: getService } = strapi2.plugin("graphql");
742
764
  const recursivelyReplaceScalarOperators = (data) => {
@@ -950,6 +972,9 @@ const naming = ({ strapi: strapi2 }) => {
950
972
  plurality: "plural",
951
973
  firstLetterCase: "lower"
952
974
  });
975
+ const getFindConnectionQueryName = (contentType2) => {
976
+ return `${getFindQueryName(contentType2)}_connection`;
977
+ };
953
978
  const getFindOneQueryName = buildCustomTypeNameGenerator({ firstLetterCase: "lower" });
954
979
  const getCreateMutationTypeName = buildCustomTypeNameGenerator({
955
980
  prefix: "create",
@@ -987,16 +1012,26 @@ const naming = ({ strapi: strapi2 }) => {
987
1012
  getFindOneQueryName,
988
1013
  getCreateMutationTypeName,
989
1014
  getUpdateMutationTypeName,
990
- getDeleteMutationTypeName
1015
+ getDeleteMutationTypeName,
1016
+ getFindConnectionQueryName
1017
+ };
1018
+ };
1019
+ const playground = (ctx) => {
1020
+ return {
1021
+ isEnabled() {
1022
+ return !(process.env.NODE_ENV === "production" && !ctx.strapi.plugin("graphql").config("playgroundAlways"));
1023
+ }
991
1024
  };
992
1025
  };
993
1026
  const utils$1 = (context) => ({
1027
+ playground: playground(context),
994
1028
  naming: naming(context),
995
1029
  attributes: attributes(context),
996
1030
  mappers: mappers(context)
997
1031
  });
998
1032
  const PAGINATION_TYPE_NAME = "Pagination";
999
- const PUBLICATION_STATE_TYPE_NAME = "PublicationState";
1033
+ const DELETE_MUTATION_RESPONSE_TYPE_NAME = "DeleteMutationResponse";
1034
+ const PUBLICATION_STATUS_TYPE_NAME = "PublicationStatus";
1000
1035
  const ERROR_TYPE_NAME = "Error";
1001
1036
  const RESPONSE_COLLECTION_META_TYPE_NAME = "ResponseCollectionMeta";
1002
1037
  const GRAPHQL_SCALARS = [
@@ -1117,7 +1152,8 @@ const ERROR_CODES = {
1117
1152
  const constants = () => ({
1118
1153
  PAGINATION_TYPE_NAME,
1119
1154
  RESPONSE_COLLECTION_META_TYPE_NAME,
1120
- PUBLICATION_STATE_TYPE_NAME,
1155
+ DELETE_MUTATION_RESPONSE_TYPE_NAME,
1156
+ PUBLICATION_STATUS_TYPE_NAME,
1121
1157
  GRAPHQL_SCALARS,
1122
1158
  STRAPI_SCALARS,
1123
1159
  GENERIC_MORPH_TYPENAME,
@@ -1131,11 +1167,11 @@ const SortArg = nexus.arg({
1131
1167
  type: nexus.list("String"),
1132
1168
  default: []
1133
1169
  });
1134
- const publicationState$1 = ({ strapi: strapi2 }) => {
1135
- const { PUBLICATION_STATE_TYPE_NAME: PUBLICATION_STATE_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
1170
+ const publicationStatus$1 = ({ strapi: strapi2 }) => {
1171
+ const { PUBLICATION_STATUS_TYPE_NAME: PUBLICATION_STATUS_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
1136
1172
  return nexus.arg({
1137
- type: PUBLICATION_STATE_TYPE_NAME2,
1138
- default: "live"
1173
+ type: PUBLICATION_STATUS_TYPE_NAME2,
1174
+ default: "published"
1139
1175
  });
1140
1176
  };
1141
1177
  const PaginationInputType = nexus.inputObjectType({
@@ -1154,7 +1190,7 @@ const PaginationArg = nexus.arg({
1154
1190
  const args = (context) => ({
1155
1191
  SortArg,
1156
1192
  PaginationArg,
1157
- PublicationStateArg: publicationState$1(context)
1193
+ PublicationStatusArg: publicationStatus$1(context)
1158
1194
  });
1159
1195
  const { ValidationError: ValidationError$2 } = utils$2.errors;
1160
1196
  const TimeScalar = new graphql.GraphQLScalarType({
@@ -1188,8 +1224,7 @@ const scalars = () => ({
1188
1224
  DateTime: nexus.asNexusMethod(graphqlScalars.GraphQLDateTime, "dateTime"),
1189
1225
  Time: nexus.asNexusMethod(TimeScalar, "time"),
1190
1226
  Date: nexus.asNexusMethod(graphqlScalars.GraphQLDate, "date"),
1191
- Long: nexus.asNexusMethod(graphqlScalars.GraphQLLong, "long"),
1192
- Upload: nexus.asNexusMethod(graphqlUpload.GraphQLUpload, "upload")
1227
+ Long: nexus.asNexusMethod(graphqlScalars.GraphQLLong, "long")
1193
1228
  });
1194
1229
  const pagination = ({ strapi: strapi2 }) => {
1195
1230
  const { PAGINATION_TYPE_NAME: PAGINATION_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
@@ -1210,7 +1245,8 @@ const pagination = ({ strapi: strapi2 }) => {
1210
1245
  };
1211
1246
  };
1212
1247
  const buildResponseCollectionMeta = ({ strapi: strapi2 }) => {
1213
- const { RESPONSE_COLLECTION_META_TYPE_NAME: RESPONSE_COLLECTION_META_TYPE_NAME2, PAGINATION_TYPE_NAME: PAGINATION_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
1248
+ const { service: getService } = strapi2.plugin("graphql");
1249
+ const { RESPONSE_COLLECTION_META_TYPE_NAME: RESPONSE_COLLECTION_META_TYPE_NAME2, PAGINATION_TYPE_NAME: PAGINATION_TYPE_NAME2 } = getService("constants");
1214
1250
  return {
1215
1251
  /**
1216
1252
  * A shared type definition used in EntitiesResponseCollection
@@ -1220,44 +1256,38 @@ const buildResponseCollectionMeta = ({ strapi: strapi2 }) => {
1220
1256
  ResponseCollectionMeta: nexus.objectType({
1221
1257
  name: RESPONSE_COLLECTION_META_TYPE_NAME2,
1222
1258
  definition(t) {
1259
+ const { resolvePagination } = getService("builders").get("content-api");
1223
1260
  t.nonNull.field("pagination", {
1224
1261
  type: PAGINATION_TYPE_NAME2,
1225
- async resolve(parent, _childArgs, ctx) {
1226
- const { args: args2, resourceUID } = parent;
1227
- const { start, limit } = args2;
1228
- const safeLimit = Math.max(limit, 1);
1229
- const contentType2 = strapi2.getModel(resourceUID);
1230
- await utils$2.validate.contentAPI.query(args2, contentType2, {
1231
- auth: ctx?.state?.auth
1232
- });
1233
- const sanitizedQuery = await utils$2.sanitize.contentAPI.query(args2, contentType2, {
1234
- auth: ctx?.state?.auth
1235
- });
1236
- const total = await strapi2.entityService.count(resourceUID, sanitizedQuery);
1237
- const pageSize = limit === -1 ? total - start : safeLimit;
1238
- const pageCount = limit === -1 ? safeLimit : Math.ceil(total / safeLimit);
1239
- const page = limit === -1 ? safeLimit : Math.floor(start / safeLimit) + 1;
1240
- return { total, page, pageSize, pageCount };
1241
- }
1262
+ resolve: resolvePagination
1242
1263
  });
1243
1264
  }
1244
1265
  })
1245
1266
  };
1246
1267
  };
1247
- const publicationState = ({ strapi: strapi2 }) => {
1248
- const { PUBLICATION_STATE_TYPE_NAME: PUBLICATION_STATE_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
1268
+ const buildDeleteMutationResponse = ({ strapi: strapi2 }) => {
1269
+ const { DELETE_MUTATION_RESPONSE_TYPE_NAME: DELETE_MUTATION_RESPONSE_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
1270
+ return {
1271
+ DeleteMutationResponse: nexus.objectType({
1272
+ name: DELETE_MUTATION_RESPONSE_TYPE_NAME2,
1273
+ definition(t) {
1274
+ t.nonNull.id("documentId");
1275
+ }
1276
+ })
1277
+ };
1278
+ };
1279
+ const publicationStatus = ({ strapi: strapi2 }) => {
1280
+ const { PUBLICATION_STATUS_TYPE_NAME: PUBLICATION_STATUS_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
1249
1281
  return {
1250
1282
  /**
1251
- * An enum type definition representing a publication state
1283
+ * An enum type definition representing a publication status
1252
1284
  * @type {NexusEnumTypeDef}
1253
1285
  */
1254
- PublicationState: nexus.enumType({
1255
- name: PUBLICATION_STATE_TYPE_NAME2,
1286
+ PublicationStatus: nexus.enumType({
1287
+ name: PUBLICATION_STATUS_TYPE_NAME2,
1256
1288
  members: {
1257
- // Published only
1258
- LIVE: "live",
1259
- // Published & draft
1260
- PREVIEW: "preview"
1289
+ DRAFT: "draft",
1290
+ PUBLISHED: "published"
1261
1291
  }
1262
1292
  })
1263
1293
  };
@@ -1314,10 +1344,11 @@ const types = (context) => () => {
1314
1344
  [KINDS2.internal]: {
1315
1345
  error: error(context),
1316
1346
  pagination: pagination(context),
1317
- responseCollectionMeta: buildResponseCollectionMeta(context)
1347
+ responseCollectionMeta: buildResponseCollectionMeta(context),
1348
+ deleteDocumentResponse: buildDeleteMutationResponse(context)
1318
1349
  },
1319
1350
  [KINDS2.enum]: {
1320
- publicationState: publicationState(context)
1351
+ publicationStatus: publicationStatus(context)
1321
1352
  },
1322
1353
  [KINDS2.filtersInput]: {
1323
1354
  ...filters$1(context)
@@ -1341,7 +1372,7 @@ const buildEnumTypeDefinition = (definition, name) => {
1341
1372
  return nexus.enumType({
1342
1373
  name,
1343
1374
  members: definition.enum.reduce(
1344
- (acc, value) => fp.set(utils$2.toRegressedEnumValue(value), value, acc),
1375
+ (acc, value) => fp.set(utils$2.strings.toRegressedEnumValue(value), value, acc),
1345
1376
  {}
1346
1377
  )
1347
1378
  });
@@ -1407,10 +1438,6 @@ const dynamicZone = ({ strapi: strapi2 }) => {
1407
1438
  return {
1408
1439
  /**
1409
1440
  * Build a Nexus dynamic zone type from a Strapi dz attribute
1410
- * @param {object} definition - The definition of the dynamic zone
1411
- * @param {string} name - the name of the dynamic zone
1412
- * @param {string} inputName - the name of the dynamic zone's input
1413
- * @return {[NexusUnionTypeDef, NexusScalarTypeDef]}
1414
1441
  */
1415
1442
  buildDynamicZoneDefinition(definition, name, inputName) {
1416
1443
  const { components } = definition;
@@ -1447,11 +1474,6 @@ const entity = ({ strapi: strapi2 }) => {
1447
1474
  }
1448
1475
  };
1449
1476
  };
1450
- function buildEntityMetaDefinition() {
1451
- }
1452
- const entityMeta = () => ({
1453
- buildEntityMetaDefinition
1454
- });
1455
1477
  const typeBuilder = (context) => {
1456
1478
  const { strapi: strapi2 } = context;
1457
1479
  const getGraphQLService = strapi2.plugin("graphql").service;
@@ -1478,7 +1500,10 @@ const typeBuilder = (context) => {
1478
1500
  attributeName,
1479
1501
  strapi: strapi2
1480
1502
  });
1481
- const args2 = getContentTypeArgs(targetComponent, { multiple: !!attribute.repeatable });
1503
+ const args2 = getContentTypeArgs(targetComponent, {
1504
+ multiple: !!attribute.repeatable,
1505
+ isNested: true
1506
+ });
1482
1507
  localBuilder.field(attributeName, { type, resolve, args: args2 });
1483
1508
  };
1484
1509
  const addDynamicZoneAttribute = (options) => {
@@ -1527,9 +1552,32 @@ const typeBuilder = (context) => {
1527
1552
  attributeName,
1528
1553
  strapi: strapi2
1529
1554
  });
1530
- const args2 = attribute.multiple ? getContentTypeArgs(fileContentType) : void 0;
1531
- const type = attribute.multiple ? naming2.getRelationResponseCollectionName(fileContentType) : naming2.getEntityResponseName(fileContentType);
1532
- builder.field(attributeName, { type, resolve, args: args2 });
1555
+ const args2 = attribute.multiple ? getContentTypeArgs(fileContentType, { isNested: true }) : void 0;
1556
+ const typeName = naming2.getTypeName(fileContentType);
1557
+ if (attribute.multiple) {
1558
+ builder.field(`${attributeName}_connection`, {
1559
+ type: naming2.getRelationResponseCollectionName(fileContentType),
1560
+ resolve,
1561
+ args: args2
1562
+ });
1563
+ builder.field(attributeName, {
1564
+ type: nexus.nonNull(nexus.list(typeName)),
1565
+ async resolve(...args22) {
1566
+ const res = await resolve(...args22);
1567
+ return res.nodes ?? [];
1568
+ },
1569
+ args: args2
1570
+ });
1571
+ } else {
1572
+ builder.field(attributeName, {
1573
+ type: typeName,
1574
+ async resolve(...args22) {
1575
+ const res = await resolve(...args22);
1576
+ return res.value;
1577
+ },
1578
+ args: args2
1579
+ });
1580
+ }
1533
1581
  };
1534
1582
  const addPolymorphicRelationalAttribute = (options) => {
1535
1583
  const { GENERIC_MORPH_TYPENAME: GENERIC_MORPH_TYPENAME2 } = getGraphQLService("constants");
@@ -1574,12 +1622,38 @@ const typeBuilder = (context) => {
1574
1622
  strapi: strapi2
1575
1623
  });
1576
1624
  const targetContentType = strapi2.getModel(attribute.target);
1577
- const type = isToManyRelation ? naming2.getRelationResponseCollectionName(targetContentType) : naming2.getEntityResponseName(targetContentType);
1578
- const args2 = isToManyRelation ? getContentTypeArgs(targetContentType) : void 0;
1579
- const resolverPath = `${naming2.getTypeName(contentType2)}.${attributeName}`;
1625
+ const typeName = naming2.getTypeName(targetContentType);
1626
+ const args2 = isToManyRelation ? getContentTypeArgs(targetContentType, { isNested: true }) : void 0;
1580
1627
  const resolverScope = `${targetContentType.uid}.find`;
1628
+ const resolverPath = `${naming2.getTypeName(contentType2)}.${attributeName}`;
1581
1629
  extension2.use({ resolversConfig: { [resolverPath]: { auth: { scope: [resolverScope] } } } });
1582
- builder.field(attributeName, { type, resolve, args: args2 });
1630
+ if (isToManyRelation) {
1631
+ builder.field(`${attributeName}_connection`, {
1632
+ type: naming2.getRelationResponseCollectionName(targetContentType),
1633
+ resolve,
1634
+ args: args2
1635
+ });
1636
+ extension2.use({
1637
+ resolversConfig: { [`${resolverPath}_connection`]: { auth: { scope: [resolverScope] } } }
1638
+ });
1639
+ builder.field(attributeName, {
1640
+ type: nexus.nonNull(nexus.list(typeName)),
1641
+ async resolve(...args22) {
1642
+ const res = await resolve(...args22);
1643
+ return res.nodes ?? [];
1644
+ },
1645
+ args: args2
1646
+ });
1647
+ } else {
1648
+ builder.field(attributeName, {
1649
+ type: typeName,
1650
+ async resolve(...args22) {
1651
+ const res = await resolve(...args22);
1652
+ return res.value;
1653
+ },
1654
+ args: args2
1655
+ });
1656
+ }
1583
1657
  };
1584
1658
  const isNotPrivate = (contentType2) => (attributeName) => {
1585
1659
  return !utils$2.contentTypes.isPrivateAttribute(contentType2, attributeName);
@@ -1614,9 +1688,29 @@ const typeBuilder = (context) => {
1614
1688
  return nexus.objectType({
1615
1689
  name,
1616
1690
  definition(t) {
1691
+ if (modelType !== "component" && isNotDisabled(contentType2)("id") && strapi2.plugin("graphql").config("v4CompatibilityMode", false)) {
1692
+ t.nonNull.id("id", {
1693
+ deprecation: "Use `documentId` instead"
1694
+ });
1695
+ }
1617
1696
  if (modelType === "component" && isNotDisabled(contentType2)("id")) {
1618
1697
  t.nonNull.id("id");
1619
1698
  }
1699
+ if (modelType !== "component" && isNotDisabled(contentType2)("documentId")) {
1700
+ t.nonNull.id("documentId");
1701
+ }
1702
+ if (strapi2.plugin("graphql").config("v4CompatibilityMode", false)) {
1703
+ t.nonNull.field("attributes", {
1704
+ deprecation: "Use root level fields instead",
1705
+ type: name,
1706
+ resolve: (parent) => parent
1707
+ });
1708
+ t.nonNull.field("data", {
1709
+ deprecation: "Use root level fields instead",
1710
+ type: name,
1711
+ resolve: (parent) => parent
1712
+ });
1713
+ }
1620
1714
  attributesKey.filter(isNotPrivate(contentType2)).filter(isNotDisabled(contentType2)).forEach((attributeName) => {
1621
1715
  const attribute = attributes2[attributeName];
1622
1716
  let builder = t;
@@ -1659,12 +1753,12 @@ const response = ({ strapi: strapi2 }) => {
1659
1753
  */
1660
1754
  buildResponseDefinition(contentType2) {
1661
1755
  const name = naming2.getEntityResponseName(contentType2);
1662
- const entityName = naming2.getEntityName(contentType2);
1756
+ const typeName = naming2.getTypeName(contentType2);
1663
1757
  return nexus.objectType({
1664
1758
  name,
1665
1759
  definition(t) {
1666
1760
  t.field("data", {
1667
- type: entityName,
1761
+ type: typeName,
1668
1762
  resolve: fp.prop("value")
1669
1763
  });
1670
1764
  }
@@ -1673,8 +1767,9 @@ const response = ({ strapi: strapi2 }) => {
1673
1767
  };
1674
1768
  };
1675
1769
  const responseCollection = ({ strapi: strapi2 }) => {
1676
- const { naming: naming2 } = strapi2.plugin("graphql").service("utils");
1677
- const { RESPONSE_COLLECTION_META_TYPE_NAME: RESPONSE_COLLECTION_META_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
1770
+ const { service: getService } = strapi2.plugin("graphql");
1771
+ const { naming: naming2 } = getService("utils");
1772
+ const { RESPONSE_COLLECTION_META_TYPE_NAME: RESPONSE_COLLECTION_META_TYPE_NAME2, PAGINATION_TYPE_NAME: PAGINATION_TYPE_NAME2 } = getService("constants");
1678
1773
  return {
1679
1774
  /**
1680
1775
  * Build a type definition for a content API collection response for a given content type
@@ -1683,19 +1778,31 @@ const responseCollection = ({ strapi: strapi2 }) => {
1683
1778
  */
1684
1779
  buildResponseCollectionDefinition(contentType2) {
1685
1780
  const name = naming2.getEntityResponseCollectionName(contentType2);
1686
- const entityName = naming2.getEntityName(contentType2);
1781
+ const typeName = naming2.getTypeName(contentType2);
1782
+ const { resolvePagination } = getService("builders").get("content-api");
1687
1783
  return nexus.objectType({
1688
1784
  name,
1689
1785
  definition(t) {
1690
- t.nonNull.list.field("data", {
1691
- type: nexus.nonNull(entityName),
1786
+ t.nonNull.list.field("nodes", {
1787
+ type: nexus.nonNull(typeName),
1692
1788
  resolve: fp.pipe(fp.prop("nodes"), fp.defaultTo([]))
1693
1789
  });
1694
- t.nonNull.field("meta", {
1695
- type: RESPONSE_COLLECTION_META_TYPE_NAME2,
1696
- // Pass down the args stored in the source object
1697
- resolve: fp.prop("info")
1790
+ t.nonNull.field("pageInfo", {
1791
+ type: PAGINATION_TYPE_NAME2,
1792
+ resolve: resolvePagination
1698
1793
  });
1794
+ if (strapi2.plugin("graphql").config("v4CompatibilityMode", false)) {
1795
+ t.nonNull.list.field("data", {
1796
+ deprecation: "Use `nodes` field instead",
1797
+ type: nexus.nonNull(typeName),
1798
+ resolve: fp.pipe(fp.prop("nodes"), fp.defaultTo([]))
1799
+ });
1800
+ t.nonNull.field("meta", {
1801
+ deprecation: "Use the `pageInfo` field instead",
1802
+ type: RESPONSE_COLLECTION_META_TYPE_NAME2,
1803
+ resolve: fp.identity
1804
+ });
1805
+ }
1699
1806
  }
1700
1807
  });
1701
1808
  }
@@ -1709,14 +1816,21 @@ const relationResponseCollection = ({ strapi: strapi2 }) => {
1709
1816
  */
1710
1817
  buildRelationResponseCollectionDefinition(contentType2) {
1711
1818
  const name = naming2.getRelationResponseCollectionName(contentType2);
1712
- const entityName = naming2.getEntityName(contentType2);
1819
+ const typeName = naming2.getTypeName(contentType2);
1713
1820
  return nexus.objectType({
1714
1821
  name,
1715
1822
  definition(t) {
1716
- t.nonNull.list.field("data", {
1717
- type: nexus.nonNull(entityName),
1823
+ t.nonNull.list.field("nodes", {
1824
+ type: nexus.nonNull(typeName),
1718
1825
  resolve: fp.pipe(fp.prop("nodes"), fp.defaultTo([]))
1719
1826
  });
1827
+ if (strapi2.plugin("graphql").config("v4CompatibilityMode", false)) {
1828
+ t.nonNull.list.field("data", {
1829
+ deprecation: "Use `nodes` field instead",
1830
+ type: nexus.nonNull(typeName),
1831
+ resolve: fp.pipe(fp.prop("nodes"), fp.defaultTo([]))
1832
+ });
1833
+ }
1720
1834
  }
1721
1835
  });
1722
1836
  }
@@ -1726,16 +1840,18 @@ const createCollectionTypeQueriesBuilder = ({ strapi: strapi2 }) => {
1726
1840
  const { service: getService } = strapi2.plugin("graphql");
1727
1841
  const { naming: naming2 } = getService("utils");
1728
1842
  const { transformArgs, getContentTypeArgs } = getService("builders").utils;
1729
- const { toEntityResponse, toEntityResponseCollection } = getService("format").returnTypes;
1843
+ const { toEntityResponseCollection } = getService("format").returnTypes;
1730
1844
  const {
1731
1845
  getFindOneQueryName,
1732
- getEntityResponseName,
1846
+ getTypeName,
1733
1847
  getFindQueryName,
1848
+ getFindConnectionQueryName,
1734
1849
  getEntityResponseCollectionName
1735
1850
  } = naming2;
1736
1851
  const buildCollectionTypeQueries = (contentType2) => {
1737
1852
  const findOneQueryName = `Query.${getFindOneQueryName(contentType2)}`;
1738
1853
  const findQueryName = `Query.${getFindQueryName(contentType2)}`;
1854
+ const findConnectionQueryName = `Query.${getFindConnectionQueryName(contentType2)}`;
1739
1855
  const extension = getService("extension");
1740
1856
  const registerAuthConfig = (action, auth) => {
1741
1857
  return extension.use({ resolversConfig: { [action]: { auth } } });
@@ -1750,6 +1866,7 @@ const createCollectionTypeQueriesBuilder = ({ strapi: strapi2 }) => {
1750
1866
  }
1751
1867
  if (isFindEnabled) {
1752
1868
  registerAuthConfig(findQueryName, { scope: [`${contentType2.uid}.find`] });
1869
+ registerAuthConfig(findConnectionQueryName, { scope: [`${contentType2.uid}.find`] });
1753
1870
  }
1754
1871
  return nexus.extendType({
1755
1872
  type: "Query",
@@ -1758,37 +1875,64 @@ const createCollectionTypeQueriesBuilder = ({ strapi: strapi2 }) => {
1758
1875
  addFindOneQuery(t, contentType2);
1759
1876
  }
1760
1877
  if (isFindEnabled) {
1878
+ addFindConnectionQuery(t, contentType2);
1761
1879
  addFindQuery(t, contentType2);
1762
1880
  }
1763
1881
  }
1764
1882
  });
1765
1883
  };
1766
1884
  const addFindOneQuery = (t, contentType2) => {
1767
- const { uid } = contentType2;
1768
1885
  const findOneQueryName = getFindOneQueryName(contentType2);
1769
- const responseTypeName = getEntityResponseName(contentType2);
1886
+ const typeName = getTypeName(contentType2);
1770
1887
  t.field(findOneQueryName, {
1771
- type: responseTypeName,
1888
+ type: typeName,
1889
+ extensions: {
1890
+ strapi: {
1891
+ contentType: contentType2
1892
+ }
1893
+ },
1772
1894
  args: getContentTypeArgs(contentType2, { multiple: false }),
1773
1895
  async resolve(parent, args2, ctx) {
1774
1896
  const transformedArgs = transformArgs(args2, { contentType: contentType2 });
1775
1897
  const { findOne } = getService("builders").get("content-api").buildQueriesResolvers({ contentType: contentType2 });
1776
- const value = findOne(parent, transformedArgs, ctx);
1777
- return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
1898
+ return findOne(parent, transformedArgs, ctx);
1778
1899
  }
1779
1900
  });
1780
1901
  };
1781
1902
  const addFindQuery = (t, contentType2) => {
1782
- const { uid } = contentType2;
1783
1903
  const findQueryName = getFindQueryName(contentType2);
1784
- const responseCollectionTypeName = getEntityResponseCollectionName(contentType2);
1904
+ const typeName = getTypeName(contentType2);
1785
1905
  t.field(findQueryName, {
1906
+ type: nexus.nonNull(nexus.list(typeName)),
1907
+ extensions: {
1908
+ strapi: {
1909
+ contentType: contentType2
1910
+ }
1911
+ },
1912
+ args: getContentTypeArgs(contentType2),
1913
+ async resolve(parent, args2, ctx) {
1914
+ const transformedArgs = transformArgs(args2, { contentType: contentType2, usePagination: true });
1915
+ const { findMany } = getService("builders").get("content-api").buildQueriesResolvers({ contentType: contentType2 });
1916
+ return findMany(parent, transformedArgs, ctx);
1917
+ }
1918
+ });
1919
+ };
1920
+ const addFindConnectionQuery = (t, contentType2) => {
1921
+ const { uid } = contentType2;
1922
+ const queryName = getFindConnectionQueryName(contentType2);
1923
+ const responseCollectionTypeName = getEntityResponseCollectionName(contentType2);
1924
+ t.field(queryName, {
1786
1925
  type: responseCollectionTypeName,
1926
+ extensions: {
1927
+ strapi: {
1928
+ contentType: contentType2
1929
+ }
1930
+ },
1787
1931
  args: getContentTypeArgs(contentType2),
1788
1932
  async resolve(parent, args2, ctx) {
1789
1933
  const transformedArgs = transformArgs(args2, { contentType: contentType2, usePagination: true });
1790
- const { find } = getService("builders").get("content-api").buildQueriesResolvers({ contentType: contentType2 });
1791
- const nodes = await find(parent, transformedArgs, ctx);
1934
+ const { findMany } = getService("builders").get("content-api").buildQueriesResolvers({ contentType: contentType2 });
1935
+ const nodes = await findMany(parent, transformedArgs, ctx);
1792
1936
  return toEntityResponseCollection(nodes, { args: transformedArgs, resourceUID: uid });
1793
1937
  }
1794
1938
  });
@@ -1799,8 +1943,7 @@ const createSingleTypeQueriesBuilder = ({ strapi: strapi2 }) => {
1799
1943
  const { service: getService } = strapi2.plugin("graphql");
1800
1944
  const { naming: naming2 } = getService("utils");
1801
1945
  const { transformArgs, getContentTypeArgs } = getService("builders").utils;
1802
- const { toEntityResponse } = getService("format").returnTypes;
1803
- const { getFindOneQueryName, getEntityResponseName } = naming2;
1946
+ const { getFindOneQueryName, getTypeName } = naming2;
1804
1947
  const buildSingleTypeQueries = (contentType2) => {
1805
1948
  const findQueryName = `Query.${getFindOneQueryName(contentType2)}`;
1806
1949
  const extension = getService("extension");
@@ -1824,17 +1967,20 @@ const createSingleTypeQueriesBuilder = ({ strapi: strapi2 }) => {
1824
1967
  });
1825
1968
  };
1826
1969
  const addFindQuery = (t, contentType2) => {
1827
- const { uid } = contentType2;
1828
1970
  const findQueryName = getFindOneQueryName(contentType2);
1829
- const responseTypeName = getEntityResponseName(contentType2);
1971
+ const typeName = getTypeName(contentType2);
1830
1972
  t.field(findQueryName, {
1831
- type: responseTypeName,
1973
+ type: typeName,
1974
+ extensions: {
1975
+ strapi: {
1976
+ contentType: contentType2
1977
+ }
1978
+ },
1832
1979
  args: getContentTypeArgs(contentType2),
1833
1980
  async resolve(parent, args2, ctx) {
1834
1981
  const transformedArgs = transformArgs(args2, { contentType: contentType2 });
1835
- const queriesResolvers2 = getService("builders").get("content-api").buildQueriesResolvers({ contentType: contentType2 });
1836
- const value = queriesResolvers2.find(parent, transformedArgs, ctx);
1837
- return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
1982
+ const { findFirst } = getService("builders").get("content-api").buildQueriesResolvers({ contentType: contentType2 });
1983
+ return findFirst(parent, transformedArgs, ctx);
1838
1984
  }
1839
1985
  });
1840
1986
  };
@@ -1847,86 +1993,89 @@ const queries = (context) => ({
1847
1993
  const createCollectionTypeMutationsBuilder = ({ strapi: strapi2 }) => {
1848
1994
  const { service: getService } = strapi2.plugin("graphql");
1849
1995
  const { naming: naming2 } = getService("utils");
1850
- const { transformArgs } = getService("builders").utils;
1851
- const { toEntityResponse } = getService("format").returnTypes;
1996
+ const { args: args2 } = getService("internals");
1852
1997
  const {
1853
1998
  getCreateMutationTypeName,
1854
1999
  getUpdateMutationTypeName,
1855
2000
  getDeleteMutationTypeName,
1856
- getEntityResponseName,
1857
- getContentTypeInputName
2001
+ getContentTypeInputName,
2002
+ getTypeName
1858
2003
  } = naming2;
1859
2004
  const addCreateMutation = (t, contentType2) => {
1860
2005
  const { uid } = contentType2;
1861
2006
  const createMutationName = getCreateMutationTypeName(contentType2);
1862
- const responseTypeName = getEntityResponseName(contentType2);
2007
+ const typeName = getTypeName(contentType2);
1863
2008
  t.field(createMutationName, {
1864
- type: responseTypeName,
2009
+ type: typeName,
2010
+ extensions: {
2011
+ strapi: {
2012
+ contentType: contentType2
2013
+ }
2014
+ },
1865
2015
  args: {
1866
2016
  // Create payload
2017
+ status: args2.PublicationStatusArg,
1867
2018
  data: nexus.nonNull(getContentTypeInputName(contentType2))
1868
2019
  },
1869
- async resolve(parent, args2, context) {
2020
+ async resolve(parent, args22, context) {
1870
2021
  const { auth } = context.state;
1871
- const transformedArgs = transformArgs(args2, { contentType: contentType2 });
1872
- const sanitizedInputData = await utils$2.sanitize.contentAPI.input(
1873
- transformedArgs.data,
1874
- contentType2,
1875
- { auth }
1876
- );
1877
- Object.assign(transformedArgs, { data: sanitizedInputData });
1878
- const { create } = getService("builders").get("content-api").buildMutationsResolvers({ contentType: contentType2 });
1879
- const value = await create(parent, transformedArgs);
1880
- return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
2022
+ const sanitizedInputData = await strapi2.contentAPI.sanitize.input(args22.data, contentType2, {
2023
+ auth
2024
+ });
2025
+ return strapi2.documents(uid).create({
2026
+ ...args22,
2027
+ data: sanitizedInputData
2028
+ });
1881
2029
  }
1882
2030
  });
1883
2031
  };
1884
2032
  const addUpdateMutation = (t, contentType2) => {
1885
2033
  const { uid } = contentType2;
1886
2034
  const updateMutationName = getUpdateMutationTypeName(contentType2);
1887
- const responseTypeName = getEntityResponseName(contentType2);
2035
+ const typeName = getTypeName(contentType2);
1888
2036
  t.field(updateMutationName, {
1889
- type: responseTypeName,
2037
+ type: typeName,
2038
+ extensions: {
2039
+ strapi: {
2040
+ contentType: contentType2
2041
+ }
2042
+ },
1890
2043
  args: {
1891
- // Query args
1892
- id: nexus.nonNull("ID"),
1893
- // todo[v4]: Don't allow to filter using every unique attributes for now
1894
- // ...uniqueAttributes,
1895
- // Update payload
2044
+ documentId: nexus.nonNull(nexus.idArg()),
2045
+ status: args2.PublicationStatusArg,
1896
2046
  data: nexus.nonNull(getContentTypeInputName(contentType2))
1897
2047
  },
1898
- async resolve(parent, args2, context) {
2048
+ async resolve(parent, args22, context) {
1899
2049
  const { auth } = context.state;
1900
- const transformedArgs = transformArgs(args2, { contentType: contentType2 });
1901
- const sanitizedInputData = await utils$2.sanitize.contentAPI.input(
1902
- transformedArgs.data,
1903
- contentType2,
1904
- { auth }
1905
- );
1906
- Object.assign(transformedArgs, { data: sanitizedInputData });
1907
- const { update } = getService("builders").get("content-api").buildMutationsResolvers({ contentType: contentType2 });
1908
- const value = await update(parent, transformedArgs);
1909
- return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
2050
+ const { data, ...restParams } = args22;
2051
+ const sanitizedInputData = await strapi2.contentAPI.sanitize.input(data, contentType2, {
2052
+ auth
2053
+ });
2054
+ return strapi2.documents(uid).update({
2055
+ ...restParams,
2056
+ data: sanitizedInputData
2057
+ });
1910
2058
  }
1911
2059
  });
1912
2060
  };
1913
2061
  const addDeleteMutation = (t, contentType2) => {
1914
2062
  const { uid } = contentType2;
1915
2063
  const deleteMutationName = getDeleteMutationTypeName(contentType2);
1916
- const responseTypeName = getEntityResponseName(contentType2);
2064
+ const { DELETE_MUTATION_RESPONSE_TYPE_NAME: DELETE_MUTATION_RESPONSE_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
1917
2065
  t.field(deleteMutationName, {
1918
- type: responseTypeName,
2066
+ type: DELETE_MUTATION_RESPONSE_TYPE_NAME2,
2067
+ extensions: {
2068
+ strapi: {
2069
+ contentType: contentType2
2070
+ }
2071
+ },
1919
2072
  args: {
1920
- // Query args
1921
- id: nexus.nonNull("ID")
1922
- // todo[v4]: Don't allow to filter using every unique attributes for now
1923
- // ...uniqueAttributes,
2073
+ documentId: nexus.nonNull(nexus.idArg())
1924
2074
  },
1925
- async resolve(parent, args2, ctx) {
1926
- const transformedArgs = transformArgs(args2, { contentType: contentType2 });
1927
- const { delete: deleteResolver } = getService("builders").get("content-api").buildMutationsResolvers({ contentType: contentType2 });
1928
- const value = await deleteResolver(parent, args2, ctx);
1929
- return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
2075
+ async resolve(parent, args22) {
2076
+ const { documentId } = args22;
2077
+ await strapi2.documents(uid).delete({ documentId });
2078
+ return { documentId };
1930
2079
  }
1931
2080
  });
1932
2081
  };
@@ -1975,70 +2124,68 @@ const { NotFoundError } = utils$2.errors;
1975
2124
  const createSingleTypeMutationsBuilder = ({ strapi: strapi2 }) => {
1976
2125
  const { service: getService } = strapi2.plugin("graphql");
1977
2126
  const { naming: naming2 } = getService("utils");
1978
- const { transformArgs } = getService("builders").utils;
1979
- const { toEntityResponse } = getService("format").returnTypes;
2127
+ const { args: args2 } = getService("internals");
1980
2128
  const {
1981
2129
  getUpdateMutationTypeName,
1982
- getEntityResponseName,
2130
+ getTypeName,
1983
2131
  getContentTypeInputName,
1984
2132
  getDeleteMutationTypeName
1985
2133
  } = naming2;
1986
2134
  const addUpdateMutation = (t, contentType2) => {
1987
2135
  const { uid } = contentType2;
1988
2136
  const updateMutationName = getUpdateMutationTypeName(contentType2);
1989
- const responseTypeName = getEntityResponseName(contentType2);
2137
+ const typeName = getTypeName(contentType2);
1990
2138
  t.field(updateMutationName, {
1991
- type: responseTypeName,
2139
+ type: typeName,
2140
+ extensions: {
2141
+ strapi: {
2142
+ contentType: contentType2
2143
+ }
2144
+ },
1992
2145
  args: {
1993
2146
  // Update payload
2147
+ status: args2.PublicationStatusArg,
1994
2148
  data: nexus.nonNull(getContentTypeInputName(contentType2))
1995
2149
  },
1996
- async resolve(parent, args2, context) {
2150
+ async resolve(parent, args22, context) {
1997
2151
  const { auth } = context.state;
1998
- const transformedArgs = transformArgs(args2, { contentType: contentType2 });
1999
- const sanitizedInputData = await utils$2.sanitize.contentAPI.input(
2000
- transformedArgs.data,
2001
- contentType2,
2002
- { auth }
2003
- );
2004
- Object.assign(transformedArgs, { data: sanitizedInputData });
2005
- const { create, update } = getService("builders").get("content-api").buildMutationsResolvers({ contentType: contentType2 });
2006
- await utils$2.validate.contentAPI.query(fp.omit(["data", "files"], transformedArgs), contentType2, {
2152
+ const sanitizedInputData = await strapi2.contentAPI.sanitize.input(args22.data, contentType2, {
2007
2153
  auth
2008
2154
  });
2009
- const sanitizedQuery = await utils$2.sanitize.contentAPI.query(
2010
- fp.omit(["data", "files"], transformedArgs),
2011
- contentType2,
2012
- {
2013
- auth
2014
- }
2015
- );
2016
- const entity2 = await strapi2.entityService.findMany(uid, sanitizedQuery);
2017
- const value = fp.isNil(entity2) ? create(parent, transformedArgs) : update(uid, { id: entity2.id, data: transformedArgs.data });
2018
- return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
2155
+ const document = await strapi2.db?.query(uid).findOne();
2156
+ if (document) {
2157
+ return strapi2.documents(uid).update({
2158
+ ...args22,
2159
+ documentId: document.documentId,
2160
+ data: sanitizedInputData
2161
+ });
2162
+ }
2163
+ return strapi2.documents(uid).create({
2164
+ ...args22,
2165
+ data: sanitizedInputData
2166
+ });
2019
2167
  }
2020
2168
  });
2021
2169
  };
2022
2170
  const addDeleteMutation = (t, contentType2) => {
2023
2171
  const { uid } = contentType2;
2024
2172
  const deleteMutationName = getDeleteMutationTypeName(contentType2);
2025
- const responseTypeName = getEntityResponseName(contentType2);
2173
+ const { DELETE_MUTATION_RESPONSE_TYPE_NAME: DELETE_MUTATION_RESPONSE_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
2026
2174
  t.field(deleteMutationName, {
2027
- type: responseTypeName,
2175
+ type: DELETE_MUTATION_RESPONSE_TYPE_NAME2,
2176
+ extensions: {
2177
+ strapi: {
2178
+ contentType: contentType2
2179
+ }
2180
+ },
2028
2181
  args: {},
2029
- async resolve(parent, args2, ctx) {
2030
- const transformedArgs = transformArgs(args2, { contentType: contentType2 });
2031
- const { delete: deleteResolver } = getService("builders").get("content-api").buildMutationsResolvers({ contentType: contentType2 });
2032
- await utils$2.validate.contentAPI.query(transformedArgs, contentType2, { auth: ctx?.state?.auth });
2033
- const sanitizedQuery = await utils$2.sanitize.contentAPI.query(transformedArgs, contentType2, {
2034
- auth: ctx?.state?.auth
2035
- });
2036
- const entity2 = await strapi2.entityService.findMany(uid, sanitizedQuery);
2037
- if (!entity2) {
2038
- throw new NotFoundError("Entity not found");
2182
+ async resolve(parent, args22) {
2183
+ const document = await strapi2.db?.query(uid).findOne();
2184
+ if (!document) {
2185
+ throw new NotFoundError("Document not found");
2039
2186
  }
2040
- const value = await deleteResolver(parent, { id: entity2.id, params: transformedArgs });
2041
- return toEntityResponse(value, { args: transformedArgs, resourceUID: uid });
2187
+ await strapi2.documents(uid).delete({ ...args22, documentId: document.documentId });
2188
+ return document;
2042
2189
  }
2043
2190
  });
2044
2191
  };
@@ -2125,9 +2272,9 @@ const contentType = ({ strapi: strapi2 }) => {
2125
2272
  const validAttributes = Object.entries(attributes2).filter(
2126
2273
  ([attributeName]) => extension.shadowCRUD(contentType2.uid).field(attributeName).hasFiltersEnabeld()
2127
2274
  );
2128
- const isIDFilterEnabled = extension.shadowCRUD(contentType2.uid).field("id").hasFiltersEnabeld();
2275
+ const isIDFilterEnabled = extension.shadowCRUD(contentType2.uid).field("documentId").hasFiltersEnabeld();
2129
2276
  if (contentType2.kind === "collectionType" && isIDFilterEnabled) {
2130
- t.field("id", { type: getScalarFilterInputTypeName("ID") });
2277
+ t.field("documentId", { type: getScalarFilterInputTypeName("ID") });
2131
2278
  }
2132
2279
  for (const [attributeName, attribute] of validAttributes) {
2133
2280
  if (isStrapiScalar(attribute)) {
@@ -2281,18 +2428,17 @@ const associationResolvers = ({ strapi: strapi2 }) => {
2281
2428
  contentType: targetContentType,
2282
2429
  usePagination: true
2283
2430
  });
2284
- await utils$2.validate.contentAPI.query(transformedArgs, targetContentType, {
2285
- auth
2286
- });
2287
- const sanitizedQuery = await utils$2.sanitize.contentAPI.query(transformedArgs, targetContentType, {
2431
+ await strapi2.contentAPI.validate.query(transformedArgs, targetContentType, {
2288
2432
  auth
2289
2433
  });
2290
- const data = await strapi2.entityService.load(
2291
- contentTypeUID,
2292
- parent,
2293
- attributeName,
2294
- sanitizedQuery
2434
+ const sanitizedQuery = await strapi2.contentAPI.sanitize.query(
2435
+ transformedArgs,
2436
+ targetContentType,
2437
+ {
2438
+ auth
2439
+ }
2295
2440
  );
2441
+ const data = await strapi2.db?.query(contentTypeUID).load(parent, attributeName, sanitizedQuery);
2296
2442
  const info = {
2297
2443
  args: sanitizedQuery,
2298
2444
  resourceUID: targetUID
@@ -2300,10 +2446,10 @@ const associationResolvers = ({ strapi: strapi2 }) => {
2300
2446
  if (isMorphAttribute) {
2301
2447
  const wrapData = (dataToWrap) => ({ [attributeName]: dataToWrap });
2302
2448
  const sanitizeData = (dataToSanitize) => {
2303
- return utils$2.sanitize.contentAPI.output(dataToSanitize, contentType2, { auth });
2449
+ return strapi2.contentAPI.sanitize.output(dataToSanitize, contentType2, { auth });
2304
2450
  };
2305
2451
  const unwrapData = fp.get(attributeName);
2306
- const sanitizeMorphAttribute = utils$2.pipeAsync(wrapData, sanitizeData, unwrapData);
2452
+ const sanitizeMorphAttribute = utils$2.async.pipe(wrapData, sanitizeData, unwrapData);
2307
2453
  return sanitizeMorphAttribute(data);
2308
2454
  }
2309
2455
  if (isToMany) {
@@ -2318,49 +2464,37 @@ const queriesResolvers = ({ strapi: strapi2 }) => ({
2318
2464
  buildQueriesResolvers({ contentType: contentType2 }) {
2319
2465
  const { uid } = contentType2;
2320
2466
  return {
2321
- async find(parent, args2, ctx) {
2322
- await utils$2.validate.contentAPI.query(args2, contentType2, {
2467
+ async findMany(parent, args2, ctx) {
2468
+ await strapi2.contentAPI.validate.query(args2, contentType2, {
2323
2469
  auth: ctx?.state?.auth
2324
2470
  });
2325
- const sanitizedQuery = await utils$2.sanitize.contentAPI.query(args2, contentType2, {
2471
+ const sanitizedQuery = await strapi2.contentAPI.sanitize.query(args2, contentType2, {
2326
2472
  auth: ctx?.state?.auth
2327
2473
  });
2328
- return strapi2.entityService.findMany(uid, sanitizedQuery);
2474
+ return strapi2.documents(uid).findMany({ status: "published", ...sanitizedQuery });
2329
2475
  },
2330
- async findOne(parent, args2, ctx) {
2331
- await utils$2.validate.contentAPI.query(args2, contentType2, {
2476
+ async findFirst(parent, args2, ctx) {
2477
+ await strapi2.contentAPI.validate.query(args2, contentType2, {
2332
2478
  auth: ctx?.state?.auth
2333
2479
  });
2334
- const sanitizedQuery = await utils$2.sanitize.contentAPI.query(args2, contentType2, {
2480
+ const sanitizedQuery = await strapi2.contentAPI.sanitize.query(args2, contentType2, {
2335
2481
  auth: ctx?.state?.auth
2336
2482
  });
2337
- return strapi2.entityService.findOne(uid, args2.id, fp.omit("id", sanitizedQuery));
2338
- }
2339
- };
2340
- }
2341
- });
2342
- const pickCreateArgs = fp.pick(["params", "data", "files"]);
2343
- const mutationsResolvers = ({ strapi: strapi2 }) => ({
2344
- buildMutationsResolvers({ contentType: contentType2 }) {
2345
- const { uid } = contentType2;
2346
- return {
2347
- async create(parent, args2) {
2348
- const params = pickCreateArgs(args2);
2349
- return strapi2.entityService.create(uid, params);
2350
- },
2351
- async update(parent, args2) {
2352
- const { id, data } = args2;
2353
- return strapi2.entityService.update(uid, id, { data });
2483
+ return strapi2.documents(uid).findFirst({ status: "published", ...sanitizedQuery });
2354
2484
  },
2355
- async delete(parent, args2, ctx) {
2356
- const { id, ...rest } = args2;
2357
- await utils$2.validate.contentAPI.query(rest, contentType2, {
2485
+ async findOne(parent, args2, ctx) {
2486
+ const { documentId } = args2;
2487
+ await strapi2.contentAPI.validate.query(args2, contentType2, {
2358
2488
  auth: ctx?.state?.auth
2359
2489
  });
2360
- const sanitizedQuery = await utils$2.sanitize.contentAPI.query(rest, contentType2, {
2490
+ const sanitizedQuery = await strapi2.contentAPI.sanitize.query(args2, contentType2, {
2361
2491
  auth: ctx?.state?.auth
2362
2492
  });
2363
- return strapi2.entityService.delete(uid, id, sanitizedQuery);
2493
+ return strapi2.documents(uid).findOne({
2494
+ status: "published",
2495
+ ...fp.omit(["id", "documentId"], sanitizedQuery),
2496
+ documentId
2497
+ });
2364
2498
  }
2365
2499
  };
2366
2500
  }
@@ -2376,13 +2510,13 @@ const componentResolvers = ({ strapi: strapi2 }) => ({
2376
2510
  const { component: componentName } = contentType2.attributes[attributeName];
2377
2511
  const component = strapi2.getModel(componentName);
2378
2512
  const transformedArgs = transformArgs(args2, { contentType: component, usePagination: true });
2379
- await utils$2.validate.contentAPI.query(transformedArgs, component, {
2513
+ await strapi2.contentAPI.validate.query(transformedArgs, component, {
2380
2514
  auth: ctx?.state?.auth
2381
2515
  });
2382
- const sanitizedQuery = await utils$2.sanitize.contentAPI.query(transformedArgs, component, {
2516
+ const sanitizedQuery = await strapi2.contentAPI.sanitize.query(transformedArgs, component, {
2383
2517
  auth: ctx?.state?.auth
2384
2518
  });
2385
- return strapi2.entityService.load(contentTypeUID, parent, attributeName, sanitizedQuery);
2519
+ return strapi2.db?.query(contentTypeUID).load(parent, attributeName, sanitizedQuery);
2386
2520
  };
2387
2521
  }
2388
2522
  });
@@ -2392,18 +2526,37 @@ const dynamicZoneResolvers = ({ strapi: strapi2 }) => ({
2392
2526
  attributeName
2393
2527
  }) {
2394
2528
  return async (parent) => {
2395
- return strapi2.entityService.load(contentTypeUID, parent, attributeName);
2529
+ return strapi2.db?.query(contentTypeUID).load(parent, attributeName);
2396
2530
  };
2397
2531
  }
2398
2532
  });
2533
+ const paginationResolvers = ({ strapi: strapi2 }) => ({
2534
+ async resolvePagination(parent, _, ctx) {
2535
+ const { args: args2, resourceUID } = parent.info;
2536
+ const { start, limit } = args2;
2537
+ const safeLimit = Math.max(limit, 1);
2538
+ const contentType2 = strapi2.getModel(resourceUID);
2539
+ await strapi2.contentAPI.validate.query(args2, contentType2, {
2540
+ auth: ctx?.state?.auth
2541
+ });
2542
+ const sanitizedQuery = await strapi2.contentAPI.sanitize.query(args2, contentType2, {
2543
+ auth: ctx?.state?.auth
2544
+ });
2545
+ const total = await strapi2.documents(resourceUID).count(sanitizedQuery);
2546
+ const pageSize = limit === -1 ? total - start : safeLimit;
2547
+ const pageCount = limit === -1 ? safeLimit : Math.ceil(total / safeLimit);
2548
+ const page = limit === -1 ? safeLimit : Math.floor(start / safeLimit) + 1;
2549
+ return { total, page, pageSize, pageCount };
2550
+ }
2551
+ });
2399
2552
  const resolvers = (context) => ({
2400
2553
  // Generics
2401
2554
  ...associationResolvers(context),
2402
2555
  // Builders
2403
- ...mutationsResolvers(context),
2404
2556
  ...queriesResolvers(context),
2405
2557
  ...componentResolvers(context),
2406
- ...dynamicZoneResolvers(context)
2558
+ ...dynamicZoneResolvers(context),
2559
+ ...paginationResolvers(context)
2407
2560
  });
2408
2561
  const AND_FIELD_NAME = "and";
2409
2562
  const andOperator = () => ({
@@ -2619,18 +2772,10 @@ const operators = {
2619
2772
  };
2620
2773
  const operators$1 = ({ strapi: strapi2 }) => fp.mapValues((opCtor) => opCtor({ strapi: strapi2 }), operators);
2621
2774
  const { withDefaultPagination } = utils$2.pagination;
2622
- const { hasDraftAndPublish } = utils$2.contentTypes;
2623
2775
  const utils = ({ strapi: strapi2 }) => {
2624
2776
  const { service: getService } = strapi2.plugin("graphql");
2625
2777
  return {
2626
- /**
2627
- * Get every args for a given content type
2628
- * @param {object} contentType
2629
- * @param {object} options
2630
- * @param {boolean} options.multiple
2631
- * @return {object}
2632
- */
2633
- getContentTypeArgs(contentType2, { multiple = true } = {}) {
2778
+ getContentTypeArgs(contentType2, { multiple = true, isNested = false } = {}) {
2634
2779
  const { naming: naming2 } = getService("utils");
2635
2780
  const { args: args2 } = getService("internals");
2636
2781
  const { modelType } = contentType2;
@@ -2646,22 +2791,25 @@ const utils = ({ strapi: strapi2 }) => {
2646
2791
  const { kind } = contentType2;
2647
2792
  if (kind === "collectionType") {
2648
2793
  if (!multiple) {
2649
- return { id: "ID" };
2794
+ return {
2795
+ documentId: nexus.nonNull(nexus.idArg()),
2796
+ status: args2.PublicationStatusArg
2797
+ };
2650
2798
  }
2651
2799
  const params = {
2652
2800
  filters: naming2.getFiltersInputTypeName(contentType2),
2653
2801
  pagination: args2.PaginationArg,
2654
2802
  sort: args2.SortArg
2655
2803
  };
2656
- if (hasDraftAndPublish(contentType2)) {
2657
- Object.assign(params, { publicationState: args2.PublicationStateArg });
2804
+ if (!isNested) {
2805
+ Object.assign(params, { status: args2.PublicationStatusArg });
2658
2806
  }
2659
2807
  return params;
2660
2808
  }
2661
2809
  if (kind === "singleType") {
2662
2810
  const params = {};
2663
- if (hasDraftAndPublish(contentType2)) {
2664
- Object.assign(params, { publicationState: args2.PublicationStateArg });
2811
+ if (!isNested) {
2812
+ Object.assign(params, { status: args2.PublicationStatusArg });
2665
2813
  }
2666
2814
  return params;
2667
2815
  }
@@ -2726,7 +2874,6 @@ const buildersFactories = [
2726
2874
  enums,
2727
2875
  dynamicZone,
2728
2876
  entity,
2729
- entityMeta,
2730
2877
  typeBuilder,
2731
2878
  response,
2732
2879
  responseCollection,