@strapi/plugin-graphql 5.55.1 → 5.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/bootstrap.js +10 -10
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +8 -8
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/format-graphql-error.js +5 -5
- package/dist/server/format-graphql-error.js.map +1 -1
- package/dist/server/format-graphql-error.mjs +4 -4
- package/dist/server/format-graphql-error.mjs.map +1 -1
- package/dist/server/services/builders/dynamic-zones.js +3 -3
- package/dist/server/services/builders/dynamic-zones.js.map +1 -1
- package/dist/server/services/builders/dynamic-zones.mjs +3 -3
- package/dist/server/services/builders/dynamic-zones.mjs.map +1 -1
- package/dist/server/services/builders/entity.js +4 -4
- package/dist/server/services/builders/entity.js.map +1 -1
- package/dist/server/services/builders/entity.mjs +2 -2
- package/dist/server/services/builders/entity.mjs.map +1 -1
- package/dist/server/services/builders/enums.js +2 -2
- package/dist/server/services/builders/enums.js.map +1 -1
- package/dist/server/services/builders/enums.mjs +2 -2
- package/dist/server/services/builders/enums.mjs.map +1 -1
- package/dist/server/services/builders/filters/operators/index.js +3 -3
- package/dist/server/services/builders/filters/operators/index.js.map +1 -1
- package/dist/server/services/builders/filters/operators/index.mjs +3 -3
- package/dist/server/services/builders/filters/operators/index.mjs.map +1 -1
- package/dist/server/services/builders/generic-morph.js +1 -2
- package/dist/server/services/builders/generic-morph.js.map +1 -1
- package/dist/server/services/builders/generic-morph.mjs +1 -2
- package/dist/server/services/builders/generic-morph.mjs.map +1 -1
- package/dist/server/services/builders/index.js +2 -4
- package/dist/server/services/builders/index.js.map +1 -1
- package/dist/server/services/builders/index.mjs +2 -4
- package/dist/server/services/builders/index.mjs.map +1 -1
- package/dist/server/services/builders/relation-response-collection.js +3 -3
- package/dist/server/services/builders/relation-response-collection.js.map +1 -1
- package/dist/server/services/builders/relation-response-collection.mjs +3 -3
- package/dist/server/services/builders/relation-response-collection.mjs.map +1 -1
- package/dist/server/services/builders/resolvers/association.js +3 -3
- package/dist/server/services/builders/resolvers/association.js.map +1 -1
- package/dist/server/services/builders/resolvers/association.mjs +3 -3
- package/dist/server/services/builders/resolvers/association.mjs.map +1 -1
- package/dist/server/services/builders/resolvers/query.js +3 -3
- package/dist/server/services/builders/resolvers/query.js.map +1 -1
- package/dist/server/services/builders/resolvers/query.mjs +3 -3
- package/dist/server/services/builders/resolvers/query.mjs.map +1 -1
- package/dist/server/services/builders/response-collection.js +4 -4
- package/dist/server/services/builders/response-collection.js.map +1 -1
- package/dist/server/services/builders/response-collection.mjs +3 -3
- package/dist/server/services/builders/response-collection.mjs.map +1 -1
- package/dist/server/services/builders/response.js +1 -2
- package/dist/server/services/builders/response.js.map +1 -1
- package/dist/server/services/builders/response.mjs +1 -2
- package/dist/server/services/builders/response.mjs.map +1 -1
- package/dist/server/services/builders/type.js +4 -4
- package/dist/server/services/builders/type.js.map +1 -1
- package/dist/server/services/builders/type.mjs +3 -3
- package/dist/server/services/builders/type.mjs.map +1 -1
- package/dist/server/services/builders/utils.js +6 -6
- package/dist/server/services/builders/utils.js.map +1 -1
- package/dist/server/services/builders/utils.mjs +6 -6
- package/dist/server/services/builders/utils.mjs.map +1 -1
- package/dist/server/services/content-api/index.js +1 -2
- package/dist/server/services/content-api/index.js.map +1 -1
- package/dist/server/services/content-api/index.mjs +1 -2
- package/dist/server/services/content-api/index.mjs.map +1 -1
- package/dist/server/services/content-api/policy.js +2 -3
- package/dist/server/services/content-api/policy.js.map +1 -1
- package/dist/server/services/content-api/policy.mjs +2 -3
- package/dist/server/services/content-api/policy.mjs.map +1 -1
- package/dist/server/services/content-api/wrap-resolvers.js +9 -9
- package/dist/server/services/content-api/wrap-resolvers.js.map +1 -1
- package/dist/server/services/content-api/wrap-resolvers.mjs +9 -9
- package/dist/server/services/content-api/wrap-resolvers.mjs.map +1 -1
- package/dist/server/services/extension/extension.js +3 -3
- package/dist/server/services/extension/extension.js.map +1 -1
- package/dist/server/services/extension/extension.mjs +3 -3
- package/dist/server/services/extension/extension.mjs.map +1 -1
- package/dist/server/services/internals/helpers/get-enabled-scalars.js +2 -2
- package/dist/server/services/internals/helpers/get-enabled-scalars.js.map +1 -1
- package/dist/server/services/internals/helpers/get-enabled-scalars.mjs +1 -1
- package/dist/server/services/internals/helpers/get-enabled-scalars.mjs.map +1 -1
- package/dist/server/services/internals/types/error.js +1 -2
- package/dist/server/services/internals/types/error.js.map +1 -1
- package/dist/server/services/internals/types/error.mjs +1 -2
- package/dist/server/services/internals/types/error.mjs.map +1 -1
- package/dist/server/services/type-registry.js +1 -2
- package/dist/server/services/type-registry.js.map +1 -1
- package/dist/server/services/type-registry.mjs +1 -2
- package/dist/server/services/type-registry.mjs.map +1 -1
- package/dist/server/services/utils/attributes.js +6 -6
- package/dist/server/services/utils/attributes.js.map +1 -1
- package/dist/server/services/utils/attributes.mjs +6 -6
- package/dist/server/services/utils/attributes.mjs.map +1 -1
- package/dist/server/services/utils/mappers/entity-to-response-entity.js +2 -2
- package/dist/server/services/utils/mappers/entity-to-response-entity.js.map +1 -1
- package/dist/server/services/utils/mappers/entity-to-response-entity.mjs +2 -2
- package/dist/server/services/utils/mappers/entity-to-response-entity.mjs.map +1 -1
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.js +5 -5
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.js.map +1 -1
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.mjs +4 -4
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.mjs.map +1 -1
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.js +3 -3
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.js.map +1 -1
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.mjs +3 -3
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.mjs.map +1 -1
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.js +3 -3
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.js.map +1 -1
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.mjs +2 -2
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.mjs.map +1 -1
- package/dist/server/services/utils/naming.js +13 -10
- package/dist/server/services/utils/naming.js.map +1 -1
- package/dist/server/services/utils/naming.mjs +9 -6
- package/dist/server/services/utils/naming.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +128 -13
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/filters/operators/index.d.ts +112 -5
- package/dist/server/src/services/builders/filters/operators/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/generic-morph.d.ts.map +1 -1
- package/dist/server/src/services/builders/index.d.ts +116 -7
- package/dist/server/src/services/builders/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/response.d.ts.map +1 -1
- package/dist/server/src/services/builders/utils.d.ts +3 -1
- package/dist/server/src/services/builders/utils.d.ts.map +1 -1
- package/dist/server/src/services/content-api/index.d.ts.map +1 -1
- package/dist/server/src/services/content-api/policy.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +128 -13
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/internals/types/error.d.ts.map +1 -1
- package/dist/server/src/services/type-registry.d.ts.map +1 -1
- package/dist/server/src/services/utils/index.d.ts +12 -6
- 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 +14 -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-scalar-to-operators.d.ts.map +1 -1
- package/dist/server/src/services/utils/mappers/index.d.ts +12 -6
- package/dist/server/src/services/utils/mappers/index.d.ts.map +1 -1
- package/package.json +16 -16
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var lodash = require('lodash');
|
|
4
4
|
var nexus = require('nexus');
|
|
5
5
|
var utils$1 = require('@strapi/utils');
|
|
6
6
|
|
|
@@ -72,7 +72,7 @@ var utils = (({ strapi })=>{
|
|
|
72
72
|
* Filter an object entries and keep only those whose value is a unique scalar attribute
|
|
73
73
|
*/ getUniqueScalarAttributes (attributes) {
|
|
74
74
|
const { isStrapiScalar } = getService('utils').attributes;
|
|
75
|
-
const uniqueAttributes =
|
|
75
|
+
const uniqueAttributes = Object.entries(attributes ?? {}).filter(([, attribute])=>isStrapiScalar(attribute) && 'unique' in attribute && attribute.unique);
|
|
76
76
|
return Object.fromEntries(uniqueAttributes);
|
|
77
77
|
},
|
|
78
78
|
/**
|
|
@@ -80,11 +80,11 @@ var utils = (({ strapi })=>{
|
|
|
80
80
|
* @param {object} attributes - The attributes object to transform
|
|
81
81
|
* @return {Object<string, string>}
|
|
82
82
|
*/ scalarAttributesToFiltersMap (attributes) {
|
|
83
|
-
return
|
|
83
|
+
return lodash.mapValues(attributes, (attribute)=>{
|
|
84
84
|
const { mappers, naming } = getService('utils');
|
|
85
85
|
const gqlScalar = mappers.strapiScalarToGraphQLScalar(attribute.type);
|
|
86
86
|
return naming.getScalarFilterInputTypeName(gqlScalar);
|
|
87
|
-
}
|
|
87
|
+
});
|
|
88
88
|
},
|
|
89
89
|
/**
|
|
90
90
|
* Apply basic transform to GQL args
|
|
@@ -93,10 +93,10 @@ var utils = (({ strapi })=>{
|
|
|
93
93
|
const { config } = strapi.plugin('graphql');
|
|
94
94
|
const { pagination = {}, filters = {} } = args;
|
|
95
95
|
// Init
|
|
96
|
-
const newArgs =
|
|
96
|
+
const newArgs = lodash.omit(args, [
|
|
97
97
|
'pagination',
|
|
98
98
|
'filters'
|
|
99
|
-
]
|
|
99
|
+
]);
|
|
100
100
|
// Pagination
|
|
101
101
|
if (usePagination) {
|
|
102
102
|
const defaultLimit = config('defaultLimit');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../server/src/services/builders/utils.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../server/src/services/builders/utils.ts"],"sourcesContent":["import { mapValues, omit } from 'lodash';\nimport { idArg, nonNull } from 'nexus';\nimport { hasSort, pagination } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\n\nconst { withDefaultPagination } = pagination;\n\ntype ContentTypeArgsOptions = {\n multiple?: boolean;\n isNested?: boolean;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const { service: getService } = strapi.plugin('graphql');\n\n return {\n getContentTypeArgs(\n contentType: Struct.Schema,\n { multiple = true, isNested = false }: ContentTypeArgsOptions = {}\n ) {\n const { naming } = getService('utils');\n const { args } = getService('internals');\n\n const { modelType } = contentType;\n\n // Components\n if (modelType === 'component') {\n if (!multiple) return {};\n\n return {\n filters: naming.getFiltersInputTypeName(contentType),\n pagination: args.PaginationArg,\n sort: args.SortArg,\n };\n }\n\n const { kind } = contentType;\n\n // On non–D&P roots (e.g. User) these args do not version the parent document, but they\n // are required: association resolvers inherit them into nested D&P relations (see\n // builders/resolvers/association.ts + rootQueryArgsByPath). Omitting them broke\n // draft/published control for populated relations (e.g. github.com/strapi/strapi/issues/25746).\n //\n // Future direction: add `status` / `hasPublishedVersion` / `publicationFilter` to GraphQL args on nested\n // to-many (and to-one) relation fields when the *target* content type has D&P, instead\n // of relying on root-level “context” that is easy to misread (args on User affecting\n // Articles). That would allow different publication settings per relation branch, match\n // how developers think about the graph, and let non-DP roots drop these args if desired.\n // Would require extending getContentTypeArgs(..., { isNested: true }) for D&P targets\n // and teaching association.ts to honor args.publicationFilter on nested fields, not\n // only root inheritance.\n const publicationArgs = {\n status: args.PublicationStatusArg,\n // Deprecated: prefer `publicationFilter` (enum cohorts).\n hasPublishedVersion: args.HasPublishedVersionArg,\n publicationFilter: args.PublicationFilterArg,\n };\n\n // Collection Types\n if (kind === 'collectionType') {\n if (!multiple) {\n return {\n documentId: nonNull(idArg()),\n ...publicationArgs,\n };\n }\n\n const params: Record<string, unknown> = {\n filters: naming.getFiltersInputTypeName(contentType),\n pagination: args.PaginationArg,\n sort: args.SortArg,\n };\n\n if (!isNested) {\n Object.assign(params, publicationArgs);\n }\n\n return params;\n }\n\n // Single Types\n if (kind === 'singleType') {\n const params: Record<string, unknown> = {};\n\n if (!isNested) {\n Object.assign(params, publicationArgs);\n }\n\n return params;\n }\n },\n\n /**\n * Filter an object entries and keep only those whose value is a unique scalar attribute\n */\n getUniqueScalarAttributes(attributes: Struct.SchemaAttributes) {\n const { isStrapiScalar } = getService('utils').attributes;\n\n const uniqueAttributes = Object.entries(attributes ?? {}).filter(\n ([, attribute]) => isStrapiScalar(attribute) && 'unique' in attribute && attribute.unique\n );\n\n return Object.fromEntries(uniqueAttributes);\n },\n\n /**\n * Map each value from an attribute to a FiltersInput type name\n * @param {object} attributes - The attributes object to transform\n * @return {Object<string, string>}\n */\n scalarAttributesToFiltersMap(attributes: Struct.SchemaAttributes) {\n return mapValues(attributes, (attribute) => {\n const { mappers, naming } = getService('utils');\n\n const gqlScalar = mappers.strapiScalarToGraphQLScalar(attribute.type);\n\n return naming.getScalarFilterInputTypeName(gqlScalar);\n });\n },\n\n /**\n * Apply basic transform to GQL args\n */\n transformArgs(\n args: any,\n {\n contentType,\n usePagination = false,\n }: { contentType: Struct.ContentTypeSchema; usePagination?: boolean }\n ) {\n const { mappers } = getService('utils');\n const { config } = strapi.plugin('graphql');\n const { pagination = {}, filters = {} } = args;\n\n // Init\n const newArgs = omit(args, ['pagination', 'filters']);\n\n // Pagination\n if (usePagination) {\n const defaultLimit: number = config('defaultLimit');\n const maxLimit: number = config('maxLimit');\n\n Object.assign(\n newArgs,\n withDefaultPagination(pagination, {\n maxLimit,\n defaults: {\n offset: { limit: defaultLimit },\n page: { pageSize: defaultLimit },\n },\n })\n );\n }\n\n // Filters\n if (args.filters) {\n Object.assign(newArgs, {\n filters: mappers.graphQLFiltersToStrapiQuery(filters, contentType),\n });\n }\n\n // GraphQL SortArg defaults to `[]`; omit meaningless sort so join-table UI order is preserved.\n if (!hasSort(newArgs.sort)) {\n delete newArgs.sort;\n }\n\n return newArgs;\n },\n };\n};\n"],"names":["withDefaultPagination","pagination","strapi","service","getService","plugin","getContentTypeArgs","contentType","multiple","isNested","naming","args","modelType","filters","getFiltersInputTypeName","PaginationArg","sort","SortArg","kind","publicationArgs","status","PublicationStatusArg","hasPublishedVersion","HasPublishedVersionArg","publicationFilter","PublicationFilterArg","documentId","nonNull","idArg","params","Object","assign","getUniqueScalarAttributes","attributes","isStrapiScalar","uniqueAttributes","entries","filter","attribute","unique","fromEntries","scalarAttributesToFiltersMap","mapValues","mappers","gqlScalar","strapiScalarToGraphQLScalar","type","getScalarFilterInputTypeName","transformArgs","usePagination","config","newArgs","omit","defaultLimit","maxLimit","defaults","offset","limit","page","pageSize","graphQLFiltersToStrapiQuery","hasSort"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { omit, mapValues
|
|
1
|
+
import { omit, mapValues } from 'lodash';
|
|
2
2
|
import { nonNull, idArg } from 'nexus';
|
|
3
3
|
import { pagination, hasSort } from '@strapi/utils';
|
|
4
4
|
|
|
@@ -70,7 +70,7 @@ var utils = (({ strapi })=>{
|
|
|
70
70
|
* Filter an object entries and keep only those whose value is a unique scalar attribute
|
|
71
71
|
*/ getUniqueScalarAttributes (attributes) {
|
|
72
72
|
const { isStrapiScalar } = getService('utils').attributes;
|
|
73
|
-
const uniqueAttributes = entries(attributes).filter(([, attribute])=>isStrapiScalar(attribute) && 'unique' in attribute && attribute.unique);
|
|
73
|
+
const uniqueAttributes = Object.entries(attributes ?? {}).filter(([, attribute])=>isStrapiScalar(attribute) && 'unique' in attribute && attribute.unique);
|
|
74
74
|
return Object.fromEntries(uniqueAttributes);
|
|
75
75
|
},
|
|
76
76
|
/**
|
|
@@ -78,11 +78,11 @@ var utils = (({ strapi })=>{
|
|
|
78
78
|
* @param {object} attributes - The attributes object to transform
|
|
79
79
|
* @return {Object<string, string>}
|
|
80
80
|
*/ scalarAttributesToFiltersMap (attributes) {
|
|
81
|
-
return mapValues((attribute)=>{
|
|
81
|
+
return mapValues(attributes, (attribute)=>{
|
|
82
82
|
const { mappers, naming } = getService('utils');
|
|
83
83
|
const gqlScalar = mappers.strapiScalarToGraphQLScalar(attribute.type);
|
|
84
84
|
return naming.getScalarFilterInputTypeName(gqlScalar);
|
|
85
|
-
}
|
|
85
|
+
});
|
|
86
86
|
},
|
|
87
87
|
/**
|
|
88
88
|
* Apply basic transform to GQL args
|
|
@@ -91,10 +91,10 @@ var utils = (({ strapi })=>{
|
|
|
91
91
|
const { config } = strapi.plugin('graphql');
|
|
92
92
|
const { pagination = {}, filters = {} } = args;
|
|
93
93
|
// Init
|
|
94
|
-
const newArgs = omit([
|
|
94
|
+
const newArgs = omit(args, [
|
|
95
95
|
'pagination',
|
|
96
96
|
'filters'
|
|
97
|
-
]
|
|
97
|
+
]);
|
|
98
98
|
// Pagination
|
|
99
99
|
if (usePagination) {
|
|
100
100
|
const defaultLimit = config('defaultLimit');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","sources":["../../../../server/src/services/builders/utils.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"utils.mjs","sources":["../../../../server/src/services/builders/utils.ts"],"sourcesContent":["import { mapValues, omit } from 'lodash';\nimport { idArg, nonNull } from 'nexus';\nimport { hasSort, pagination } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\n\nconst { withDefaultPagination } = pagination;\n\ntype ContentTypeArgsOptions = {\n multiple?: boolean;\n isNested?: boolean;\n};\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const { service: getService } = strapi.plugin('graphql');\n\n return {\n getContentTypeArgs(\n contentType: Struct.Schema,\n { multiple = true, isNested = false }: ContentTypeArgsOptions = {}\n ) {\n const { naming } = getService('utils');\n const { args } = getService('internals');\n\n const { modelType } = contentType;\n\n // Components\n if (modelType === 'component') {\n if (!multiple) return {};\n\n return {\n filters: naming.getFiltersInputTypeName(contentType),\n pagination: args.PaginationArg,\n sort: args.SortArg,\n };\n }\n\n const { kind } = contentType;\n\n // On non–D&P roots (e.g. User) these args do not version the parent document, but they\n // are required: association resolvers inherit them into nested D&P relations (see\n // builders/resolvers/association.ts + rootQueryArgsByPath). Omitting them broke\n // draft/published control for populated relations (e.g. github.com/strapi/strapi/issues/25746).\n //\n // Future direction: add `status` / `hasPublishedVersion` / `publicationFilter` to GraphQL args on nested\n // to-many (and to-one) relation fields when the *target* content type has D&P, instead\n // of relying on root-level “context” that is easy to misread (args on User affecting\n // Articles). That would allow different publication settings per relation branch, match\n // how developers think about the graph, and let non-DP roots drop these args if desired.\n // Would require extending getContentTypeArgs(..., { isNested: true }) for D&P targets\n // and teaching association.ts to honor args.publicationFilter on nested fields, not\n // only root inheritance.\n const publicationArgs = {\n status: args.PublicationStatusArg,\n // Deprecated: prefer `publicationFilter` (enum cohorts).\n hasPublishedVersion: args.HasPublishedVersionArg,\n publicationFilter: args.PublicationFilterArg,\n };\n\n // Collection Types\n if (kind === 'collectionType') {\n if (!multiple) {\n return {\n documentId: nonNull(idArg()),\n ...publicationArgs,\n };\n }\n\n const params: Record<string, unknown> = {\n filters: naming.getFiltersInputTypeName(contentType),\n pagination: args.PaginationArg,\n sort: args.SortArg,\n };\n\n if (!isNested) {\n Object.assign(params, publicationArgs);\n }\n\n return params;\n }\n\n // Single Types\n if (kind === 'singleType') {\n const params: Record<string, unknown> = {};\n\n if (!isNested) {\n Object.assign(params, publicationArgs);\n }\n\n return params;\n }\n },\n\n /**\n * Filter an object entries and keep only those whose value is a unique scalar attribute\n */\n getUniqueScalarAttributes(attributes: Struct.SchemaAttributes) {\n const { isStrapiScalar } = getService('utils').attributes;\n\n const uniqueAttributes = Object.entries(attributes ?? {}).filter(\n ([, attribute]) => isStrapiScalar(attribute) && 'unique' in attribute && attribute.unique\n );\n\n return Object.fromEntries(uniqueAttributes);\n },\n\n /**\n * Map each value from an attribute to a FiltersInput type name\n * @param {object} attributes - The attributes object to transform\n * @return {Object<string, string>}\n */\n scalarAttributesToFiltersMap(attributes: Struct.SchemaAttributes) {\n return mapValues(attributes, (attribute) => {\n const { mappers, naming } = getService('utils');\n\n const gqlScalar = mappers.strapiScalarToGraphQLScalar(attribute.type);\n\n return naming.getScalarFilterInputTypeName(gqlScalar);\n });\n },\n\n /**\n * Apply basic transform to GQL args\n */\n transformArgs(\n args: any,\n {\n contentType,\n usePagination = false,\n }: { contentType: Struct.ContentTypeSchema; usePagination?: boolean }\n ) {\n const { mappers } = getService('utils');\n const { config } = strapi.plugin('graphql');\n const { pagination = {}, filters = {} } = args;\n\n // Init\n const newArgs = omit(args, ['pagination', 'filters']);\n\n // Pagination\n if (usePagination) {\n const defaultLimit: number = config('defaultLimit');\n const maxLimit: number = config('maxLimit');\n\n Object.assign(\n newArgs,\n withDefaultPagination(pagination, {\n maxLimit,\n defaults: {\n offset: { limit: defaultLimit },\n page: { pageSize: defaultLimit },\n },\n })\n );\n }\n\n // Filters\n if (args.filters) {\n Object.assign(newArgs, {\n filters: mappers.graphQLFiltersToStrapiQuery(filters, contentType),\n });\n }\n\n // GraphQL SortArg defaults to `[]`; omit meaningless sort so join-table UI order is preserved.\n if (!hasSort(newArgs.sort)) {\n delete newArgs.sort;\n }\n\n return newArgs;\n },\n };\n};\n"],"names":["withDefaultPagination","pagination","strapi","service","getService","plugin","getContentTypeArgs","contentType","multiple","isNested","naming","args","modelType","filters","getFiltersInputTypeName","PaginationArg","sort","SortArg","kind","publicationArgs","status","PublicationStatusArg","hasPublishedVersion","HasPublishedVersionArg","publicationFilter","PublicationFilterArg","documentId","nonNull","idArg","params","Object","assign","getUniqueScalarAttributes","attributes","isStrapiScalar","uniqueAttributes","entries","filter","attribute","unique","fromEntries","scalarAttributesToFiltersMap","mapValues","mappers","gqlScalar","strapiScalarToGraphQLScalar","type","getScalarFilterInputTypeName","transformArgs","usePagination","config","newArgs","omit","defaultLimit","maxLimit","defaults","offset","limit","page","pageSize","graphQLFiltersToStrapiQuery","hasSort"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var utils = require('@graphql-tools/utils');
|
|
4
4
|
var nexus = require('nexus');
|
|
5
|
-
var fp = require('lodash/fp');
|
|
6
5
|
var wrapResolvers = require('./wrap-resolvers.js');
|
|
7
6
|
var collectionType = require('./register-functions/collection-type.js');
|
|
8
7
|
var singleType = require('./register-functions/single-type.js');
|
|
@@ -138,7 +137,7 @@ var contentAPI = (({ strapi })=>{
|
|
|
138
137
|
...Object.values(strapi.contentTypes)
|
|
139
138
|
];
|
|
140
139
|
// Disable Shadow CRUD for admin content types
|
|
141
|
-
contentTypes.map(
|
|
140
|
+
contentTypes.map((contentType)=>contentType.uid).filter((uid)=>uid.startsWith('admin::')).forEach((uid)=>extensionService.shadowCRUD(uid).disable());
|
|
142
141
|
const contentTypesWithShadowCRUD = contentTypes.filter((ct)=>extensionService.shadowCRUD(ct.uid).isEnabled());
|
|
143
142
|
// Generate and register definitions for every content type
|
|
144
143
|
registerAPITypes(contentTypesWithShadowCRUD);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../server/src/services/content-api/index.ts"],"sourcesContent":["import { pruneSchema } from '@graphql-tools/utils';\nimport { makeSchema } from 'nexus';\nimport { prop, startsWith } from 'lodash/fp';\nimport type * as Nexus from 'nexus';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { wrapResolvers } from './wrap-resolvers';\nimport {\n registerSingleType,\n registerCollectionType,\n registerComponent,\n registerScalars,\n registerInternals,\n registerPolymorphicContentType,\n registerEnumsDefinition,\n registerInputsDefinition,\n registerFiltersDefinition,\n registerDynamicZonesDefinition,\n} from './register-functions';\nimport { TypeRegistry } from '../type-registry';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { mergeSchemas, addResolversToSchema } = require('@graphql-tools/schema');\n\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { config } = strapi.plugin('graphql');\n\n const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');\n const extensionService = getGraphQLService('extension');\n\n // Type Registry\n let registry: any;\n // Builders Instances\n let builders: any;\n // Cached set of built-in query fields (populated at bootstrap)\n let builtInQueryFields: Set<string> = new Set();\n\n const buildSchema = () => {\n const isShadowCRUDEnabled = !!config('shadowCRUD');\n\n // Create a new empty type registry\n registry = getGraphQLService('type-registry').new();\n\n // Reset the builders instances associated to the\n // content-api, and link the new type registry\n builders = getGraphQLService('builders').new('content-api', registry);\n\n registerScalars({ registry, strapi });\n registerInternals({ registry, strapi });\n\n if (isShadowCRUDEnabled) {\n shadowCRUD();\n }\n\n // Build a merged schema from both Nexus types & SDL type definitions\n const schema = buildMergedSchema({ registry });\n\n // Generate the extension configuration for the content API.\n // This extension instance needs to be generated after the Nexus schema's\n // generation, so that configurations created during types definitions\n // can be registered before being used in the wrap resolvers operation\n const extension = extensionService.generate({ typeRegistry: registry });\n\n // Add the extension's resolvers to the final schema\n const schemaWithResolvers = addResolversToSchema({\n schema,\n resolvers: extension.resolvers,\n });\n\n // Create a configuration object for the artifacts generation\n const outputs: Nexus.core.SchemaConfig['outputs'] = {\n schema: config('artifacts.schema', false),\n typegen: config('artifacts.typegen', false),\n };\n\n const currentEnv = strapi.config.get('environment');\n\n const nexusSchema = makeSchema({\n types: [],\n // Build the schema from the merged GraphQL schema.\n // Since we're passing the schema to the mergeSchema property, it'll transform our SDL type definitions\n // into Nexus type definition, thus allowing them to be handled by Nexus plugins & other processing\n mergeSchema: { schema: schemaWithResolvers },\n\n // Apply user-defined plugins\n plugins: extension.plugins,\n\n // Whether to generate artifacts (GraphQL schema, TS types definitions) or not.\n // By default, we generate artifacts only on development environment\n shouldGenerateArtifacts: config('generateArtifacts', currentEnv === 'development'),\n\n // Artifacts generation configuration\n outputs,\n });\n\n // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension\n const wrappedNexusSchema = wrapResolvers({ schema: nexusSchema, strapi, extension });\n\n // Prune schema, remove unused types\n // eg: removes registered subscriptions if they're disabled in the config)\n const prunedNexusSchema = pruneSchema(wrappedNexusSchema);\n\n return prunedNexusSchema;\n };\n\n const getBuiltInQueryFields = () => builtInQueryFields;\n\n const isBuiltInQueryField = (fieldName: string) =>\n builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');\n\n const buildMergedSchema = ({ registry }: { registry: TypeRegistry }) => {\n // Capture the built-in (shadow CRUD) query fields from a schema built with only the\n // registry's own types, before any extension-registered types/typeDefs are merged in,\n // so isBuiltInQueryField can tell shadow CRUD fields apart from custom extension resolvers.\n const shadowCRUDSchema = makeSchema({ types: [registry.definitions] });\n const shadowCRUDQueryFields = shadowCRUDSchema.getQueryType()?.getFields() ?? {};\n builtInQueryFields = new Set(Object.keys(shadowCRUDQueryFields));\n\n // Here we extract types, plugins & typeDefs from a temporary generated\n // extension since there won't be any addition allowed after schemas generation\n const { types, typeDefs = [] } = extensionService.generate({ typeRegistry: registry });\n\n // Nexus schema built with user-defined & shadow CRUD auto generated Nexus types\n const nexusSchema = makeSchema({ types: [registry.definitions, types] });\n\n // Merge type definitions with the Nexus schema\n return mergeSchemas({\n typeDefs,\n // Give access to the shadowCRUD & nexus based types\n // Note: This is necessary so that types defined in SDL can reference types defined with Nexus\n schemas: [nexusSchema],\n });\n };\n\n const shadowCRUD = () => {\n const extensionService = getGraphQLService('extension');\n\n // Get every content type & component defined in Strapi\n const contentTypes = [\n ...Object.values(strapi.components),\n ...Object.values(strapi.contentTypes),\n ];\n\n // Disable Shadow CRUD for admin content types\n contentTypes\n .map(prop('uid'))\n .filter(startsWith('admin::'))\n .forEach((uid) => extensionService.shadowCRUD(uid).disable());\n\n const contentTypesWithShadowCRUD = contentTypes.filter((ct) =>\n extensionService.shadowCRUD(ct.uid).isEnabled()\n );\n\n // Generate and register definitions for every content type\n registerAPITypes(contentTypesWithShadowCRUD);\n\n // Generate and register polymorphic types' definitions\n registerMorphTypes(contentTypesWithShadowCRUD);\n };\n\n /**\n * Register needed GraphQL types for every content type\n * @param {object[]} contentTypes\n */\n const registerAPITypes = (contentTypes: Struct.Schema[]) => {\n for (const contentType of contentTypes) {\n const { modelType } = contentType;\n\n const registerOptions = { registry, strapi, builders };\n\n // Generate various types associated to the content type\n // (enums, dynamic-zones, filters, inputs...)\n registerEnumsDefinition(contentType, registerOptions);\n registerDynamicZonesDefinition(contentType, registerOptions);\n registerFiltersDefinition(contentType, registerOptions);\n registerInputsDefinition(contentType, registerOptions);\n\n // Generate & register component's definition\n if (modelType === 'component') {\n registerComponent(contentType, registerOptions);\n continue;\n }\n\n const { kind } = contentType;\n\n // Generate & register single type's definition\n if (kind === 'singleType') {\n registerSingleType(contentType, registerOptions);\n }\n\n // Generate & register collection type's definition\n else if (kind === 'collectionType') {\n registerCollectionType(contentType, registerOptions);\n }\n }\n };\n\n const registerMorphTypes = (contentTypes: Struct.Schema[]) => {\n // Create & register a union type that includes every type or component registered\n const genericMorphType = builders.buildGenericMorphDefinition();\n registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph });\n\n for (const contentType of contentTypes) {\n registerPolymorphicContentType(contentType, { registry, strapi });\n }\n };\n\n return { buildSchema, getBuiltInQueryFields, isBuiltInQueryField };\n};\n"],"names":["strapi","mergeSchemas","addResolversToSchema","require","service","getGraphQLService","plugin","config","KINDS","GENERIC_MORPH_TYPENAME","extensionService","registry","builders","builtInQueryFields","Set","buildSchema","isShadowCRUDEnabled","new","registerScalars","registerInternals","shadowCRUD","schema","buildMergedSchema","extension","generate","typeRegistry","schemaWithResolvers","resolvers","outputs","typegen","currentEnv","get","nexusSchema","makeSchema","types","mergeSchema","plugins","shouldGenerateArtifacts","wrappedNexusSchema","wrapResolvers","prunedNexusSchema","pruneSchema","getBuiltInQueryFields","isBuiltInQueryField","fieldName","has","endsWith","shadowCRUDSchema","definitions","shadowCRUDQueryFields","getQueryType","getFields","Object","keys","typeDefs","schemas","contentTypes","values","components","map","prop","filter","startsWith","forEach","uid","disable","contentTypesWithShadowCRUD","ct","isEnabled","registerAPITypes","registerMorphTypes","contentType","modelType","registerOptions","registerEnumsDefinition","registerDynamicZonesDefinition","registerFiltersDefinition","registerInputsDefinition","registerComponent","kind","registerSingleType","registerCollectionType","genericMorphType","buildGenericMorphDefinition","register","morph","registerPolymorphicContentType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../server/src/services/content-api/index.ts"],"sourcesContent":["import { pruneSchema } from '@graphql-tools/utils';\nimport { makeSchema } from 'nexus';\nimport type * as Nexus from 'nexus';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { wrapResolvers } from './wrap-resolvers';\nimport {\n registerSingleType,\n registerCollectionType,\n registerComponent,\n registerScalars,\n registerInternals,\n registerPolymorphicContentType,\n registerEnumsDefinition,\n registerInputsDefinition,\n registerFiltersDefinition,\n registerDynamicZonesDefinition,\n} from './register-functions';\nimport { TypeRegistry } from '../type-registry';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { mergeSchemas, addResolversToSchema } = require('@graphql-tools/schema');\n\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { config } = strapi.plugin('graphql');\n\n const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');\n const extensionService = getGraphQLService('extension');\n\n // Type Registry\n let registry: any;\n // Builders Instances\n let builders: any;\n // Cached set of built-in query fields (populated at bootstrap)\n let builtInQueryFields: Set<string> = new Set();\n\n const buildSchema = () => {\n const isShadowCRUDEnabled = !!config('shadowCRUD');\n\n // Create a new empty type registry\n registry = getGraphQLService('type-registry').new();\n\n // Reset the builders instances associated to the\n // content-api, and link the new type registry\n builders = getGraphQLService('builders').new('content-api', registry);\n\n registerScalars({ registry, strapi });\n registerInternals({ registry, strapi });\n\n if (isShadowCRUDEnabled) {\n shadowCRUD();\n }\n\n // Build a merged schema from both Nexus types & SDL type definitions\n const schema = buildMergedSchema({ registry });\n\n // Generate the extension configuration for the content API.\n // This extension instance needs to be generated after the Nexus schema's\n // generation, so that configurations created during types definitions\n // can be registered before being used in the wrap resolvers operation\n const extension = extensionService.generate({ typeRegistry: registry });\n\n // Add the extension's resolvers to the final schema\n const schemaWithResolvers = addResolversToSchema({\n schema,\n resolvers: extension.resolvers,\n });\n\n // Create a configuration object for the artifacts generation\n const outputs: Nexus.core.SchemaConfig['outputs'] = {\n schema: config('artifacts.schema', false),\n typegen: config('artifacts.typegen', false),\n };\n\n const currentEnv = strapi.config.get('environment');\n\n const nexusSchema = makeSchema({\n types: [],\n // Build the schema from the merged GraphQL schema.\n // Since we're passing the schema to the mergeSchema property, it'll transform our SDL type definitions\n // into Nexus type definition, thus allowing them to be handled by Nexus plugins & other processing\n mergeSchema: { schema: schemaWithResolvers },\n\n // Apply user-defined plugins\n plugins: extension.plugins,\n\n // Whether to generate artifacts (GraphQL schema, TS types definitions) or not.\n // By default, we generate artifacts only on development environment\n shouldGenerateArtifacts: config('generateArtifacts', currentEnv === 'development'),\n\n // Artifacts generation configuration\n outputs,\n });\n\n // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension\n const wrappedNexusSchema = wrapResolvers({ schema: nexusSchema, strapi, extension });\n\n // Prune schema, remove unused types\n // eg: removes registered subscriptions if they're disabled in the config)\n const prunedNexusSchema = pruneSchema(wrappedNexusSchema);\n\n return prunedNexusSchema;\n };\n\n const getBuiltInQueryFields = () => builtInQueryFields;\n\n const isBuiltInQueryField = (fieldName: string) =>\n builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');\n\n const buildMergedSchema = ({ registry }: { registry: TypeRegistry }) => {\n // Capture the built-in (shadow CRUD) query fields from a schema built with only the\n // registry's own types, before any extension-registered types/typeDefs are merged in,\n // so isBuiltInQueryField can tell shadow CRUD fields apart from custom extension resolvers.\n const shadowCRUDSchema = makeSchema({ types: [registry.definitions] });\n const shadowCRUDQueryFields = shadowCRUDSchema.getQueryType()?.getFields() ?? {};\n builtInQueryFields = new Set(Object.keys(shadowCRUDQueryFields));\n\n // Here we extract types, plugins & typeDefs from a temporary generated\n // extension since there won't be any addition allowed after schemas generation\n const { types, typeDefs = [] } = extensionService.generate({ typeRegistry: registry });\n\n // Nexus schema built with user-defined & shadow CRUD auto generated Nexus types\n const nexusSchema = makeSchema({ types: [registry.definitions, types] });\n\n // Merge type definitions with the Nexus schema\n return mergeSchemas({\n typeDefs,\n // Give access to the shadowCRUD & nexus based types\n // Note: This is necessary so that types defined in SDL can reference types defined with Nexus\n schemas: [nexusSchema],\n });\n };\n\n const shadowCRUD = () => {\n const extensionService = getGraphQLService('extension');\n\n // Get every content type & component defined in Strapi\n const contentTypes = [\n ...Object.values(strapi.components),\n ...Object.values(strapi.contentTypes),\n ];\n\n // Disable Shadow CRUD for admin content types\n contentTypes\n .map((contentType) => contentType.uid)\n .filter((uid) => uid.startsWith('admin::'))\n .forEach((uid) => extensionService.shadowCRUD(uid).disable());\n\n const contentTypesWithShadowCRUD = contentTypes.filter((ct) =>\n extensionService.shadowCRUD(ct.uid).isEnabled()\n );\n\n // Generate and register definitions for every content type\n registerAPITypes(contentTypesWithShadowCRUD);\n\n // Generate and register polymorphic types' definitions\n registerMorphTypes(contentTypesWithShadowCRUD);\n };\n\n /**\n * Register needed GraphQL types for every content type\n * @param {object[]} contentTypes\n */\n const registerAPITypes = (contentTypes: Struct.Schema[]) => {\n for (const contentType of contentTypes) {\n const { modelType } = contentType;\n\n const registerOptions = { registry, strapi, builders };\n\n // Generate various types associated to the content type\n // (enums, dynamic-zones, filters, inputs...)\n registerEnumsDefinition(contentType, registerOptions);\n registerDynamicZonesDefinition(contentType, registerOptions);\n registerFiltersDefinition(contentType, registerOptions);\n registerInputsDefinition(contentType, registerOptions);\n\n // Generate & register component's definition\n if (modelType === 'component') {\n registerComponent(contentType, registerOptions);\n continue;\n }\n\n const { kind } = contentType;\n\n // Generate & register single type's definition\n if (kind === 'singleType') {\n registerSingleType(contentType, registerOptions);\n }\n\n // Generate & register collection type's definition\n else if (kind === 'collectionType') {\n registerCollectionType(contentType, registerOptions);\n }\n }\n };\n\n const registerMorphTypes = (contentTypes: Struct.Schema[]) => {\n // Create & register a union type that includes every type or component registered\n const genericMorphType = builders.buildGenericMorphDefinition();\n registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph });\n\n for (const contentType of contentTypes) {\n registerPolymorphicContentType(contentType, { registry, strapi });\n }\n };\n\n return { buildSchema, getBuiltInQueryFields, isBuiltInQueryField };\n};\n"],"names":["strapi","mergeSchemas","addResolversToSchema","require","service","getGraphQLService","plugin","config","KINDS","GENERIC_MORPH_TYPENAME","extensionService","registry","builders","builtInQueryFields","Set","buildSchema","isShadowCRUDEnabled","new","registerScalars","registerInternals","shadowCRUD","schema","buildMergedSchema","extension","generate","typeRegistry","schemaWithResolvers","resolvers","outputs","typegen","currentEnv","get","nexusSchema","makeSchema","types","mergeSchema","plugins","shouldGenerateArtifacts","wrappedNexusSchema","wrapResolvers","prunedNexusSchema","pruneSchema","getBuiltInQueryFields","isBuiltInQueryField","fieldName","has","endsWith","shadowCRUDSchema","definitions","shadowCRUDQueryFields","getQueryType","getFields","Object","keys","typeDefs","schemas","contentTypes","values","components","map","contentType","uid","filter","startsWith","forEach","disable","contentTypesWithShadowCRUD","ct","isEnabled","registerAPITypes","registerMorphTypes","modelType","registerOptions","registerEnumsDefinition","registerDynamicZonesDefinition","registerFiltersDefinition","registerInputsDefinition","registerComponent","kind","registerSingleType","registerCollectionType","genericMorphType","buildGenericMorphDefinition","register","morph","registerPolymorphicContentType"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { pruneSchema } from '@graphql-tools/utils';
|
|
2
2
|
import { makeSchema } from 'nexus';
|
|
3
|
-
import { prop, startsWith } from 'lodash/fp';
|
|
4
3
|
import { wrapResolvers } from './wrap-resolvers.mjs';
|
|
5
4
|
import { registerCollectionType } from './register-functions/collection-type.mjs';
|
|
6
5
|
import { registerSingleType } from './register-functions/single-type.mjs';
|
|
@@ -136,7 +135,7 @@ var contentAPI = (({ strapi })=>{
|
|
|
136
135
|
...Object.values(strapi.contentTypes)
|
|
137
136
|
];
|
|
138
137
|
// Disable Shadow CRUD for admin content types
|
|
139
|
-
contentTypes.map(
|
|
138
|
+
contentTypes.map((contentType)=>contentType.uid).filter((uid)=>uid.startsWith('admin::')).forEach((uid)=>extensionService.shadowCRUD(uid).disable());
|
|
140
139
|
const contentTypesWithShadowCRUD = contentTypes.filter((ct)=>extensionService.shadowCRUD(ct.uid).isEnabled());
|
|
141
140
|
// Generate and register definitions for every content type
|
|
142
141
|
registerAPITypes(contentTypesWithShadowCRUD);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../server/src/services/content-api/index.ts"],"sourcesContent":["import { pruneSchema } from '@graphql-tools/utils';\nimport { makeSchema } from 'nexus';\nimport { prop, startsWith } from 'lodash/fp';\nimport type * as Nexus from 'nexus';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { wrapResolvers } from './wrap-resolvers';\nimport {\n registerSingleType,\n registerCollectionType,\n registerComponent,\n registerScalars,\n registerInternals,\n registerPolymorphicContentType,\n registerEnumsDefinition,\n registerInputsDefinition,\n registerFiltersDefinition,\n registerDynamicZonesDefinition,\n} from './register-functions';\nimport { TypeRegistry } from '../type-registry';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { mergeSchemas, addResolversToSchema } = require('@graphql-tools/schema');\n\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { config } = strapi.plugin('graphql');\n\n const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');\n const extensionService = getGraphQLService('extension');\n\n // Type Registry\n let registry: any;\n // Builders Instances\n let builders: any;\n // Cached set of built-in query fields (populated at bootstrap)\n let builtInQueryFields: Set<string> = new Set();\n\n const buildSchema = () => {\n const isShadowCRUDEnabled = !!config('shadowCRUD');\n\n // Create a new empty type registry\n registry = getGraphQLService('type-registry').new();\n\n // Reset the builders instances associated to the\n // content-api, and link the new type registry\n builders = getGraphQLService('builders').new('content-api', registry);\n\n registerScalars({ registry, strapi });\n registerInternals({ registry, strapi });\n\n if (isShadowCRUDEnabled) {\n shadowCRUD();\n }\n\n // Build a merged schema from both Nexus types & SDL type definitions\n const schema = buildMergedSchema({ registry });\n\n // Generate the extension configuration for the content API.\n // This extension instance needs to be generated after the Nexus schema's\n // generation, so that configurations created during types definitions\n // can be registered before being used in the wrap resolvers operation\n const extension = extensionService.generate({ typeRegistry: registry });\n\n // Add the extension's resolvers to the final schema\n const schemaWithResolvers = addResolversToSchema({\n schema,\n resolvers: extension.resolvers,\n });\n\n // Create a configuration object for the artifacts generation\n const outputs: Nexus.core.SchemaConfig['outputs'] = {\n schema: config('artifacts.schema', false),\n typegen: config('artifacts.typegen', false),\n };\n\n const currentEnv = strapi.config.get('environment');\n\n const nexusSchema = makeSchema({\n types: [],\n // Build the schema from the merged GraphQL schema.\n // Since we're passing the schema to the mergeSchema property, it'll transform our SDL type definitions\n // into Nexus type definition, thus allowing them to be handled by Nexus plugins & other processing\n mergeSchema: { schema: schemaWithResolvers },\n\n // Apply user-defined plugins\n plugins: extension.plugins,\n\n // Whether to generate artifacts (GraphQL schema, TS types definitions) or not.\n // By default, we generate artifacts only on development environment\n shouldGenerateArtifacts: config('generateArtifacts', currentEnv === 'development'),\n\n // Artifacts generation configuration\n outputs,\n });\n\n // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension\n const wrappedNexusSchema = wrapResolvers({ schema: nexusSchema, strapi, extension });\n\n // Prune schema, remove unused types\n // eg: removes registered subscriptions if they're disabled in the config)\n const prunedNexusSchema = pruneSchema(wrappedNexusSchema);\n\n return prunedNexusSchema;\n };\n\n const getBuiltInQueryFields = () => builtInQueryFields;\n\n const isBuiltInQueryField = (fieldName: string) =>\n builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');\n\n const buildMergedSchema = ({ registry }: { registry: TypeRegistry }) => {\n // Capture the built-in (shadow CRUD) query fields from a schema built with only the\n // registry's own types, before any extension-registered types/typeDefs are merged in,\n // so isBuiltInQueryField can tell shadow CRUD fields apart from custom extension resolvers.\n const shadowCRUDSchema = makeSchema({ types: [registry.definitions] });\n const shadowCRUDQueryFields = shadowCRUDSchema.getQueryType()?.getFields() ?? {};\n builtInQueryFields = new Set(Object.keys(shadowCRUDQueryFields));\n\n // Here we extract types, plugins & typeDefs from a temporary generated\n // extension since there won't be any addition allowed after schemas generation\n const { types, typeDefs = [] } = extensionService.generate({ typeRegistry: registry });\n\n // Nexus schema built with user-defined & shadow CRUD auto generated Nexus types\n const nexusSchema = makeSchema({ types: [registry.definitions, types] });\n\n // Merge type definitions with the Nexus schema\n return mergeSchemas({\n typeDefs,\n // Give access to the shadowCRUD & nexus based types\n // Note: This is necessary so that types defined in SDL can reference types defined with Nexus\n schemas: [nexusSchema],\n });\n };\n\n const shadowCRUD = () => {\n const extensionService = getGraphQLService('extension');\n\n // Get every content type & component defined in Strapi\n const contentTypes = [\n ...Object.values(strapi.components),\n ...Object.values(strapi.contentTypes),\n ];\n\n // Disable Shadow CRUD for admin content types\n contentTypes\n .map(prop('uid'))\n .filter(startsWith('admin::'))\n .forEach((uid) => extensionService.shadowCRUD(uid).disable());\n\n const contentTypesWithShadowCRUD = contentTypes.filter((ct) =>\n extensionService.shadowCRUD(ct.uid).isEnabled()\n );\n\n // Generate and register definitions for every content type\n registerAPITypes(contentTypesWithShadowCRUD);\n\n // Generate and register polymorphic types' definitions\n registerMorphTypes(contentTypesWithShadowCRUD);\n };\n\n /**\n * Register needed GraphQL types for every content type\n * @param {object[]} contentTypes\n */\n const registerAPITypes = (contentTypes: Struct.Schema[]) => {\n for (const contentType of contentTypes) {\n const { modelType } = contentType;\n\n const registerOptions = { registry, strapi, builders };\n\n // Generate various types associated to the content type\n // (enums, dynamic-zones, filters, inputs...)\n registerEnumsDefinition(contentType, registerOptions);\n registerDynamicZonesDefinition(contentType, registerOptions);\n registerFiltersDefinition(contentType, registerOptions);\n registerInputsDefinition(contentType, registerOptions);\n\n // Generate & register component's definition\n if (modelType === 'component') {\n registerComponent(contentType, registerOptions);\n continue;\n }\n\n const { kind } = contentType;\n\n // Generate & register single type's definition\n if (kind === 'singleType') {\n registerSingleType(contentType, registerOptions);\n }\n\n // Generate & register collection type's definition\n else if (kind === 'collectionType') {\n registerCollectionType(contentType, registerOptions);\n }\n }\n };\n\n const registerMorphTypes = (contentTypes: Struct.Schema[]) => {\n // Create & register a union type that includes every type or component registered\n const genericMorphType = builders.buildGenericMorphDefinition();\n registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph });\n\n for (const contentType of contentTypes) {\n registerPolymorphicContentType(contentType, { registry, strapi });\n }\n };\n\n return { buildSchema, getBuiltInQueryFields, isBuiltInQueryField };\n};\n"],"names":["strapi","mergeSchemas","addResolversToSchema","require","service","getGraphQLService","plugin","config","KINDS","GENERIC_MORPH_TYPENAME","extensionService","registry","builders","builtInQueryFields","Set","buildSchema","isShadowCRUDEnabled","new","registerScalars","registerInternals","shadowCRUD","schema","buildMergedSchema","extension","generate","typeRegistry","schemaWithResolvers","resolvers","outputs","typegen","currentEnv","get","nexusSchema","makeSchema","types","mergeSchema","plugins","shouldGenerateArtifacts","wrappedNexusSchema","wrapResolvers","prunedNexusSchema","pruneSchema","getBuiltInQueryFields","isBuiltInQueryField","fieldName","has","endsWith","shadowCRUDSchema","definitions","shadowCRUDQueryFields","getQueryType","getFields","Object","keys","typeDefs","schemas","contentTypes","values","components","map","prop","filter","startsWith","forEach","uid","disable","contentTypesWithShadowCRUD","ct","isEnabled","registerAPITypes","registerMorphTypes","contentType","modelType","registerOptions","registerEnumsDefinition","registerDynamicZonesDefinition","registerFiltersDefinition","registerInputsDefinition","registerComponent","kind","registerSingleType","registerCollectionType","genericMorphType","buildGenericMorphDefinition","register","morph","registerPolymorphicContentType"],"mappings":";;;;;;;;;;;;;;;AAqBA,iBAAe,CAAA,CAAC,EAAEA,MAAM,EAA2B,GAAA;;AAEjD,IAAA,MAAM,EAAEC,YAAY,EAAEC,oBAAoB,EAAE,GAAGC,OAAAA,CAAQ,uBAAA,CAAA;AAEvD,IAAA,MAAM,EAAEC,OAAAA,EAASC,iBAAiB,EAAE,GAAGL,MAAAA,CAAOM,MAAM,CAAC,SAAA,CAAA;AACrD,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAGP,MAAAA,CAAOM,MAAM,CAAC,SAAA,CAAA;AAEjC,IAAA,MAAM,EAAEE,KAAK,EAAEC,sBAAsB,EAAE,GAAGJ,iBAAAA,CAAkB,WAAA,CAAA;AAC5D,IAAA,MAAMK,mBAAmBL,iBAAAA,CAAkB,WAAA,CAAA;;IAG3C,IAAIM,QAAAA;;IAEJ,IAAIC,QAAAA;;AAEJ,IAAA,IAAIC,qBAAkC,IAAIC,GAAAA,EAAAA;AAE1C,IAAA,MAAMC,WAAAA,GAAc,IAAA;QAClB,MAAMC,mBAAAA,GAAsB,CAAC,CAACT,MAAAA,CAAO,YAAA,CAAA;;QAGrCI,QAAAA,GAAWN,iBAAAA,CAAkB,iBAAiBY,GAAG,EAAA;;;AAIjDL,QAAAA,QAAAA,GAAWP,iBAAAA,CAAkB,UAAA,CAAA,CAAYY,GAAG,CAAC,aAAA,EAAeN,QAAAA,CAAAA;QAE5DO,eAAAA,CAAgB;AAAEP,YAAAA,QAAAA;AAAUX,YAAAA;AAAO,SAAA,CAAA;QACnCmB,iBAAAA,CAAkB;AAAER,YAAAA,QAAAA;AAAUX,YAAAA;AAAO,SAAA,CAAA;AAErC,QAAA,IAAIgB,mBAAAA,EAAqB;AACvBI,YAAAA,UAAAA,EAAAA;AACF,QAAA;;AAGA,QAAA,MAAMC,SAASC,iBAAAA,CAAkB;AAAEX,YAAAA;AAAS,SAAA,CAAA;;;;;QAM5C,MAAMY,SAAAA,GAAYb,gBAAAA,CAAiBc,QAAQ,CAAC;YAAEC,YAAAA,EAAcd;AAAS,SAAA,CAAA;;AAGrE,QAAA,MAAMe,sBAAsBxB,oBAAAA,CAAqB;AAC/CmB,YAAAA,MAAAA;AACAM,YAAAA,SAAAA,EAAWJ,UAAUI;AACvB,SAAA,CAAA;;AAGA,QAAA,MAAMC,OAAAA,GAA8C;AAClDP,YAAAA,MAAAA,EAAQd,OAAO,kBAAA,EAAoB,KAAA,CAAA;AACnCsB,YAAAA,OAAAA,EAAStB,OAAO,mBAAA,EAAqB,KAAA;AACvC,SAAA;AAEA,QAAA,MAAMuB,UAAAA,GAAa9B,MAAAA,CAAOO,MAAM,CAACwB,GAAG,CAAC,aAAA,CAAA;AAErC,QAAA,MAAMC,cAAcC,UAAAA,CAAW;AAC7BC,YAAAA,KAAAA,EAAO,EAAE;;;;YAITC,WAAAA,EAAa;gBAAEd,MAAAA,EAAQK;AAAoB,aAAA;;AAG3CU,YAAAA,OAAAA,EAASb,UAAUa,OAAO;;;YAI1BC,uBAAAA,EAAyB9B,MAAAA,CAAO,qBAAqBuB,UAAAA,KAAe,aAAA,CAAA;;AAGpEF,YAAAA;AACF,SAAA,CAAA;;AAGA,QAAA,MAAMU,qBAAqBC,aAAAA,CAAc;YAAElB,MAAAA,EAAQW,WAAAA;AAAahC,YAAAA,MAAAA;AAAQuB,YAAAA;AAAU,SAAA,CAAA;;;AAIlF,QAAA,MAAMiB,oBAAoBC,WAAAA,CAAYH,kBAAAA,CAAAA;QAEtC,OAAOE,iBAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAME,wBAAwB,IAAM7B,kBAAAA;IAEpC,MAAM8B,mBAAAA,GAAsB,CAACC,SAAAA,GAC3B/B,kBAAAA,CAAmBgC,GAAG,CAACD,SAAAA,CAAAA,IAAcA,SAAAA,CAAUE,QAAQ,CAAC,aAAA,CAAA;AAE1D,IAAA,MAAMxB,iBAAAA,GAAoB,CAAC,EAAEX,QAAQ,EAA8B,GAAA;;;;AAIjE,QAAA,MAAMoC,mBAAmBd,UAAAA,CAAW;YAAEC,KAAAA,EAAO;AAACvB,gBAAAA,QAAAA,CAASqC;AAAY;AAAC,SAAA,CAAA;AACpE,QAAA,MAAMC,qBAAAA,GAAwBF,gBAAAA,CAAiBG,YAAY,EAAA,EAAIC,eAAe,EAAC;AAC/EtC,QAAAA,kBAAAA,GAAqB,IAAIC,GAAAA,CAAIsC,MAAAA,CAAOC,IAAI,CAACJ,qBAAAA,CAAAA,CAAAA;;;QAIzC,MAAM,EAAEf,KAAK,EAAEoB,QAAAA,GAAW,EAAE,EAAE,GAAG5C,gBAAAA,CAAiBc,QAAQ,CAAC;YAAEC,YAAAA,EAAcd;AAAS,SAAA,CAAA;;AAGpF,QAAA,MAAMqB,cAAcC,UAAAA,CAAW;YAAEC,KAAAA,EAAO;AAACvB,gBAAAA,QAAAA,CAASqC,WAAW;AAAEd,gBAAAA;AAAM;AAAC,SAAA,CAAA;;AAGtE,QAAA,OAAOjC,YAAAA,CAAa;AAClBqD,YAAAA,QAAAA;;;YAGAC,OAAAA,EAAS;AAACvB,gBAAAA;AAAY;AACxB,SAAA,CAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMZ,UAAAA,GAAa,IAAA;AACjB,QAAA,MAAMV,mBAAmBL,iBAAAA,CAAkB,WAAA,CAAA;;AAG3C,QAAA,MAAMmD,YAAAA,GAAe;eAChBJ,MAAAA,CAAOK,MAAM,CAACzD,MAAAA,CAAO0D,UAAU,CAAA;eAC/BN,MAAAA,CAAOK,MAAM,CAACzD,MAAAA,CAAOwD,YAAY;AACrC,SAAA;;AAGDA,QAAAA,YAAAA,CACGG,GAAG,CAACC,IAAAA,CAAK,KAAA,CAAA,CAAA,CACTC,MAAM,CAACC,UAAAA,CAAW,SAAA,CAAA,CAAA,CAClBC,OAAO,CAAC,CAACC,GAAAA,GAAQtD,gBAAAA,CAAiBU,UAAU,CAAC4C,KAAKC,OAAO,EAAA,CAAA;AAE5D,QAAA,MAAMC,0BAAAA,GAA6BV,YAAAA,CAAaK,MAAM,CAAC,CAACM,EAAAA,GACtDzD,gBAAAA,CAAiBU,UAAU,CAAC+C,EAAAA,CAAGH,GAAG,CAAA,CAAEI,SAAS,EAAA,CAAA;;QAI/CC,gBAAAA,CAAiBH,0BAAAA,CAAAA;;QAGjBI,kBAAAA,CAAmBJ,0BAAAA,CAAAA;AACrB,IAAA,CAAA;AAEA;;;MAIA,MAAMG,mBAAmB,CAACb,YAAAA,GAAAA;QACxB,KAAK,MAAMe,eAAef,YAAAA,CAAc;YACtC,MAAM,EAAEgB,SAAS,EAAE,GAAGD,WAAAA;AAEtB,YAAA,MAAME,eAAAA,GAAkB;AAAE9D,gBAAAA,QAAAA;AAAUX,gBAAAA,MAAAA;AAAQY,gBAAAA;AAAS,aAAA;;;AAIrD8D,YAAAA,uBAAAA,CAAwBH,WAAAA,EAAaE,eAAAA,CAAAA;AACrCE,YAAAA,8BAAAA,CAA+BJ,WAAAA,EAAaE,eAAAA,CAAAA;AAC5CG,YAAAA,yBAAAA,CAA0BL,WAAAA,EAAaE,eAAAA,CAAAA;AACvCI,YAAAA,wBAAAA,CAAyBN,WAAAA,EAAaE,eAAAA,CAAAA;;AAGtC,YAAA,IAAID,cAAc,WAAA,EAAa;AAC7BM,gBAAAA,iBAAAA,CAAkBP,WAAAA,EAAaE,eAAAA,CAAAA;AAC/B,gBAAA;AACF,YAAA;YAEA,MAAM,EAAEM,IAAI,EAAE,GAAGR,WAAAA;;AAGjB,YAAA,IAAIQ,SAAS,YAAA,EAAc;AACzBC,gBAAAA,kBAAAA,CAAmBT,WAAAA,EAAaE,eAAAA,CAAAA;YAClC,CAAA,MAGK,IAAIM,SAAS,gBAAA,EAAkB;AAClCE,gBAAAA,sBAAAA,CAAuBV,WAAAA,EAAaE,eAAAA,CAAAA;AACtC,YAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMH,qBAAqB,CAACd,YAAAA,GAAAA;;QAE1B,MAAM0B,gBAAAA,GAAmBtE,SAASuE,2BAA2B,EAAA;QAC7DxE,QAAAA,CAASyE,QAAQ,CAAC3E,sBAAAA,EAAwByE,gBAAAA,EAAkB;AAAEH,YAAAA,IAAAA,EAAMvE,MAAM6E;AAAM,SAAA,CAAA;QAEhF,KAAK,MAAMd,eAAef,YAAAA,CAAc;AACtC8B,YAAAA,8BAAAA,CAA+Bf,WAAAA,EAAa;AAAE5D,gBAAAA,QAAAA;AAAUX,gBAAAA;AAAO,aAAA,CAAA;AACjE,QAAA;AACF,IAAA,CAAA;IAEA,OAAO;AAAEe,QAAAA,WAAAA;AAAa2B,QAAAA,qBAAAA;AAAuBC,QAAAA;AAAoB,KAAA;AACnE,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../server/src/services/content-api/index.ts"],"sourcesContent":["import { pruneSchema } from '@graphql-tools/utils';\nimport { makeSchema } from 'nexus';\nimport type * as Nexus from 'nexus';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { wrapResolvers } from './wrap-resolvers';\nimport {\n registerSingleType,\n registerCollectionType,\n registerComponent,\n registerScalars,\n registerInternals,\n registerPolymorphicContentType,\n registerEnumsDefinition,\n registerInputsDefinition,\n registerFiltersDefinition,\n registerDynamicZonesDefinition,\n} from './register-functions';\nimport { TypeRegistry } from '../type-registry';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { mergeSchemas, addResolversToSchema } = require('@graphql-tools/schema');\n\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { config } = strapi.plugin('graphql');\n\n const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');\n const extensionService = getGraphQLService('extension');\n\n // Type Registry\n let registry: any;\n // Builders Instances\n let builders: any;\n // Cached set of built-in query fields (populated at bootstrap)\n let builtInQueryFields: Set<string> = new Set();\n\n const buildSchema = () => {\n const isShadowCRUDEnabled = !!config('shadowCRUD');\n\n // Create a new empty type registry\n registry = getGraphQLService('type-registry').new();\n\n // Reset the builders instances associated to the\n // content-api, and link the new type registry\n builders = getGraphQLService('builders').new('content-api', registry);\n\n registerScalars({ registry, strapi });\n registerInternals({ registry, strapi });\n\n if (isShadowCRUDEnabled) {\n shadowCRUD();\n }\n\n // Build a merged schema from both Nexus types & SDL type definitions\n const schema = buildMergedSchema({ registry });\n\n // Generate the extension configuration for the content API.\n // This extension instance needs to be generated after the Nexus schema's\n // generation, so that configurations created during types definitions\n // can be registered before being used in the wrap resolvers operation\n const extension = extensionService.generate({ typeRegistry: registry });\n\n // Add the extension's resolvers to the final schema\n const schemaWithResolvers = addResolversToSchema({\n schema,\n resolvers: extension.resolvers,\n });\n\n // Create a configuration object for the artifacts generation\n const outputs: Nexus.core.SchemaConfig['outputs'] = {\n schema: config('artifacts.schema', false),\n typegen: config('artifacts.typegen', false),\n };\n\n const currentEnv = strapi.config.get('environment');\n\n const nexusSchema = makeSchema({\n types: [],\n // Build the schema from the merged GraphQL schema.\n // Since we're passing the schema to the mergeSchema property, it'll transform our SDL type definitions\n // into Nexus type definition, thus allowing them to be handled by Nexus plugins & other processing\n mergeSchema: { schema: schemaWithResolvers },\n\n // Apply user-defined plugins\n plugins: extension.plugins,\n\n // Whether to generate artifacts (GraphQL schema, TS types definitions) or not.\n // By default, we generate artifacts only on development environment\n shouldGenerateArtifacts: config('generateArtifacts', currentEnv === 'development'),\n\n // Artifacts generation configuration\n outputs,\n });\n\n // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension\n const wrappedNexusSchema = wrapResolvers({ schema: nexusSchema, strapi, extension });\n\n // Prune schema, remove unused types\n // eg: removes registered subscriptions if they're disabled in the config)\n const prunedNexusSchema = pruneSchema(wrappedNexusSchema);\n\n return prunedNexusSchema;\n };\n\n const getBuiltInQueryFields = () => builtInQueryFields;\n\n const isBuiltInQueryField = (fieldName: string) =>\n builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');\n\n const buildMergedSchema = ({ registry }: { registry: TypeRegistry }) => {\n // Capture the built-in (shadow CRUD) query fields from a schema built with only the\n // registry's own types, before any extension-registered types/typeDefs are merged in,\n // so isBuiltInQueryField can tell shadow CRUD fields apart from custom extension resolvers.\n const shadowCRUDSchema = makeSchema({ types: [registry.definitions] });\n const shadowCRUDQueryFields = shadowCRUDSchema.getQueryType()?.getFields() ?? {};\n builtInQueryFields = new Set(Object.keys(shadowCRUDQueryFields));\n\n // Here we extract types, plugins & typeDefs from a temporary generated\n // extension since there won't be any addition allowed after schemas generation\n const { types, typeDefs = [] } = extensionService.generate({ typeRegistry: registry });\n\n // Nexus schema built with user-defined & shadow CRUD auto generated Nexus types\n const nexusSchema = makeSchema({ types: [registry.definitions, types] });\n\n // Merge type definitions with the Nexus schema\n return mergeSchemas({\n typeDefs,\n // Give access to the shadowCRUD & nexus based types\n // Note: This is necessary so that types defined in SDL can reference types defined with Nexus\n schemas: [nexusSchema],\n });\n };\n\n const shadowCRUD = () => {\n const extensionService = getGraphQLService('extension');\n\n // Get every content type & component defined in Strapi\n const contentTypes = [\n ...Object.values(strapi.components),\n ...Object.values(strapi.contentTypes),\n ];\n\n // Disable Shadow CRUD for admin content types\n contentTypes\n .map((contentType) => contentType.uid)\n .filter((uid) => uid.startsWith('admin::'))\n .forEach((uid) => extensionService.shadowCRUD(uid).disable());\n\n const contentTypesWithShadowCRUD = contentTypes.filter((ct) =>\n extensionService.shadowCRUD(ct.uid).isEnabled()\n );\n\n // Generate and register definitions for every content type\n registerAPITypes(contentTypesWithShadowCRUD);\n\n // Generate and register polymorphic types' definitions\n registerMorphTypes(contentTypesWithShadowCRUD);\n };\n\n /**\n * Register needed GraphQL types for every content type\n * @param {object[]} contentTypes\n */\n const registerAPITypes = (contentTypes: Struct.Schema[]) => {\n for (const contentType of contentTypes) {\n const { modelType } = contentType;\n\n const registerOptions = { registry, strapi, builders };\n\n // Generate various types associated to the content type\n // (enums, dynamic-zones, filters, inputs...)\n registerEnumsDefinition(contentType, registerOptions);\n registerDynamicZonesDefinition(contentType, registerOptions);\n registerFiltersDefinition(contentType, registerOptions);\n registerInputsDefinition(contentType, registerOptions);\n\n // Generate & register component's definition\n if (modelType === 'component') {\n registerComponent(contentType, registerOptions);\n continue;\n }\n\n const { kind } = contentType;\n\n // Generate & register single type's definition\n if (kind === 'singleType') {\n registerSingleType(contentType, registerOptions);\n }\n\n // Generate & register collection type's definition\n else if (kind === 'collectionType') {\n registerCollectionType(contentType, registerOptions);\n }\n }\n };\n\n const registerMorphTypes = (contentTypes: Struct.Schema[]) => {\n // Create & register a union type that includes every type or component registered\n const genericMorphType = builders.buildGenericMorphDefinition();\n registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph });\n\n for (const contentType of contentTypes) {\n registerPolymorphicContentType(contentType, { registry, strapi });\n }\n };\n\n return { buildSchema, getBuiltInQueryFields, isBuiltInQueryField };\n};\n"],"names":["strapi","mergeSchemas","addResolversToSchema","require","service","getGraphQLService","plugin","config","KINDS","GENERIC_MORPH_TYPENAME","extensionService","registry","builders","builtInQueryFields","Set","buildSchema","isShadowCRUDEnabled","new","registerScalars","registerInternals","shadowCRUD","schema","buildMergedSchema","extension","generate","typeRegistry","schemaWithResolvers","resolvers","outputs","typegen","currentEnv","get","nexusSchema","makeSchema","types","mergeSchema","plugins","shouldGenerateArtifacts","wrappedNexusSchema","wrapResolvers","prunedNexusSchema","pruneSchema","getBuiltInQueryFields","isBuiltInQueryField","fieldName","has","endsWith","shadowCRUDSchema","definitions","shadowCRUDQueryFields","getQueryType","getFields","Object","keys","typeDefs","schemas","contentTypes","values","components","map","contentType","uid","filter","startsWith","forEach","disable","contentTypesWithShadowCRUD","ct","isEnabled","registerAPITypes","registerMorphTypes","modelType","registerOptions","registerEnumsDefinition","registerDynamicZonesDefinition","registerFiltersDefinition","registerInputsDefinition","registerComponent","kind","registerSingleType","registerCollectionType","genericMorphType","buildGenericMorphDefinition","register","morph","registerPolymorphicContentType"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var lodash = require('lodash');
|
|
4
4
|
var utils = require('@strapi/utils');
|
|
5
5
|
|
|
6
6
|
const { PolicyError } = utils.errors;
|
|
7
|
-
const getPoliciesConfig = fp.propOr([], 'policies');
|
|
8
7
|
const createPoliciesMiddleware = (resolverConfig, { strapi })=>{
|
|
9
|
-
const resolverPolicies =
|
|
8
|
+
const resolverPolicies = lodash.get(resolverConfig, 'policies', []);
|
|
10
9
|
const policies = strapi.get('policies').resolve(resolverPolicies, {});
|
|
11
10
|
return async (resolve, parent, args, context, info)=>{
|
|
12
11
|
// Create a graphql policy context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sources":["../../../../server/src/services/content-api/policy.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"policy.js","sources":["../../../../server/src/services/content-api/policy.ts"],"sourcesContent":["import { get } from 'lodash';\nimport { GraphQLFieldResolver, GraphQLResolveInfo } from 'graphql';\nimport { policy as policyUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst { PolicyError } = errors;\n\nconst createPoliciesMiddleware = (resolverConfig: any, { strapi }: { strapi: Core.Strapi }) => {\n const resolverPolicies = get(resolverConfig, 'policies', []);\n const policies = strapi.get('policies').resolve(resolverPolicies, {});\n\n return async (\n resolve: GraphQLFieldResolver<any, any>,\n parent: any,\n args: any,\n context: any,\n info: GraphQLResolveInfo\n ) => {\n // Create a graphql policy context\n const policyContext = createGraphQLPolicyContext(parent, args, context, info);\n\n // Run policies & throw an error if one of them fails\n for (const { handler, config } of policies) {\n const result = await handler(policyContext, config, { strapi });\n\n if (![true, undefined].includes(result)) {\n throw new PolicyError();\n }\n }\n\n return resolve(parent, args, context, info);\n };\n};\n\nconst createGraphQLPolicyContext = (\n parent: any,\n args: any,\n context: any,\n info: GraphQLResolveInfo\n) => {\n const policyContext = {\n get parent() {\n return parent;\n },\n\n get args() {\n return args;\n },\n\n get context() {\n return context;\n },\n\n get info() {\n return info;\n },\n\n get state() {\n return this.context.state;\n },\n\n get http() {\n return this.context.koaContext;\n },\n };\n\n return policyUtils.createPolicyContext('graphql', policyContext);\n};\n\nexport { createPoliciesMiddleware };\n"],"names":["PolicyError","errors","createPoliciesMiddleware","resolverConfig","strapi","resolverPolicies","get","policies","resolve","parent","args","context","info","policyContext","createGraphQLPolicyContext","handler","config","result","undefined","includes","state","http","koaContext","policyUtils","createPolicyContext"],"mappings":";;;;;AAKA,MAAM,EAAEA,WAAW,EAAE,GAAGC,YAAAA;AAExB,MAAMC,wBAAAA,GAA2B,CAACC,cAAAA,EAAqB,EAAEC,MAAM,EAA2B,GAAA;AACxF,IAAA,MAAMC,gBAAAA,GAAmBC,UAAAA,CAAIH,cAAAA,EAAgB,UAAA,EAAY,EAAE,CAAA;IAC3D,MAAMI,QAAAA,GAAWH,OAAOE,GAAG,CAAC,YAAYE,OAAO,CAACH,kBAAkB,EAAC,CAAA;AAEnE,IAAA,OAAO,OACLG,OAAAA,EACAC,MAAAA,EACAC,IAAAA,EACAC,OAAAA,EACAC,IAAAA,GAAAA;;AAGA,QAAA,MAAMC,aAAAA,GAAgBC,0BAAAA,CAA2BL,MAAAA,EAAQC,IAAAA,EAAMC,OAAAA,EAASC,IAAAA,CAAAA;;AAGxE,QAAA,KAAK,MAAM,EAAEG,OAAO,EAAEC,MAAM,EAAE,IAAIT,QAAAA,CAAU;AAC1C,YAAA,MAAMU,MAAAA,GAAS,MAAMF,OAAAA,CAAQF,aAAAA,EAAeG,MAAAA,EAAQ;AAAEZ,gBAAAA;AAAO,aAAA,CAAA;AAE7D,YAAA,IAAI,CAAC;AAAC,gBAAA,IAAA;AAAMc,gBAAAA;aAAU,CAACC,QAAQ,CAACF,MAAAA,CAAAA,EAAS;AACvC,gBAAA,MAAM,IAAIjB,WAAAA,EAAAA;AACZ,YAAA;AACF,QAAA;QAEA,OAAOQ,OAAAA,CAAQC,MAAAA,EAAQC,IAAAA,EAAMC,OAAAA,EAASC,IAAAA,CAAAA;AACxC,IAAA,CAAA;AACF;AAEA,MAAME,0BAAAA,GAA6B,CACjCL,MAAAA,EACAC,IAAAA,EACAC,OAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAMC,aAAAA,GAAgB;AACpB,QAAA,IAAIJ,MAAAA,CAAAA,GAAS;YACX,OAAOA,MAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,OAAAA,CAAAA,GAAU;YACZ,OAAOA,OAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIQ,KAAAA,CAAAA,GAAQ;AACV,YAAA,OAAO,IAAI,CAACT,OAAO,CAACS,KAAK;AAC3B,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;AACT,YAAA,OAAO,IAAI,CAACV,OAAO,CAACW,UAAU;AAChC,QAAA;AACF,KAAA;IAEA,OAAOC,YAAAA,CAAYC,mBAAmB,CAAC,SAAA,EAAWX,aAAAA,CAAAA;AACpD,CAAA;;;;"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { get } from 'lodash';
|
|
2
2
|
import { errors, policy } from '@strapi/utils';
|
|
3
3
|
|
|
4
4
|
const { PolicyError } = errors;
|
|
5
|
-
const getPoliciesConfig = propOr([], 'policies');
|
|
6
5
|
const createPoliciesMiddleware = (resolverConfig, { strapi })=>{
|
|
7
|
-
const resolverPolicies =
|
|
6
|
+
const resolverPolicies = get(resolverConfig, 'policies', []);
|
|
8
7
|
const policies = strapi.get('policies').resolve(resolverPolicies, {});
|
|
9
8
|
return async (resolve, parent, args, context, info)=>{
|
|
10
9
|
// Create a graphql policy context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.mjs","sources":["../../../../server/src/services/content-api/policy.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"policy.mjs","sources":["../../../../server/src/services/content-api/policy.ts"],"sourcesContent":["import { get } from 'lodash';\nimport { GraphQLFieldResolver, GraphQLResolveInfo } from 'graphql';\nimport { policy as policyUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst { PolicyError } = errors;\n\nconst createPoliciesMiddleware = (resolverConfig: any, { strapi }: { strapi: Core.Strapi }) => {\n const resolverPolicies = get(resolverConfig, 'policies', []);\n const policies = strapi.get('policies').resolve(resolverPolicies, {});\n\n return async (\n resolve: GraphQLFieldResolver<any, any>,\n parent: any,\n args: any,\n context: any,\n info: GraphQLResolveInfo\n ) => {\n // Create a graphql policy context\n const policyContext = createGraphQLPolicyContext(parent, args, context, info);\n\n // Run policies & throw an error if one of them fails\n for (const { handler, config } of policies) {\n const result = await handler(policyContext, config, { strapi });\n\n if (![true, undefined].includes(result)) {\n throw new PolicyError();\n }\n }\n\n return resolve(parent, args, context, info);\n };\n};\n\nconst createGraphQLPolicyContext = (\n parent: any,\n args: any,\n context: any,\n info: GraphQLResolveInfo\n) => {\n const policyContext = {\n get parent() {\n return parent;\n },\n\n get args() {\n return args;\n },\n\n get context() {\n return context;\n },\n\n get info() {\n return info;\n },\n\n get state() {\n return this.context.state;\n },\n\n get http() {\n return this.context.koaContext;\n },\n };\n\n return policyUtils.createPolicyContext('graphql', policyContext);\n};\n\nexport { createPoliciesMiddleware };\n"],"names":["PolicyError","errors","createPoliciesMiddleware","resolverConfig","strapi","resolverPolicies","get","policies","resolve","parent","args","context","info","policyContext","createGraphQLPolicyContext","handler","config","result","undefined","includes","state","http","koaContext","policyUtils","createPolicyContext"],"mappings":";;;AAKA,MAAM,EAAEA,WAAW,EAAE,GAAGC,MAAAA;AAExB,MAAMC,wBAAAA,GAA2B,CAACC,cAAAA,EAAqB,EAAEC,MAAM,EAA2B,GAAA;AACxF,IAAA,MAAMC,gBAAAA,GAAmBC,GAAAA,CAAIH,cAAAA,EAAgB,UAAA,EAAY,EAAE,CAAA;IAC3D,MAAMI,QAAAA,GAAWH,OAAOE,GAAG,CAAC,YAAYE,OAAO,CAACH,kBAAkB,EAAC,CAAA;AAEnE,IAAA,OAAO,OACLG,OAAAA,EACAC,MAAAA,EACAC,IAAAA,EACAC,OAAAA,EACAC,IAAAA,GAAAA;;AAGA,QAAA,MAAMC,aAAAA,GAAgBC,0BAAAA,CAA2BL,MAAAA,EAAQC,IAAAA,EAAMC,OAAAA,EAASC,IAAAA,CAAAA;;AAGxE,QAAA,KAAK,MAAM,EAAEG,OAAO,EAAEC,MAAM,EAAE,IAAIT,QAAAA,CAAU;AAC1C,YAAA,MAAMU,MAAAA,GAAS,MAAMF,OAAAA,CAAQF,aAAAA,EAAeG,MAAAA,EAAQ;AAAEZ,gBAAAA;AAAO,aAAA,CAAA;AAE7D,YAAA,IAAI,CAAC;AAAC,gBAAA,IAAA;AAAMc,gBAAAA;aAAU,CAACC,QAAQ,CAACF,MAAAA,CAAAA,EAAS;AACvC,gBAAA,MAAM,IAAIjB,WAAAA,EAAAA;AACZ,YAAA;AACF,QAAA;QAEA,OAAOQ,OAAAA,CAAQC,MAAAA,EAAQC,IAAAA,EAAMC,OAAAA,EAASC,IAAAA,CAAAA;AACxC,IAAA,CAAA;AACF;AAEA,MAAME,0BAAAA,GAA6B,CACjCL,MAAAA,EACAC,IAAAA,EACAC,OAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAMC,aAAAA,GAAgB;AACpB,QAAA,IAAIJ,MAAAA,CAAAA,GAAS;YACX,OAAOA,MAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,OAAAA,CAAAA,GAAU;YACZ,OAAOA,OAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIQ,KAAAA,CAAAA,GAAQ;AACV,YAAA,OAAO,IAAI,CAACT,OAAO,CAACS,KAAK;AAC3B,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;AACT,YAAA,OAAO,IAAI,CAACV,OAAO,CAACW,UAAU;AAChC,QAAA;AACF,KAAA;IAEA,OAAOC,MAAAA,CAAYC,mBAAmB,CAAC,SAAA,EAAWX,aAAAA,CAAAA;AACpD,CAAA;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var lodash = require('lodash');
|
|
4
4
|
var graphql = require('graphql');
|
|
5
5
|
var utils = require('@strapi/utils');
|
|
6
6
|
var policy = require('./policy.js');
|
|
@@ -20,10 +20,10 @@ const introspectionQueries = [
|
|
|
20
20
|
* @param {object} strapi
|
|
21
21
|
* @return {function[]}
|
|
22
22
|
*/ const parseMiddlewares = (resolverConfig, strapi)=>{
|
|
23
|
-
const resolverMiddlewares =
|
|
23
|
+
const resolverMiddlewares = lodash.get(resolverConfig, 'middlewares', []);
|
|
24
24
|
// TODO: [v4] to factorize with compose endpoints (routes)
|
|
25
25
|
return resolverMiddlewares.map((middleware)=>{
|
|
26
|
-
if (
|
|
26
|
+
if (typeof middleware === 'function') {
|
|
27
27
|
return middleware;
|
|
28
28
|
}
|
|
29
29
|
if (typeof middleware === 'string') {
|
|
@@ -61,9 +61,9 @@ const introspectionQueries = [
|
|
|
61
61
|
const fields = definition.getFields();
|
|
62
62
|
const fieldsToProcess = Object.entries(fields).filter(([field])=>isValidFieldName(field));
|
|
63
63
|
for (const [fieldName, fieldDefinition] of fieldsToProcess){
|
|
64
|
-
const defaultResolver =
|
|
64
|
+
const defaultResolver = lodash.property(fieldName);
|
|
65
65
|
const path = `${type}.${fieldName}`;
|
|
66
|
-
const resolverConfig =
|
|
66
|
+
const resolverConfig = lodash.get(resolversConfig, path, {});
|
|
67
67
|
const { resolve: baseResolver = defaultResolver } = fieldDefinition;
|
|
68
68
|
// Parse & initialize the middlewares
|
|
69
69
|
const middlewares = parseMiddlewares(resolverConfig, strapi);
|
|
@@ -83,14 +83,14 @@ const introspectionQueries = [
|
|
|
83
83
|
* @param {object} context
|
|
84
84
|
* @return {Promise<void>}
|
|
85
85
|
*/ const authorize = async ({ context })=>{
|
|
86
|
-
const authConfig =
|
|
87
|
-
const authContext =
|
|
86
|
+
const authConfig = resolverConfig?.auth;
|
|
87
|
+
const authContext = lodash.get(context, 'state.auth');
|
|
88
88
|
const isValidType = [
|
|
89
89
|
'Mutation',
|
|
90
90
|
'Query',
|
|
91
91
|
'Subscription'
|
|
92
92
|
].includes(type);
|
|
93
|
-
const hasConfig =
|
|
93
|
+
const hasConfig = authConfig != null;
|
|
94
94
|
const isAuthDisabled = authConfig === false;
|
|
95
95
|
if ((isValidType || hasConfig) && !isAuthDisabled) {
|
|
96
96
|
try {
|
|
@@ -108,7 +108,7 @@ const introspectionQueries = [
|
|
|
108
108
|
context
|
|
109
109
|
});
|
|
110
110
|
// Execute middlewares (including the policy middleware which will always be included)
|
|
111
|
-
return
|
|
111
|
+
return boundMiddlewares[0](parent, args, context, info);
|
|
112
112
|
};
|
|
113
113
|
}
|
|
114
114
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-resolvers.js","sources":["../../../../server/src/services/content-api/wrap-resolvers.ts"],"sourcesContent":["import { get,
|
|
1
|
+
{"version":3,"file":"wrap-resolvers.js","sources":["../../../../server/src/services/content-api/wrap-resolvers.ts"],"sourcesContent":["import { get, property } from 'lodash';\nimport {\n GraphQLObjectType,\n GraphQLResolveInfo,\n GraphQLSchema,\n GraphQLFieldResolver,\n} from 'graphql';\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport { createPoliciesMiddleware } from './policy';\n\nconst { ForbiddenError } = errors;\n\nconst introspectionQueries = [\n '__Schema',\n '__Type',\n '__Field',\n '__InputValue',\n '__EnumValue',\n '__Directive',\n];\n\ntype GraphQLMiddleware = (\n resolve: GraphQLFieldResolver<any, any>,\n parents: unknown,\n args: unknown,\n context: unknown,\n info: GraphQLResolveInfo\n) => any;\n\n/**\n * Get & parse middlewares definitions from the resolver's config\n * @param {object} resolverConfig\n * @param {object} strapi\n * @return {function[]}\n */\nconst parseMiddlewares = (resolverConfig: any, strapi: Core.Strapi): GraphQLMiddleware[] => {\n const resolverMiddlewares = get(resolverConfig, 'middlewares', []);\n\n // TODO: [v4] to factorize with compose endpoints (routes)\n return resolverMiddlewares.map(\n (middleware: string | Core.MiddlewareHandler | { name: string; options: any }) => {\n if (typeof middleware === 'function') {\n return middleware;\n }\n\n if (typeof middleware === 'string') {\n return strapi.middleware(middleware);\n }\n\n if (typeof middleware === 'object') {\n const { name, options = {} } = middleware;\n\n return strapi.middleware(name)(options, { strapi });\n }\n\n throw new Error(\n `Invalid middleware type, expected (function,string,object), received ${typeof middleware}`\n );\n }\n );\n};\n\n/**\n * Wrap the schema's resolvers if they've been\n * customized using the GraphQL extension service\n * @param {object} options\n * @param {GraphQLSchema} options.schema\n * @param {object} options.strapi\n * @param {object} options.extension\n * @return {GraphQLSchema}\n */\nconst wrapResolvers = ({\n schema,\n strapi,\n extension = {},\n}: {\n schema: GraphQLSchema;\n strapi: Core.Strapi;\n extension: any;\n}) => {\n // Get all the registered resolvers configuration\n const { resolversConfig = {} } = extension;\n\n // Fields filters\n const isValidFieldName = (field: string) => !field.startsWith('__');\n\n const typeMap = schema.getTypeMap();\n\n Object.entries(typeMap).forEach(([type, definition]) => {\n const isGraphQLObjectType = definition instanceof GraphQLObjectType;\n const isIgnoredType = introspectionQueries.includes(type);\n\n if (!isGraphQLObjectType || isIgnoredType) {\n return;\n }\n\n const fields = definition.getFields();\n const fieldsToProcess = Object.entries(fields).filter(([field]) => isValidFieldName(field));\n\n for (const [fieldName, fieldDefinition] of fieldsToProcess) {\n const defaultResolver = property(fieldName);\n\n const path = `${type}.${fieldName}`;\n const resolverConfig = get(resolversConfig, path, {});\n\n const { resolve: baseResolver = defaultResolver } = fieldDefinition;\n\n // Parse & initialize the middlewares\n const middlewares = parseMiddlewares(resolverConfig, strapi);\n\n // Generate the policy middleware\n const policyMiddleware = createPoliciesMiddleware(resolverConfig, { strapi });\n\n // Add the policyMiddleware at the end of the middlewares collection\n middlewares.push(policyMiddleware);\n\n // Bind every middleware to the next one\n const boundMiddlewares = middlewares.map((middleware, index, collection) => {\n return (parents: unknown, args: unknown, context: unknown, info: GraphQLResolveInfo) =>\n middleware(\n // Make sure the last middleware in the list calls the baseResolver\n index >= collection.length - 1 ? baseResolver : boundMiddlewares[index + 1],\n parents,\n args,\n context,\n info\n );\n });\n\n /**\n * GraphQL authorization flow\n * @param {object} context\n * @return {Promise<void>}\n */\n const authorize = async ({ context }: any) => {\n const authConfig = resolverConfig?.auth;\n const authContext = get(context, 'state.auth');\n\n const isValidType = ['Mutation', 'Query', 'Subscription'].includes(type);\n const hasConfig = authConfig != null;\n\n const isAuthDisabled = authConfig === false;\n\n if ((isValidType || hasConfig) && !isAuthDisabled) {\n try {\n await strapi.auth.verify(authContext, authConfig);\n } catch {\n throw new ForbiddenError();\n }\n }\n };\n\n /**\n * Base resolver wrapper that handles authorization, middlewares & policies\n * @return {Promise<any>}\n */\n fieldDefinition.resolve = async (parent, args, context, info) => {\n await authorize({ context });\n\n // Execute middlewares (including the policy middleware which will always be included)\n return boundMiddlewares[0]!(parent, args, context, info);\n };\n }\n });\n\n return schema;\n};\n\nexport { wrapResolvers };\n"],"names":["ForbiddenError","errors","introspectionQueries","parseMiddlewares","resolverConfig","strapi","resolverMiddlewares","get","map","middleware","name","options","Error","wrapResolvers","schema","extension","resolversConfig","isValidFieldName","field","startsWith","typeMap","getTypeMap","Object","entries","forEach","type","definition","isGraphQLObjectType","GraphQLObjectType","isIgnoredType","includes","fields","getFields","fieldsToProcess","filter","fieldName","fieldDefinition","defaultResolver","property","path","resolve","baseResolver","middlewares","policyMiddleware","createPoliciesMiddleware","push","boundMiddlewares","index","collection","parents","args","context","info","length","authorize","authConfig","auth","authContext","isValidType","hasConfig","isAuthDisabled","verify","parent"],"mappings":"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"}
|