@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.
- package/LICENSE +18 -3
- package/dist/_chunks/{dk-KmLnUoJC.mjs → dk-BbJCmDw6.mjs} +1 -1
- package/dist/_chunks/dk-BbJCmDw6.mjs.map +1 -0
- package/dist/_chunks/{dk-SLrLqAtl.js → dk-C9NcSzyg.js} +1 -1
- package/dist/_chunks/dk-C9NcSzyg.js.map +1 -0
- package/dist/_chunks/{en-WmmC2MW8.js → en-BiKpmhCU.js} +1 -1
- package/dist/_chunks/en-BiKpmhCU.js.map +1 -0
- package/dist/_chunks/{en-A16mqbIV.mjs → en-YIQYYlvv.mjs} +1 -1
- package/dist/_chunks/en-YIQYYlvv.mjs.map +1 -0
- package/dist/_chunks/{es-_xZ14QXK.mjs → es-BbsZ5Fh0.mjs} +1 -1
- package/dist/_chunks/es-BbsZ5Fh0.mjs.map +1 -0
- package/dist/_chunks/{es-4tl6ikyU.js → es-DE22V9D4.js} +1 -1
- package/dist/_chunks/es-DE22V9D4.js.map +1 -0
- package/dist/_chunks/{fr-4BkQ-Qvt.mjs → fr-BgqFw7G8.mjs} +1 -1
- package/dist/_chunks/fr-BgqFw7G8.mjs.map +1 -0
- package/dist/_chunks/{fr-cJXSt55N.js → fr-Ca-HowfR.js} +1 -1
- package/dist/_chunks/fr-Ca-HowfR.js.map +1 -0
- package/dist/_chunks/{pl-TWurBBP_.mjs → pl-CbET57Jb.mjs} +1 -1
- package/dist/_chunks/pl-CbET57Jb.mjs.map +1 -0
- package/dist/_chunks/{pl-wKw9Xgkw.js → pl-DVnJGR87.js} +1 -1
- package/dist/_chunks/pl-DVnJGR87.js.map +1 -0
- package/dist/_chunks/{ru-aD804UEo.mjs → ru-BFz40YSA.mjs} +1 -1
- package/dist/_chunks/ru-BFz40YSA.mjs.map +1 -0
- package/dist/_chunks/{ru-CYAnXR6L.js → ru-o4zaP02C.js} +1 -1
- package/dist/_chunks/ru-o4zaP02C.js.map +1 -0
- package/dist/_chunks/{sv-XNOe1ctV.js → sv-9qK4y9fb.js} +1 -1
- package/dist/_chunks/sv-9qK4y9fb.js.map +1 -0
- package/dist/_chunks/{sv-N5RufX6w.mjs → sv-CNYcKBn2.mjs} +1 -1
- package/dist/_chunks/sv-CNYcKBn2.mjs.map +1 -0
- package/dist/_chunks/{tr-UmSHgD8y.mjs → tr-H1PrR6RM.mjs} +1 -1
- package/dist/_chunks/tr-H1PrR6RM.mjs.map +1 -0
- package/dist/_chunks/{tr-POFbAHUC.js → tr-fBBDNMBY.js} +1 -1
- package/dist/_chunks/tr-fBBDNMBY.js.map +1 -0
- package/dist/_chunks/{zh-KvwXXMnA.mjs → zh-BEh3jejH.mjs} +1 -1
- package/dist/_chunks/zh-BEh3jejH.mjs.map +1 -0
- package/dist/_chunks/{zh-kJ_DkSIe.js → zh-CyCKPuL0.js} +1 -1
- package/dist/_chunks/zh-CyCKPuL0.js.map +1 -0
- package/dist/_chunks/{zh-Hans-pnigVFnS.js → zh-Hans-Btuz6Y7W.js} +1 -1
- package/dist/_chunks/zh-Hans-Btuz6Y7W.js.map +1 -0
- package/dist/_chunks/{zh-Hans-ClgXy4wM.mjs → zh-Hans-CRQss50D.mjs} +1 -1
- package/dist/_chunks/zh-Hans-CRQss50D.mjs.map +1 -0
- package/dist/admin/index.js +41 -31
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +40 -30
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
- package/dist/server/index.js +459 -312
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +457 -312
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts +2 -2
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/config/default-config.d.ts +1 -0
- package/dist/server/src/config/default-config.d.ts.map +1 -1
- package/dist/server/src/config/index.d.ts +1 -0
- package/dist/server/src/config/index.d.ts.map +1 -1
- package/dist/server/src/format-graphql-error.d.ts +7 -3
- package/dist/server/src/format-graphql-error.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +70 -56
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/dynamic-zones.d.ts +2 -6
- package/dist/server/src/services/builders/dynamic-zones.d.ts.map +1 -1
- package/dist/server/src/services/builders/entity.d.ts.map +1 -1
- package/dist/server/src/services/builders/filters/content-type.d.ts +2 -2
- package/dist/server/src/services/builders/filters/content-type.d.ts.map +1 -1
- package/dist/server/src/services/builders/filters/index.d.ts +1 -1
- package/dist/server/src/services/builders/filters/operators/eq.d.ts +2 -2
- package/dist/server/src/services/builders/filters/operators/eq.d.ts.map +1 -1
- package/dist/server/src/services/builders/filters/operators/index.d.ts +2 -2
- package/dist/server/src/services/builders/filters/operators/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/filters/operators/not.d.ts +2 -2
- package/dist/server/src/services/builders/filters/operators/not.d.ts.map +1 -1
- package/dist/server/src/services/builders/index.d.ts +15 -11
- package/dist/server/src/services/builders/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/input.d.ts +2 -2
- package/dist/server/src/services/builders/input.d.ts.map +1 -1
- package/dist/server/src/services/builders/mutations/collection-type.d.ts +2 -2
- package/dist/server/src/services/builders/mutations/collection-type.d.ts.map +1 -1
- package/dist/server/src/services/builders/mutations/index.d.ts +2 -2
- package/dist/server/src/services/builders/mutations/single-type.d.ts +2 -2
- package/dist/server/src/services/builders/mutations/single-type.d.ts.map +1 -1
- package/dist/server/src/services/builders/queries/collection-type.d.ts +2 -2
- package/dist/server/src/services/builders/queries/collection-type.d.ts.map +1 -1
- package/dist/server/src/services/builders/queries/index.d.ts +2 -2
- package/dist/server/src/services/builders/queries/single-type.d.ts +2 -2
- package/dist/server/src/services/builders/queries/single-type.d.ts.map +1 -1
- package/dist/server/src/services/builders/relation-response-collection.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/association.d.ts +2 -2
- package/dist/server/src/services/builders/resolvers/association.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/component.d.ts +2 -2
- package/dist/server/src/services/builders/resolvers/component.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/dynamic-zone.d.ts +2 -2
- package/dist/server/src/services/builders/resolvers/dynamic-zone.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/index.d.ts +10 -34
- package/dist/server/src/services/builders/resolvers/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/pagination.d.ts +11 -0
- package/dist/server/src/services/builders/resolvers/pagination.d.ts.map +1 -0
- package/dist/server/src/services/builders/resolvers/query.d.ts +3 -14
- package/dist/server/src/services/builders/resolvers/query.d.ts.map +1 -1
- package/dist/server/src/services/builders/response-collection.d.ts.map +1 -1
- package/dist/server/src/services/builders/type.d.ts +2 -2
- package/dist/server/src/services/builders/type.d.ts.map +1 -1
- package/dist/server/src/services/builders/utils.d.ts +18 -20
- package/dist/server/src/services/builders/utils.d.ts.map +1 -1
- package/dist/server/src/services/constants.d.ts +2 -1
- package/dist/server/src/services/constants.d.ts.map +1 -1
- package/dist/server/src/services/content-api/index.d.ts +2 -2
- package/dist/server/src/services/content-api/index.d.ts.map +1 -1
- package/dist/server/src/services/content-api/policy.d.ts +3 -3
- package/dist/server/src/services/content-api/policy.d.ts.map +1 -1
- package/dist/server/src/services/content-api/register-functions/collection-type.d.ts +3 -3
- package/dist/server/src/services/content-api/register-functions/collection-type.d.ts.map +1 -1
- package/dist/server/src/services/content-api/register-functions/component.d.ts +3 -3
- package/dist/server/src/services/content-api/register-functions/component.d.ts.map +1 -1
- package/dist/server/src/services/content-api/register-functions/dynamic-zones.d.ts +9 -0
- package/dist/server/src/services/content-api/register-functions/dynamic-zones.d.ts.map +1 -0
- package/dist/server/src/services/content-api/register-functions/enums.d.ts +9 -0
- package/dist/server/src/services/content-api/register-functions/enums.d.ts.map +1 -0
- package/dist/server/src/services/content-api/register-functions/filters.d.ts +9 -0
- package/dist/server/src/services/content-api/register-functions/filters.d.ts.map +1 -0
- package/dist/server/src/services/content-api/register-functions/index.d.ts +5 -2
- package/dist/server/src/services/content-api/register-functions/index.d.ts.map +1 -1
- package/dist/server/src/services/content-api/register-functions/inputs.d.ts +9 -0
- package/dist/server/src/services/content-api/register-functions/inputs.d.ts.map +1 -0
- package/dist/server/src/services/content-api/register-functions/polymorphic.d.ts +2 -2
- package/dist/server/src/services/content-api/register-functions/polymorphic.d.ts.map +1 -1
- package/dist/server/src/services/content-api/register-functions/single-type.d.ts +3 -3
- package/dist/server/src/services/content-api/register-functions/single-type.d.ts.map +1 -1
- package/dist/server/src/services/content-api/wrap-resolvers.d.ts +2 -2
- package/dist/server/src/services/content-api/wrap-resolvers.d.ts.map +1 -1
- package/dist/server/src/services/extension/extension.d.ts +3 -3
- package/dist/server/src/services/extension/extension.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +69 -56
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/internals/args/index.d.ts +1 -1
- package/dist/server/src/services/internals/args/{publication-state.d.ts → publication-status.d.ts} +1 -1
- package/dist/server/src/services/internals/args/publication-status.d.ts.map +1 -0
- package/dist/server/src/services/internals/index.d.ts +14 -10
- package/dist/server/src/services/internals/index.d.ts.map +1 -1
- package/dist/server/src/services/internals/scalars/index.d.ts +4 -5
- package/dist/server/src/services/internals/scalars/index.d.ts.map +1 -1
- package/dist/server/src/services/internals/scalars/time.d.ts +1 -1
- package/dist/server/src/services/internals/scalars/time.d.ts.map +1 -1
- package/dist/server/src/services/internals/types/delete-mutation-response.d.ts +6 -0
- package/dist/server/src/services/internals/types/delete-mutation-response.d.ts.map +1 -0
- package/dist/server/src/services/internals/types/index.d.ts +9 -4
- package/dist/server/src/services/internals/types/index.d.ts.map +1 -1
- package/dist/server/src/services/internals/types/publication-status.d.ts +10 -0
- package/dist/server/src/services/internals/types/publication-status.d.ts.map +1 -0
- package/dist/server/src/services/internals/types/response-collection-meta.d.ts.map +1 -1
- package/dist/server/src/services/types.d.ts +2 -2
- package/dist/server/src/services/types.d.ts.map +1 -1
- package/dist/server/src/services/utils/attributes.d.ts +4 -4
- package/dist/server/src/services/utils/attributes.d.ts.map +1 -1
- package/dist/server/src/services/utils/index.d.ts +37 -33
- package/dist/server/src/services/utils/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/mappers/entity-to-response-entity.d.ts +7 -7
- package/dist/server/src/services/utils/mappers/entity-to-response-entity.d.ts.map +1 -1
- package/dist/server/src/services/utils/mappers/graphql-filters-to-strapi-query.d.ts +2 -2
- package/dist/server/src/services/utils/mappers/graphql-filters-to-strapi-query.d.ts.map +1 -1
- package/dist/server/src/services/utils/mappers/index.d.ts +7 -7
- package/dist/server/src/services/utils/naming.d.ts +26 -25
- package/dist/server/src/services/utils/naming.d.ts.map +1 -1
- package/dist/server/src/services/utils/playground.d.ts +6 -0
- package/dist/server/src/services/utils/playground.d.ts.map +1 -0
- package/package.json +31 -29
- package/dist/_chunks/dk-KmLnUoJC.mjs.map +0 -1
- package/dist/_chunks/dk-SLrLqAtl.js.map +0 -1
- package/dist/_chunks/en-A16mqbIV.mjs.map +0 -1
- package/dist/_chunks/en-WmmC2MW8.js.map +0 -1
- package/dist/_chunks/es-4tl6ikyU.js.map +0 -1
- package/dist/_chunks/es-_xZ14QXK.mjs.map +0 -1
- package/dist/_chunks/fr-4BkQ-Qvt.mjs.map +0 -1
- package/dist/_chunks/fr-cJXSt55N.js.map +0 -1
- package/dist/_chunks/pl-TWurBBP_.mjs.map +0 -1
- package/dist/_chunks/pl-wKw9Xgkw.js.map +0 -1
- package/dist/_chunks/ru-CYAnXR6L.js.map +0 -1
- package/dist/_chunks/ru-aD804UEo.mjs.map +0 -1
- package/dist/_chunks/sv-N5RufX6w.mjs.map +0 -1
- package/dist/_chunks/sv-XNOe1ctV.js.map +0 -1
- package/dist/_chunks/tr-POFbAHUC.js.map +0 -1
- package/dist/_chunks/tr-UmSHgD8y.mjs.map +0 -1
- package/dist/_chunks/zh-Hans-ClgXy4wM.mjs.map +0 -1
- package/dist/_chunks/zh-Hans-pnigVFnS.js.map +0 -1
- package/dist/_chunks/zh-KvwXXMnA.mjs.map +0 -1
- package/dist/_chunks/zh-kJ_DkSIe.js.map +0 -1
- package/dist/server/src/services/builders/entity-meta.d.ts +0 -6
- package/dist/server/src/services/builders/entity-meta.d.ts.map +0 -1
- package/dist/server/src/services/builders/resolvers/mutation.d.ts +0 -25
- package/dist/server/src/services/builders/resolvers/mutation.d.ts.map +0 -1
- package/dist/server/src/services/content-api/register-functions/content-type/dynamic-zones.d.ts +0 -9
- package/dist/server/src/services/content-api/register-functions/content-type/dynamic-zones.d.ts.map +0 -1
- package/dist/server/src/services/content-api/register-functions/content-type/enums.d.ts +0 -9
- package/dist/server/src/services/content-api/register-functions/content-type/enums.d.ts.map +0 -1
- package/dist/server/src/services/content-api/register-functions/content-type/filters.d.ts +0 -9
- package/dist/server/src/services/content-api/register-functions/content-type/filters.d.ts.map +0 -1
- package/dist/server/src/services/content-api/register-functions/content-type/index.d.ts +0 -24
- package/dist/server/src/services/content-api/register-functions/content-type/index.d.ts.map +0 -1
- package/dist/server/src/services/content-api/register-functions/content-type/inputs.d.ts +0 -9
- package/dist/server/src/services/content-api/register-functions/content-type/inputs.d.ts.map +0 -1
- package/dist/server/src/services/internals/args/publication-state.d.ts.map +0 -1
- package/dist/server/src/services/internals/types/publication-state.d.ts +0 -10
- package/dist/server/src/services/internals/types/publication-state.d.ts.map +0 -1
package/dist/server/index.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const fp = require("lodash/fp");
|
|
3
|
-
const
|
|
4
|
-
const
|
|
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
|
|
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
|
|
50
|
-
const
|
|
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
|
|
69
|
+
return formattedError;
|
|
53
70
|
}
|
|
71
|
+
const { message = "", name = "UNKNOWN" } = originalError;
|
|
54
72
|
if (originalError instanceof ForbiddenError$1 || originalError instanceof UnauthorizedError) {
|
|
55
|
-
return
|
|
73
|
+
return createFormattedError(formattedError, message, "FORBIDDEN", originalError);
|
|
56
74
|
}
|
|
57
75
|
if (originalError instanceof ValidationError$3) {
|
|
58
|
-
return
|
|
76
|
+
return createFormattedError(formattedError, message, "BAD_USER_INPUT", originalError);
|
|
59
77
|
}
|
|
60
78
|
if (originalError instanceof ApplicationError$5 || originalError instanceof HttpError) {
|
|
61
|
-
const
|
|
62
|
-
return
|
|
79
|
+
const errorName = formatToCode(name);
|
|
80
|
+
return createFormattedError(formattedError, message, errorName, originalError);
|
|
63
81
|
}
|
|
64
|
-
if (originalError instanceof
|
|
65
|
-
return
|
|
82
|
+
if (originalError instanceof graphql.GraphQLError) {
|
|
83
|
+
return formattedError;
|
|
66
84
|
}
|
|
67
85
|
strapi.log.error(originalError);
|
|
68
|
-
return
|
|
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
|
-
|
|
109
|
-
|
|
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(
|
|
114
|
-
|
|
115
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
|
1135
|
-
const {
|
|
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:
|
|
1138
|
-
default: "
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
|
1248
|
-
const {
|
|
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
|
|
1283
|
+
* An enum type definition representing a publication status
|
|
1252
1284
|
* @type {NexusEnumTypeDef}
|
|
1253
1285
|
*/
|
|
1254
|
-
|
|
1255
|
-
name:
|
|
1286
|
+
PublicationStatus: nexus.enumType({
|
|
1287
|
+
name: PUBLICATION_STATUS_TYPE_NAME2,
|
|
1256
1288
|
members: {
|
|
1257
|
-
|
|
1258
|
-
|
|
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
|
-
|
|
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, {
|
|
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
|
|
1532
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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:
|
|
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 {
|
|
1677
|
-
const {
|
|
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
|
|
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("
|
|
1691
|
-
type: nexus.nonNull(
|
|
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("
|
|
1695
|
-
type:
|
|
1696
|
-
|
|
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
|
|
1819
|
+
const typeName = naming2.getTypeName(contentType2);
|
|
1713
1820
|
return nexus.objectType({
|
|
1714
1821
|
name,
|
|
1715
1822
|
definition(t) {
|
|
1716
|
-
t.nonNull.list.field("
|
|
1717
|
-
type: nexus.nonNull(
|
|
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 {
|
|
1843
|
+
const { toEntityResponseCollection } = getService("format").returnTypes;
|
|
1730
1844
|
const {
|
|
1731
1845
|
getFindOneQueryName,
|
|
1732
|
-
|
|
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
|
|
1886
|
+
const typeName = getTypeName(contentType2);
|
|
1770
1887
|
t.field(findOneQueryName, {
|
|
1771
|
-
type:
|
|
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
|
-
|
|
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
|
|
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 {
|
|
1791
|
-
const nodes = await
|
|
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 {
|
|
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
|
|
1971
|
+
const typeName = getTypeName(contentType2);
|
|
1830
1972
|
t.field(findQueryName, {
|
|
1831
|
-
type:
|
|
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
|
|
1836
|
-
|
|
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 {
|
|
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
|
-
|
|
1857
|
-
|
|
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
|
|
2007
|
+
const typeName = getTypeName(contentType2);
|
|
1863
2008
|
t.field(createMutationName, {
|
|
1864
|
-
type:
|
|
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,
|
|
2020
|
+
async resolve(parent, args22, context) {
|
|
1870
2021
|
const { auth } = context.state;
|
|
1871
|
-
const
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
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
|
|
2035
|
+
const typeName = getTypeName(contentType2);
|
|
1888
2036
|
t.field(updateMutationName, {
|
|
1889
|
-
type:
|
|
2037
|
+
type: typeName,
|
|
2038
|
+
extensions: {
|
|
2039
|
+
strapi: {
|
|
2040
|
+
contentType: contentType2
|
|
2041
|
+
}
|
|
2042
|
+
},
|
|
1890
2043
|
args: {
|
|
1891
|
-
|
|
1892
|
-
|
|
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,
|
|
2048
|
+
async resolve(parent, args22, context) {
|
|
1899
2049
|
const { auth } = context.state;
|
|
1900
|
-
const
|
|
1901
|
-
const sanitizedInputData = await
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
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
|
|
2064
|
+
const { DELETE_MUTATION_RESPONSE_TYPE_NAME: DELETE_MUTATION_RESPONSE_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
|
|
1917
2065
|
t.field(deleteMutationName, {
|
|
1918
|
-
type:
|
|
2066
|
+
type: DELETE_MUTATION_RESPONSE_TYPE_NAME2,
|
|
2067
|
+
extensions: {
|
|
2068
|
+
strapi: {
|
|
2069
|
+
contentType: contentType2
|
|
2070
|
+
}
|
|
2071
|
+
},
|
|
1919
2072
|
args: {
|
|
1920
|
-
|
|
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,
|
|
1926
|
-
const
|
|
1927
|
-
|
|
1928
|
-
|
|
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 {
|
|
1979
|
-
const { toEntityResponse } = getService("format").returnTypes;
|
|
2127
|
+
const { args: args2 } = getService("internals");
|
|
1980
2128
|
const {
|
|
1981
2129
|
getUpdateMutationTypeName,
|
|
1982
|
-
|
|
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
|
|
2137
|
+
const typeName = getTypeName(contentType2);
|
|
1990
2138
|
t.field(updateMutationName, {
|
|
1991
|
-
type:
|
|
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,
|
|
2150
|
+
async resolve(parent, args22, context) {
|
|
1997
2151
|
const { auth } = context.state;
|
|
1998
|
-
const
|
|
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
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
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
|
|
2173
|
+
const { DELETE_MUTATION_RESPONSE_TYPE_NAME: DELETE_MUTATION_RESPONSE_TYPE_NAME2 } = strapi2.plugin("graphql").service("constants");
|
|
2026
2174
|
t.field(deleteMutationName, {
|
|
2027
|
-
type:
|
|
2175
|
+
type: DELETE_MUTATION_RESPONSE_TYPE_NAME2,
|
|
2176
|
+
extensions: {
|
|
2177
|
+
strapi: {
|
|
2178
|
+
contentType: contentType2
|
|
2179
|
+
}
|
|
2180
|
+
},
|
|
2028
2181
|
args: {},
|
|
2029
|
-
async resolve(parent,
|
|
2030
|
-
const
|
|
2031
|
-
|
|
2032
|
-
|
|
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
|
-
|
|
2041
|
-
return
|
|
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("
|
|
2275
|
+
const isIDFilterEnabled = extension.shadowCRUD(contentType2.uid).field("documentId").hasFiltersEnabeld();
|
|
2129
2276
|
if (contentType2.kind === "collectionType" && isIDFilterEnabled) {
|
|
2130
|
-
t.field("
|
|
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
|
|
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
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
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
|
|
2449
|
+
return strapi2.contentAPI.sanitize.output(dataToSanitize, contentType2, { auth });
|
|
2304
2450
|
};
|
|
2305
2451
|
const unwrapData = fp.get(attributeName);
|
|
2306
|
-
const sanitizeMorphAttribute = utils$2.
|
|
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
|
|
2322
|
-
await
|
|
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
|
|
2471
|
+
const sanitizedQuery = await strapi2.contentAPI.sanitize.query(args2, contentType2, {
|
|
2326
2472
|
auth: ctx?.state?.auth
|
|
2327
2473
|
});
|
|
2328
|
-
return strapi2.
|
|
2474
|
+
return strapi2.documents(uid).findMany({ status: "published", ...sanitizedQuery });
|
|
2329
2475
|
},
|
|
2330
|
-
async
|
|
2331
|
-
await
|
|
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
|
|
2480
|
+
const sanitizedQuery = await strapi2.contentAPI.sanitize.query(args2, contentType2, {
|
|
2335
2481
|
auth: ctx?.state?.auth
|
|
2336
2482
|
});
|
|
2337
|
-
return strapi2.
|
|
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
|
|
2356
|
-
const {
|
|
2357
|
-
await
|
|
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
|
|
2490
|
+
const sanitizedQuery = await strapi2.contentAPI.sanitize.query(args2, contentType2, {
|
|
2361
2491
|
auth: ctx?.state?.auth
|
|
2362
2492
|
});
|
|
2363
|
-
return strapi2.
|
|
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
|
|
2513
|
+
await strapi2.contentAPI.validate.query(transformedArgs, component, {
|
|
2380
2514
|
auth: ctx?.state?.auth
|
|
2381
2515
|
});
|
|
2382
|
-
const sanitizedQuery = await
|
|
2516
|
+
const sanitizedQuery = await strapi2.contentAPI.sanitize.query(transformedArgs, component, {
|
|
2383
2517
|
auth: ctx?.state?.auth
|
|
2384
2518
|
});
|
|
2385
|
-
return strapi2.
|
|
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.
|
|
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 {
|
|
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 (
|
|
2657
|
-
Object.assign(params, {
|
|
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 (
|
|
2664
|
-
Object.assign(params, {
|
|
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,
|