@strapi/plugin-graphql 0.0.0-experimental.6340da17068c3bed7fb006e7bcc554c71129e282 → 0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc
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/admin/index.js +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/package.json.js +1 -2
- package/dist/admin/package.json.js.map +1 -1
- package/dist/admin/package.json.mjs +1 -2
- package/dist/admin/package.json.mjs.map +1 -1
- package/dist/admin/src/index.d.ts +2 -1
- package/dist/admin/translations/ko.json.js +10 -0
- package/dist/admin/translations/ko.json.js.map +1 -0
- package/dist/admin/translations/ko.json.mjs +8 -0
- package/dist/admin/translations/ko.json.mjs.map +1 -0
- package/dist/server/bootstrap.js +35 -10
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +33 -9
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/format-graphql-error.js +34 -8
- package/dist/server/format-graphql-error.js.map +1 -1
- package/dist/server/format-graphql-error.mjs +34 -8
- package/dist/server/format-graphql-error.mjs.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.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/content-type.js +1 -0
- package/dist/server/services/builders/filters/content-type.js.map +1 -1
- package/dist/server/services/builders/filters/content-type.mjs +1 -0
- package/dist/server/services/builders/filters/content-type.mjs.map +1 -1
- package/dist/server/services/builders/filters/operators/eq.js.map +1 -1
- package/dist/server/services/builders/filters/operators/eq.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/filters/operators/not.js +1 -0
- package/dist/server/services/builders/filters/operators/not.js.map +1 -1
- package/dist/server/services/builders/filters/operators/not.mjs +1 -0
- package/dist/server/services/builders/filters/operators/not.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/input.js +1 -2
- package/dist/server/services/builders/input.js.map +1 -1
- package/dist/server/services/builders/input.mjs +1 -2
- package/dist/server/services/builders/input.mjs.map +1 -1
- package/dist/server/services/builders/queries/collection-type.js.map +1 -1
- package/dist/server/services/builders/queries/collection-type.mjs.map +1 -1
- package/dist/server/services/builders/queries/single-type.js.map +1 -1
- package/dist/server/services/builders/queries/single-type.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 +4 -3
- package/dist/server/services/builders/resolvers/association.js.map +1 -1
- package/dist/server/services/builders/resolvers/association.mjs +4 -3
- package/dist/server/services/builders/resolvers/association.mjs.map +1 -1
- package/dist/server/services/builders/resolvers/component.js +1 -0
- package/dist/server/services/builders/resolvers/component.js.map +1 -1
- package/dist/server/services/builders/resolvers/component.mjs +1 -0
- package/dist/server/services/builders/resolvers/component.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 +7 -6
- package/dist/server/services/builders/utils.js.map +1 -1
- package/dist/server/services/builders/utils.mjs +7 -6
- package/dist/server/services/builders/utils.mjs.map +1 -1
- package/dist/server/services/constants.js +3 -3
- package/dist/server/services/constants.js.map +1 -1
- package/dist/server/services/constants.mjs +3 -3
- package/dist/server/services/constants.mjs.map +1 -1
- package/dist/server/services/content-api/index.js +12 -10
- package/dist/server/services/content-api/index.js.map +1 -1
- package/dist/server/services/content-api/index.mjs +12 -10
- 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/register-functions/internals.js +1 -3
- package/dist/server/services/content-api/register-functions/internals.js.map +1 -1
- package/dist/server/services/content-api/register-functions/internals.mjs +1 -3
- package/dist/server/services/content-api/register-functions/internals.mjs.map +1 -1
- package/dist/server/services/content-api/wrap-resolvers.js +13 -13
- package/dist/server/services/content-api/wrap-resolvers.js.map +1 -1
- package/dist/server/services/content-api/wrap-resolvers.mjs +13 -13
- 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/extension/shadow-crud-manager.js +3 -3
- package/dist/server/services/extension/shadow-crud-manager.js.map +1 -1
- package/dist/server/services/extension/shadow-crud-manager.mjs +3 -3
- package/dist/server/services/extension/shadow-crud-manager.mjs.map +1 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +2 -2
- package/dist/server/services/index.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/internals/types/filters.js +3 -0
- package/dist/server/services/internals/types/filters.js.map +1 -1
- package/dist/server/services/internals/types/filters.mjs +3 -0
- package/dist/server/services/internals/types/filters.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 +7 -6
- package/dist/server/services/utils/attributes.js.map +1 -1
- package/dist/server/services/utils/attributes.mjs +7 -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 +11 -10
- 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 +10 -9
- 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 +4 -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 +4 -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 +5 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/format-graphql-error.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +170 -54
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/dynamic-zones.d.ts +1 -1
- 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/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/filters/operators/not.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 +120 -11
- package/dist/server/src/services/builders/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/input.d.ts.map +1 -1
- package/dist/server/src/services/builders/mutations/index.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/resolvers/association.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/component.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/index.d.ts +7 -7
- package/dist/server/src/services/builders/resolvers/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/query.d.ts +3 -3
- package/dist/server/src/services/builders/response.d.ts.map +1 -1
- package/dist/server/src/services/builders/utils.d.ts +4 -2
- package/dist/server/src/services/builders/utils.d.ts.map +1 -1
- package/dist/server/src/services/constants.d.ts +4 -67
- package/dist/server/src/services/constants.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/extension/shadow-crud-manager.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +170 -54
- 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/internals/types/filters.d.ts.map +1 -1
- package/dist/server/src/services/type-registry.d.ts.map +1 -1
- package/dist/server/src/services/utils/attributes.d.ts.map +1 -1
- package/dist/server/src/services/utils/index.d.ts +46 -40
- 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-filters-to-strapi-query.d.ts.map +1 -1
- package/dist/server/src/services/utils/mappers/index.d.ts +19 -13
- package/dist/server/src/services/utils/mappers/index.d.ts.map +1 -1
- package/dist/server/src/types/index.d.ts +64 -0
- package/dist/server/src/types/index.d.ts.map +1 -0
- package/dist/server/src/types/services.d.ts +97 -0
- package/dist/server/src/types/services.d.ts.map +1 -0
- package/package.json +32 -18
|
@@ -1,6 +1,6 @@
|
|
|
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 { ApplicationError } = utils.errors;
|
|
@@ -24,6 +24,7 @@ var associationResolvers = (({ strapi })=>{
|
|
|
24
24
|
return async (parent, args, context, info)=>{
|
|
25
25
|
const { auth } = context.state;
|
|
26
26
|
const transformedArgs = transformArgs(args, {
|
|
27
|
+
// `transformArgs` keeps its published content type parameter; components share the shape.
|
|
27
28
|
contentType: targetContentType,
|
|
28
29
|
usePagination: true
|
|
29
30
|
});
|
|
@@ -87,7 +88,7 @@ var associationResolvers = (({ strapi })=>{
|
|
|
87
88
|
}
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
|
-
const dbQuery =
|
|
91
|
+
const dbQuery = lodash.merge({}, defaultFilters, publicationFilterWhere, transformedQuery);
|
|
91
92
|
// Sign media URLs if upload plugin is available and using private provider
|
|
92
93
|
const data = await (async ()=>{
|
|
93
94
|
const rawData = await strapi.db.query(contentTypeUID).load(parent, attributeName, dbQuery);
|
|
@@ -119,7 +120,7 @@ var associationResolvers = (({ strapi })=>{
|
|
|
119
120
|
auth
|
|
120
121
|
});
|
|
121
122
|
};
|
|
122
|
-
const unwrapData =
|
|
123
|
+
const unwrapData = lodash.property(attributeName);
|
|
123
124
|
// Sanitizer definition
|
|
124
125
|
const sanitizeMorphAttribute = utils.async.pipe(wrapData, sanitizeData, unwrapData);
|
|
125
126
|
return sanitizeMorphAttribute(data);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"association.js","sources":["../../../../../server/src/services/builders/resolvers/association.ts"],"sourcesContent":["import { get, merge } from 'lodash/fp';\nimport {\n async,\n contentTypes,\n errors,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n} from '@strapi/utils';\nimport type { Internal } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n\n const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;\n const { transformArgs } = getGraphQLService('builders').utils;\n const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;\n\n return {\n buildAssociationResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const contentType = strapi.getModel(contentTypeUID);\n const attribute: any = contentType.attributes[attributeName];\n\n if (!attribute) {\n throw new ApplicationError(\n `Failed to build an association resolver for ${contentTypeUID}::${attributeName}`\n );\n }\n\n const isMediaAttribute = isMedia(attribute);\n const isMorphAttribute = isMorphRelation(attribute);\n\n const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;\n const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');\n\n const targetContentType = strapi.getModel(targetUID);\n\n return async (parent: any, args: any, context: any, info: any) => {\n const { auth } = context.state;\n\n const transformedArgs = transformArgs(args, {\n contentType: targetContentType,\n usePagination: true,\n });\n\n await strapi.contentAPI.validate.query(transformedArgs, targetContentType, {\n auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(\n transformedArgs,\n targetContentType,\n {\n auth,\n }\n );\n const transformedQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);\n\n const isTargetDraftAndPublishContentType =\n contentTypes.hasDraftAndPublish(targetContentType);\n\n // Helper to check if a field is from built-in queries (not custom resolvers)\n // Use the precomputed lookup populated by the content-api service at schema build time.\n const isBuiltInQueryField = (fieldName: string) => {\n const graphqlService = strapi.plugin('graphql').service('content-api');\n return graphqlService.isBuiltInQueryField(fieldName);\n };\n\n // Walk back to the root of info.path so we pick up the args of *our* query branch\n let rootPath = info?.path;\n while (rootPath?.prev) {\n rootPath = rootPath.prev;\n }\n const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;\n\n const shouldInheritRootQueryStatus =\n rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField);\n\n // Only inherit status from built-in queries to avoid conflicts with custom resolvers.\n // Built-in root queries default to published results; draft/preview queries pass `status`.\n // Nested relations should match that parent query.\n const inheritedStatus = shouldInheritRootQueryStatus\n ? rootQueryArgs.status || 'published'\n : null;\n\n const statusToApply = args.status || inheritedStatus;\n\n const defaultFilters =\n isTargetDraftAndPublishContentType && statusToApply\n ? {\n where: {\n publishedAt: statusToApply === 'published' ? { $notNull: true } : { $null: true },\n },\n }\n : {};\n\n const inheritedPublicationFilter =\n rootQueryArgs?.publicationFilter !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.publicationFilter\n : undefined;\n\n const inheritedHasPublishedVersion =\n rootQueryArgs?.hasPublishedVersion !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.hasPublishedVersion\n : undefined;\n\n let effectivePublicationFilter: string | undefined = inheritedPublicationFilter;\n if (\n effectivePublicationFilter === undefined &&\n inheritedHasPublishedVersion !== undefined\n ) {\n effectivePublicationFilter = inheritedHasPublishedVersion\n ? 'has-published-version-document'\n : 'never-published-document';\n }\n\n let publicationFilterWhere: Record<string, any> = {};\n if (isTargetDraftAndPublishContentType && effectivePublicationFilter !== undefined) {\n let mode;\n try {\n mode = parsePublicationFilter(effectivePublicationFilter);\n } catch {\n mode = undefined;\n }\n if (mode !== undefined) {\n const meta = strapi.db.metadata.get(targetUID);\n const st = statusToApply === 'published' ? 'published' : 'draft';\n const cond = buildPublicationFilterWhere(\n strapi.db.connection,\n meta,\n targetContentType,\n mode,\n st\n );\n if (cond && Object.keys(cond).length > 0) {\n publicationFilterWhere = { where: cond };\n }\n }\n }\n\n const dbQuery = merge(merge(defaultFilters, publicationFilterWhere), transformedQuery);\n\n // Sign media URLs if upload plugin is available and using private provider\n const data = await (async () => {\n const rawData = await strapi.db\n .query(contentTypeUID)\n .load(parent, attributeName, dbQuery);\n if (isMediaAttribute && strapi.plugin('upload')) {\n const { signFileUrls } = strapi.plugin('upload').service('file');\n\n if (Array.isArray(rawData)) {\n return async.map(rawData, (item: any) => signFileUrls(item));\n }\n\n if (rawData) {\n return signFileUrls(rawData);\n }\n }\n\n return rawData;\n })();\n\n const sanitizeInfo = {\n args: sanitizedQuery,\n resourceUID: targetUID,\n };\n\n // If this a polymorphic association, it sanitizes & returns the raw data\n // Note: The value needs to be wrapped in a fake object that represents its parent\n // so that the sanitize util can work properly.\n if (isMorphAttribute) {\n // Helpers used for the data cleanup\n const wrapData = (dataToWrap: any) => ({ [attributeName]: dataToWrap });\n const sanitizeData = (dataToSanitize: any) => {\n return strapi.contentAPI.sanitize.output(dataToSanitize, contentType, { auth });\n };\n const unwrapData = get(attributeName);\n\n // Sanitizer definition\n const sanitizeMorphAttribute = async.pipe(wrapData, sanitizeData, unwrapData);\n\n return sanitizeMorphAttribute(data);\n }\n\n // If this is a to-many relation, it returns an object that\n // matches what the entity-response-collection's resolvers expect\n if (isToMany) {\n return toEntityResponseCollection(data, sanitizeInfo);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, sanitizeInfo);\n };\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","service","getGraphQLService","plugin","isMorphRelation","isMedia","attributes","transformArgs","utils","toEntityResponse","toEntityResponseCollection","returnTypes","buildAssociationResolver","contentTypeUID","attributeName","contentType","getModel","attribute","isMediaAttribute","isMorphAttribute","targetUID","target","isToMany","multiple","relation","endsWith","targetContentType","parent","args","context","info","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","isBuiltInQueryField","fieldName","graphqlService","rootPath","path","prev","rootQueryArgs","rootQueryArgsByPath","key","undefined","shouldInheritRootQueryStatus","_originField","inheritedStatus","status","statusToApply","defaultFilters","where","publishedAt","$notNull","$null","inheritedPublicationFilter","publicationFilter","inheritedHasPublishedVersion","hasPublishedVersion","effectivePublicationFilter","publicationFilterWhere","mode","parsePublicationFilter","meta","db","metadata","st","cond","buildPublicationFilterWhere","connection","Object","keys","length","dbQuery","merge","data","rawData","load","signFileUrls","Array","isArray","async","map","item","sanitizeInfo","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","pipe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"association.js","sources":["../../../../../server/src/services/builders/resolvers/association.ts"],"sourcesContent":["import { merge, property } from 'lodash';\nimport {\n async,\n contentTypes,\n errors,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n} from '@strapi/utils';\nimport type { Internal, Struct } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n\n const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;\n const { transformArgs } = getGraphQLService('builders').utils;\n const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;\n\n return {\n buildAssociationResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const contentType = strapi.getModel(contentTypeUID);\n const attribute: any = contentType.attributes[attributeName];\n\n if (!attribute) {\n throw new ApplicationError(\n `Failed to build an association resolver for ${contentTypeUID}::${attributeName}`\n );\n }\n\n const isMediaAttribute = isMedia(attribute);\n const isMorphAttribute = isMorphRelation(attribute);\n\n const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;\n const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');\n\n const targetContentType = strapi.getModel(targetUID);\n\n return async (parent: any, args: any, context: any, info: any) => {\n const { auth } = context.state;\n\n const transformedArgs = transformArgs(args, {\n // `transformArgs` keeps its published content type parameter; components share the shape.\n contentType: targetContentType as Struct.ContentTypeSchema,\n usePagination: true,\n });\n\n await strapi.contentAPI.validate.query(transformedArgs, targetContentType, {\n auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(\n transformedArgs,\n targetContentType,\n {\n auth,\n }\n );\n const transformedQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);\n\n const isTargetDraftAndPublishContentType =\n contentTypes.hasDraftAndPublish(targetContentType);\n\n // Helper to check if a field is from built-in queries (not custom resolvers)\n // Use the precomputed lookup populated by the content-api service at schema build time.\n const isBuiltInQueryField = (fieldName: string) => {\n const graphqlService = strapi.plugin('graphql').service('content-api');\n return graphqlService.isBuiltInQueryField(fieldName);\n };\n\n // Walk back to the root of info.path so we pick up the args of *our* query branch\n let rootPath = info?.path;\n while (rootPath?.prev) {\n rootPath = rootPath.prev;\n }\n const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;\n\n const shouldInheritRootQueryStatus =\n rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField);\n\n // Only inherit status from built-in queries to avoid conflicts with custom resolvers.\n // Built-in root queries default to published results; draft/preview queries pass `status`.\n // Nested relations should match that parent query.\n const inheritedStatus = shouldInheritRootQueryStatus\n ? rootQueryArgs.status || 'published'\n : null;\n\n const statusToApply = args.status || inheritedStatus;\n\n const defaultFilters =\n isTargetDraftAndPublishContentType && statusToApply\n ? {\n where: {\n publishedAt: statusToApply === 'published' ? { $notNull: true } : { $null: true },\n },\n }\n : {};\n\n const inheritedPublicationFilter =\n rootQueryArgs?.publicationFilter !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.publicationFilter\n : undefined;\n\n const inheritedHasPublishedVersion =\n rootQueryArgs?.hasPublishedVersion !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.hasPublishedVersion\n : undefined;\n\n let effectivePublicationFilter: string | undefined = inheritedPublicationFilter;\n if (\n effectivePublicationFilter === undefined &&\n inheritedHasPublishedVersion !== undefined\n ) {\n effectivePublicationFilter = inheritedHasPublishedVersion\n ? 'has-published-version-document'\n : 'never-published-document';\n }\n\n let publicationFilterWhere: Record<string, any> = {};\n if (isTargetDraftAndPublishContentType && effectivePublicationFilter !== undefined) {\n let mode;\n try {\n mode = parsePublicationFilter(effectivePublicationFilter);\n } catch {\n mode = undefined;\n }\n if (mode !== undefined) {\n const meta = strapi.db.metadata.get(targetUID);\n const st = statusToApply === 'published' ? 'published' : 'draft';\n const cond = buildPublicationFilterWhere(\n strapi.db.connection,\n meta,\n targetContentType,\n mode,\n st\n );\n if (cond && Object.keys(cond).length > 0) {\n publicationFilterWhere = { where: cond };\n }\n }\n }\n\n const dbQuery = merge({}, defaultFilters, publicationFilterWhere, transformedQuery);\n\n // Sign media URLs if upload plugin is available and using private provider\n const data = await (async () => {\n const rawData = await strapi.db\n .query(contentTypeUID)\n .load(parent, attributeName, dbQuery);\n if (isMediaAttribute && strapi.plugin('upload')) {\n const { signFileUrls } = strapi.plugin('upload').service('file');\n\n if (Array.isArray(rawData)) {\n return async.map(rawData, (item: any) => signFileUrls(item));\n }\n\n if (rawData) {\n return signFileUrls(rawData);\n }\n }\n\n return rawData;\n })();\n\n const sanitizeInfo = {\n args: sanitizedQuery,\n resourceUID: targetUID,\n };\n\n // If this a polymorphic association, it sanitizes & returns the raw data\n // Note: The value needs to be wrapped in a fake object that represents its parent\n // so that the sanitize util can work properly.\n if (isMorphAttribute) {\n // Helpers used for the data cleanup\n const wrapData = (dataToWrap: any) => ({ [attributeName]: dataToWrap });\n const sanitizeData = (dataToSanitize: any) => {\n return strapi.contentAPI.sanitize.output(dataToSanitize, contentType, { auth });\n };\n const unwrapData = property(attributeName);\n\n // Sanitizer definition\n const sanitizeMorphAttribute = async.pipe(wrapData, sanitizeData, unwrapData);\n\n return sanitizeMorphAttribute(data);\n }\n\n // If this is a to-many relation, it returns an object that\n // matches what the entity-response-collection's resolvers expect\n if (isToMany) {\n return toEntityResponseCollection(data, sanitizeInfo);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, sanitizeInfo);\n };\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","service","getGraphQLService","plugin","isMorphRelation","isMedia","attributes","transformArgs","utils","toEntityResponse","toEntityResponseCollection","returnTypes","buildAssociationResolver","contentTypeUID","attributeName","contentType","getModel","attribute","isMediaAttribute","isMorphAttribute","targetUID","target","isToMany","multiple","relation","endsWith","targetContentType","parent","args","context","info","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","isBuiltInQueryField","fieldName","graphqlService","rootPath","path","prev","rootQueryArgs","rootQueryArgsByPath","key","undefined","shouldInheritRootQueryStatus","_originField","inheritedStatus","status","statusToApply","defaultFilters","where","publishedAt","$notNull","$null","inheritedPublicationFilter","publicationFilter","inheritedHasPublishedVersion","hasPublishedVersion","effectivePublicationFilter","publicationFilterWhere","mode","parsePublicationFilter","meta","db","metadata","st","cond","buildPublicationFilterWhere","connection","Object","keys","length","dbQuery","merge","data","rawData","load","signFileUrls","Array","isArray","async","map","item","sanitizeInfo","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","property","sanitizeMorphAttribute","pipe"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { merge,
|
|
1
|
+
import { merge, property } from 'lodash';
|
|
2
2
|
import { errors, contentTypes, parsePublicationFilter, buildPublicationFilterWhere, async } from '@strapi/utils';
|
|
3
3
|
|
|
4
4
|
const { ApplicationError } = errors;
|
|
@@ -22,6 +22,7 @@ var associationResolvers = (({ strapi })=>{
|
|
|
22
22
|
return async (parent, args, context, info)=>{
|
|
23
23
|
const { auth } = context.state;
|
|
24
24
|
const transformedArgs = transformArgs(args, {
|
|
25
|
+
// `transformArgs` keeps its published content type parameter; components share the shape.
|
|
25
26
|
contentType: targetContentType,
|
|
26
27
|
usePagination: true
|
|
27
28
|
});
|
|
@@ -85,7 +86,7 @@ var associationResolvers = (({ strapi })=>{
|
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
|
-
const dbQuery = merge(
|
|
89
|
+
const dbQuery = merge({}, defaultFilters, publicationFilterWhere, transformedQuery);
|
|
89
90
|
// Sign media URLs if upload plugin is available and using private provider
|
|
90
91
|
const data = await (async ()=>{
|
|
91
92
|
const rawData = await strapi.db.query(contentTypeUID).load(parent, attributeName, dbQuery);
|
|
@@ -117,7 +118,7 @@ var associationResolvers = (({ strapi })=>{
|
|
|
117
118
|
auth
|
|
118
119
|
});
|
|
119
120
|
};
|
|
120
|
-
const unwrapData =
|
|
121
|
+
const unwrapData = property(attributeName);
|
|
121
122
|
// Sanitizer definition
|
|
122
123
|
const sanitizeMorphAttribute = async.pipe(wrapData, sanitizeData, unwrapData);
|
|
123
124
|
return sanitizeMorphAttribute(data);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"association.mjs","sources":["../../../../../server/src/services/builders/resolvers/association.ts"],"sourcesContent":["import { get, merge } from 'lodash/fp';\nimport {\n async,\n contentTypes,\n errors,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n} from '@strapi/utils';\nimport type { Internal } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n\n const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;\n const { transformArgs } = getGraphQLService('builders').utils;\n const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;\n\n return {\n buildAssociationResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const contentType = strapi.getModel(contentTypeUID);\n const attribute: any = contentType.attributes[attributeName];\n\n if (!attribute) {\n throw new ApplicationError(\n `Failed to build an association resolver for ${contentTypeUID}::${attributeName}`\n );\n }\n\n const isMediaAttribute = isMedia(attribute);\n const isMorphAttribute = isMorphRelation(attribute);\n\n const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;\n const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');\n\n const targetContentType = strapi.getModel(targetUID);\n\n return async (parent: any, args: any, context: any, info: any) => {\n const { auth } = context.state;\n\n const transformedArgs = transformArgs(args, {\n contentType: targetContentType,\n usePagination: true,\n });\n\n await strapi.contentAPI.validate.query(transformedArgs, targetContentType, {\n auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(\n transformedArgs,\n targetContentType,\n {\n auth,\n }\n );\n const transformedQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);\n\n const isTargetDraftAndPublishContentType =\n contentTypes.hasDraftAndPublish(targetContentType);\n\n // Helper to check if a field is from built-in queries (not custom resolvers)\n // Use the precomputed lookup populated by the content-api service at schema build time.\n const isBuiltInQueryField = (fieldName: string) => {\n const graphqlService = strapi.plugin('graphql').service('content-api');\n return graphqlService.isBuiltInQueryField(fieldName);\n };\n\n // Walk back to the root of info.path so we pick up the args of *our* query branch\n let rootPath = info?.path;\n while (rootPath?.prev) {\n rootPath = rootPath.prev;\n }\n const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;\n\n const shouldInheritRootQueryStatus =\n rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField);\n\n // Only inherit status from built-in queries to avoid conflicts with custom resolvers.\n // Built-in root queries default to published results; draft/preview queries pass `status`.\n // Nested relations should match that parent query.\n const inheritedStatus = shouldInheritRootQueryStatus\n ? rootQueryArgs.status || 'published'\n : null;\n\n const statusToApply = args.status || inheritedStatus;\n\n const defaultFilters =\n isTargetDraftAndPublishContentType && statusToApply\n ? {\n where: {\n publishedAt: statusToApply === 'published' ? { $notNull: true } : { $null: true },\n },\n }\n : {};\n\n const inheritedPublicationFilter =\n rootQueryArgs?.publicationFilter !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.publicationFilter\n : undefined;\n\n const inheritedHasPublishedVersion =\n rootQueryArgs?.hasPublishedVersion !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.hasPublishedVersion\n : undefined;\n\n let effectivePublicationFilter: string | undefined = inheritedPublicationFilter;\n if (\n effectivePublicationFilter === undefined &&\n inheritedHasPublishedVersion !== undefined\n ) {\n effectivePublicationFilter = inheritedHasPublishedVersion\n ? 'has-published-version-document'\n : 'never-published-document';\n }\n\n let publicationFilterWhere: Record<string, any> = {};\n if (isTargetDraftAndPublishContentType && effectivePublicationFilter !== undefined) {\n let mode;\n try {\n mode = parsePublicationFilter(effectivePublicationFilter);\n } catch {\n mode = undefined;\n }\n if (mode !== undefined) {\n const meta = strapi.db.metadata.get(targetUID);\n const st = statusToApply === 'published' ? 'published' : 'draft';\n const cond = buildPublicationFilterWhere(\n strapi.db.connection,\n meta,\n targetContentType,\n mode,\n st\n );\n if (cond && Object.keys(cond).length > 0) {\n publicationFilterWhere = { where: cond };\n }\n }\n }\n\n const dbQuery = merge(merge(defaultFilters, publicationFilterWhere), transformedQuery);\n\n // Sign media URLs if upload plugin is available and using private provider\n const data = await (async () => {\n const rawData = await strapi.db\n .query(contentTypeUID)\n .load(parent, attributeName, dbQuery);\n if (isMediaAttribute && strapi.plugin('upload')) {\n const { signFileUrls } = strapi.plugin('upload').service('file');\n\n if (Array.isArray(rawData)) {\n return async.map(rawData, (item: any) => signFileUrls(item));\n }\n\n if (rawData) {\n return signFileUrls(rawData);\n }\n }\n\n return rawData;\n })();\n\n const sanitizeInfo = {\n args: sanitizedQuery,\n resourceUID: targetUID,\n };\n\n // If this a polymorphic association, it sanitizes & returns the raw data\n // Note: The value needs to be wrapped in a fake object that represents its parent\n // so that the sanitize util can work properly.\n if (isMorphAttribute) {\n // Helpers used for the data cleanup\n const wrapData = (dataToWrap: any) => ({ [attributeName]: dataToWrap });\n const sanitizeData = (dataToSanitize: any) => {\n return strapi.contentAPI.sanitize.output(dataToSanitize, contentType, { auth });\n };\n const unwrapData = get(attributeName);\n\n // Sanitizer definition\n const sanitizeMorphAttribute = async.pipe(wrapData, sanitizeData, unwrapData);\n\n return sanitizeMorphAttribute(data);\n }\n\n // If this is a to-many relation, it returns an object that\n // matches what the entity-response-collection's resolvers expect\n if (isToMany) {\n return toEntityResponseCollection(data, sanitizeInfo);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, sanitizeInfo);\n };\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","service","getGraphQLService","plugin","isMorphRelation","isMedia","attributes","transformArgs","utils","toEntityResponse","toEntityResponseCollection","returnTypes","buildAssociationResolver","contentTypeUID","attributeName","contentType","getModel","attribute","isMediaAttribute","isMorphAttribute","targetUID","target","isToMany","multiple","relation","endsWith","targetContentType","parent","args","context","info","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","isBuiltInQueryField","fieldName","graphqlService","rootPath","path","prev","rootQueryArgs","rootQueryArgsByPath","key","undefined","shouldInheritRootQueryStatus","_originField","inheritedStatus","status","statusToApply","defaultFilters","where","publishedAt","$notNull","$null","inheritedPublicationFilter","publicationFilter","inheritedHasPublishedVersion","hasPublishedVersion","effectivePublicationFilter","publicationFilterWhere","mode","parsePublicationFilter","meta","db","metadata","st","cond","buildPublicationFilterWhere","connection","Object","keys","length","dbQuery","merge","data","rawData","load","signFileUrls","Array","isArray","async","map","item","sanitizeInfo","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","sanitizeMorphAttribute","pipe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"association.mjs","sources":["../../../../../server/src/services/builders/resolvers/association.ts"],"sourcesContent":["import { merge, property } from 'lodash';\nimport {\n async,\n contentTypes,\n errors,\n buildPublicationFilterWhere,\n parsePublicationFilter,\n} from '@strapi/utils';\nimport type { Internal, Struct } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nconst { ApplicationError } = errors;\n\nexport default ({ strapi }: Context) => {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n\n const { isMorphRelation, isMedia } = getGraphQLService('utils').attributes;\n const { transformArgs } = getGraphQLService('builders').utils;\n const { toEntityResponse, toEntityResponseCollection } = getGraphQLService('format').returnTypes;\n\n return {\n buildAssociationResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const contentType = strapi.getModel(contentTypeUID);\n const attribute: any = contentType.attributes[attributeName];\n\n if (!attribute) {\n throw new ApplicationError(\n `Failed to build an association resolver for ${contentTypeUID}::${attributeName}`\n );\n }\n\n const isMediaAttribute = isMedia(attribute);\n const isMorphAttribute = isMorphRelation(attribute);\n\n const targetUID = isMediaAttribute ? 'plugin::upload.file' : attribute.target;\n const isToMany = isMediaAttribute ? attribute.multiple : attribute.relation.endsWith('Many');\n\n const targetContentType = strapi.getModel(targetUID);\n\n return async (parent: any, args: any, context: any, info: any) => {\n const { auth } = context.state;\n\n const transformedArgs = transformArgs(args, {\n // `transformArgs` keeps its published content type parameter; components share the shape.\n contentType: targetContentType as Struct.ContentTypeSchema,\n usePagination: true,\n });\n\n await strapi.contentAPI.validate.query(transformedArgs, targetContentType, {\n auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(\n transformedArgs,\n targetContentType,\n {\n auth,\n }\n );\n const transformedQuery = strapi.get('query-params').transform(targetUID, sanitizedQuery);\n\n const isTargetDraftAndPublishContentType =\n contentTypes.hasDraftAndPublish(targetContentType);\n\n // Helper to check if a field is from built-in queries (not custom resolvers)\n // Use the precomputed lookup populated by the content-api service at schema build time.\n const isBuiltInQueryField = (fieldName: string) => {\n const graphqlService = strapi.plugin('graphql').service('content-api');\n return graphqlService.isBuiltInQueryField(fieldName);\n };\n\n // Walk back to the root of info.path so we pick up the args of *our* query branch\n let rootPath = info?.path;\n while (rootPath?.prev) {\n rootPath = rootPath.prev;\n }\n const rootQueryArgs = rootPath ? context.rootQueryArgsByPath?.get(rootPath.key) : undefined;\n\n const shouldInheritRootQueryStatus =\n rootQueryArgs?._originField && isBuiltInQueryField(rootQueryArgs._originField);\n\n // Only inherit status from built-in queries to avoid conflicts with custom resolvers.\n // Built-in root queries default to published results; draft/preview queries pass `status`.\n // Nested relations should match that parent query.\n const inheritedStatus = shouldInheritRootQueryStatus\n ? rootQueryArgs.status || 'published'\n : null;\n\n const statusToApply = args.status || inheritedStatus;\n\n const defaultFilters =\n isTargetDraftAndPublishContentType && statusToApply\n ? {\n where: {\n publishedAt: statusToApply === 'published' ? { $notNull: true } : { $null: true },\n },\n }\n : {};\n\n const inheritedPublicationFilter =\n rootQueryArgs?.publicationFilter !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.publicationFilter\n : undefined;\n\n const inheritedHasPublishedVersion =\n rootQueryArgs?.hasPublishedVersion !== undefined &&\n rootQueryArgs?._originField &&\n isBuiltInQueryField(rootQueryArgs._originField)\n ? rootQueryArgs.hasPublishedVersion\n : undefined;\n\n let effectivePublicationFilter: string | undefined = inheritedPublicationFilter;\n if (\n effectivePublicationFilter === undefined &&\n inheritedHasPublishedVersion !== undefined\n ) {\n effectivePublicationFilter = inheritedHasPublishedVersion\n ? 'has-published-version-document'\n : 'never-published-document';\n }\n\n let publicationFilterWhere: Record<string, any> = {};\n if (isTargetDraftAndPublishContentType && effectivePublicationFilter !== undefined) {\n let mode;\n try {\n mode = parsePublicationFilter(effectivePublicationFilter);\n } catch {\n mode = undefined;\n }\n if (mode !== undefined) {\n const meta = strapi.db.metadata.get(targetUID);\n const st = statusToApply === 'published' ? 'published' : 'draft';\n const cond = buildPublicationFilterWhere(\n strapi.db.connection,\n meta,\n targetContentType,\n mode,\n st\n );\n if (cond && Object.keys(cond).length > 0) {\n publicationFilterWhere = { where: cond };\n }\n }\n }\n\n const dbQuery = merge({}, defaultFilters, publicationFilterWhere, transformedQuery);\n\n // Sign media URLs if upload plugin is available and using private provider\n const data = await (async () => {\n const rawData = await strapi.db\n .query(contentTypeUID)\n .load(parent, attributeName, dbQuery);\n if (isMediaAttribute && strapi.plugin('upload')) {\n const { signFileUrls } = strapi.plugin('upload').service('file');\n\n if (Array.isArray(rawData)) {\n return async.map(rawData, (item: any) => signFileUrls(item));\n }\n\n if (rawData) {\n return signFileUrls(rawData);\n }\n }\n\n return rawData;\n })();\n\n const sanitizeInfo = {\n args: sanitizedQuery,\n resourceUID: targetUID,\n };\n\n // If this a polymorphic association, it sanitizes & returns the raw data\n // Note: The value needs to be wrapped in a fake object that represents its parent\n // so that the sanitize util can work properly.\n if (isMorphAttribute) {\n // Helpers used for the data cleanup\n const wrapData = (dataToWrap: any) => ({ [attributeName]: dataToWrap });\n const sanitizeData = (dataToSanitize: any) => {\n return strapi.contentAPI.sanitize.output(dataToSanitize, contentType, { auth });\n };\n const unwrapData = property(attributeName);\n\n // Sanitizer definition\n const sanitizeMorphAttribute = async.pipe(wrapData, sanitizeData, unwrapData);\n\n return sanitizeMorphAttribute(data);\n }\n\n // If this is a to-many relation, it returns an object that\n // matches what the entity-response-collection's resolvers expect\n if (isToMany) {\n return toEntityResponseCollection(data, sanitizeInfo);\n }\n\n // Else, it returns an object that matches\n // what the entity-response's resolvers expect\n return toEntityResponse(data, sanitizeInfo);\n };\n },\n };\n};\n"],"names":["ApplicationError","errors","strapi","service","getGraphQLService","plugin","isMorphRelation","isMedia","attributes","transformArgs","utils","toEntityResponse","toEntityResponseCollection","returnTypes","buildAssociationResolver","contentTypeUID","attributeName","contentType","getModel","attribute","isMediaAttribute","isMorphAttribute","targetUID","target","isToMany","multiple","relation","endsWith","targetContentType","parent","args","context","info","auth","state","transformedArgs","usePagination","contentAPI","validate","query","sanitizedQuery","sanitize","transformedQuery","get","transform","isTargetDraftAndPublishContentType","contentTypes","hasDraftAndPublish","isBuiltInQueryField","fieldName","graphqlService","rootPath","path","prev","rootQueryArgs","rootQueryArgsByPath","key","undefined","shouldInheritRootQueryStatus","_originField","inheritedStatus","status","statusToApply","defaultFilters","where","publishedAt","$notNull","$null","inheritedPublicationFilter","publicationFilter","inheritedHasPublishedVersion","hasPublishedVersion","effectivePublicationFilter","publicationFilterWhere","mode","parsePublicationFilter","meta","db","metadata","st","cond","buildPublicationFilterWhere","connection","Object","keys","length","dbQuery","merge","data","rawData","load","signFileUrls","Array","isArray","async","map","item","sanitizeInfo","resourceUID","wrapData","dataToWrap","sanitizeData","dataToSanitize","output","unwrapData","property","sanitizeMorphAttribute","pipe"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ var componentResolvers = (({ strapi })=>({
|
|
|
7
7
|
const contentType = strapi.getModel(contentTypeUID);
|
|
8
8
|
const { component: componentName } = contentType.attributes[attributeName];
|
|
9
9
|
const component = strapi.getModel(componentName);
|
|
10
|
+
// `transformArgs` keeps its published content type parameter; components share the shape.
|
|
10
11
|
const transformedArgs = transformArgs(args, {
|
|
11
12
|
contentType: component,
|
|
12
13
|
usePagination: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sources":["../../../../../server/src/services/builders/resolvers/component.ts"],"sourcesContent":["import type { Internal, Schema } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nexport default ({ strapi }: Context) => ({\n buildComponentResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const { transformArgs } = strapi.plugin('graphql').service('builders').utils;\n\n return async (parent: any, args: any, ctx: any) => {\n const contentType = strapi.getModel(contentTypeUID);\n\n const { component: componentName } = contentType.attributes[\n attributeName\n ] as Schema.Attribute.Component;\n\n const component = strapi.getModel(componentName);\n\n const transformedArgs = transformArgs(args, {
|
|
1
|
+
{"version":3,"file":"component.js","sources":["../../../../../server/src/services/builders/resolvers/component.ts"],"sourcesContent":["import type { Internal, Schema, Struct } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nexport default ({ strapi }: Context) => ({\n buildComponentResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const { transformArgs } = strapi.plugin('graphql').service('builders').utils;\n\n return async (parent: any, args: any, ctx: any) => {\n const contentType = strapi.getModel(contentTypeUID);\n\n const { component: componentName } = contentType.attributes[\n attributeName\n ] as Schema.Attribute.Component;\n\n const component = strapi.getModel(componentName);\n\n // `transformArgs` keeps its published content type parameter; components share the shape.\n const transformedArgs = transformArgs(args, {\n contentType: component as unknown as Struct.ContentTypeSchema,\n usePagination: true,\n });\n await strapi.contentAPI.validate.query(transformedArgs, component, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(transformedArgs, component, {\n auth: ctx?.state?.auth,\n });\n\n const dbQuery = strapi.get('query-params').transform(component.uid, sanitizedQuery);\n\n return strapi.db?.query(contentTypeUID).load(parent, attributeName, dbQuery);\n };\n },\n});\n"],"names":["strapi","buildComponentResolver","contentTypeUID","attributeName","transformArgs","plugin","service","utils","parent","args","ctx","contentType","getModel","component","componentName","attributes","transformedArgs","usePagination","contentAPI","validate","query","auth","state","sanitizedQuery","sanitize","dbQuery","get","transform","uid","db","load"],"mappings":";;AAIA,yBAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,IAAM;AACvCC,QAAAA,sBAAAA,CAAAA,CAAuB,EACrBC,cAAc,EACdC,aAAa,EAId,EAAA;YACC,MAAM,EAAEC,aAAa,EAAE,GAAGJ,MAAAA,CAAOK,MAAM,CAAC,SAAA,CAAA,CAAWC,OAAO,CAAC,UAAA,CAAA,CAAYC,KAAK;YAE5E,OAAO,OAAOC,QAAaC,IAAAA,EAAWC,GAAAA,GAAAA;gBACpC,MAAMC,WAAAA,GAAcX,MAAAA,CAAOY,QAAQ,CAACV,cAAAA,CAAAA;gBAEpC,MAAM,EAAEW,WAAWC,aAAa,EAAE,GAAGH,WAAAA,CAAYI,UAAU,CACzDZ,aAAAA,CACD;gBAED,MAAMU,SAAAA,GAAYb,MAAAA,CAAOY,QAAQ,CAACE,aAAAA,CAAAA;;gBAGlC,MAAME,eAAAA,GAAkBZ,cAAcK,IAAAA,EAAM;oBAC1CE,WAAAA,EAAaE,SAAAA;oBACbI,aAAAA,EAAe;AACjB,iBAAA,CAAA;gBACA,MAAMjB,MAAAA,CAAOkB,UAAU,CAACC,QAAQ,CAACC,KAAK,CAACJ,iBAAiBH,SAAAA,EAAW;AACjEQ,oBAAAA,IAAAA,EAAMX,KAAKY,KAAAA,EAAOD;AACpB,iBAAA,CAAA;gBAEA,MAAME,cAAAA,GAAiB,MAAMvB,MAAAA,CAAOkB,UAAU,CAACM,QAAQ,CAACJ,KAAK,CAACJ,eAAAA,EAAiBH,SAAAA,EAAW;AACxFQ,oBAAAA,IAAAA,EAAMX,KAAKY,KAAAA,EAAOD;AACpB,iBAAA,CAAA;gBAEA,MAAMI,OAAAA,GAAUzB,OAAO0B,GAAG,CAAC,gBAAgBC,SAAS,CAACd,SAAAA,CAAUe,GAAG,EAAEL,cAAAA,CAAAA;AAEpE,gBAAA,OAAOvB,OAAO6B,EAAE,EAAET,MAAMlB,cAAAA,CAAAA,CAAgB4B,IAAAA,CAAKtB,QAAQL,aAAAA,EAAesB,OAAAA,CAAAA;AACtE,YAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAC;;;;"}
|
|
@@ -5,6 +5,7 @@ var componentResolvers = (({ strapi })=>({
|
|
|
5
5
|
const contentType = strapi.getModel(contentTypeUID);
|
|
6
6
|
const { component: componentName } = contentType.attributes[attributeName];
|
|
7
7
|
const component = strapi.getModel(componentName);
|
|
8
|
+
// `transformArgs` keeps its published content type parameter; components share the shape.
|
|
8
9
|
const transformedArgs = transformArgs(args, {
|
|
9
10
|
contentType: component,
|
|
10
11
|
usePagination: true
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.mjs","sources":["../../../../../server/src/services/builders/resolvers/component.ts"],"sourcesContent":["import type { Internal, Schema } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nexport default ({ strapi }: Context) => ({\n buildComponentResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const { transformArgs } = strapi.plugin('graphql').service('builders').utils;\n\n return async (parent: any, args: any, ctx: any) => {\n const contentType = strapi.getModel(contentTypeUID);\n\n const { component: componentName } = contentType.attributes[\n attributeName\n ] as Schema.Attribute.Component;\n\n const component = strapi.getModel(componentName);\n\n const transformedArgs = transformArgs(args, {
|
|
1
|
+
{"version":3,"file":"component.mjs","sources":["../../../../../server/src/services/builders/resolvers/component.ts"],"sourcesContent":["import type { Internal, Schema, Struct } from '@strapi/types';\n\nimport type { Context } from '../../types';\n\nexport default ({ strapi }: Context) => ({\n buildComponentResolver({\n contentTypeUID,\n attributeName,\n }: {\n contentTypeUID: Internal.UID.ContentType;\n attributeName: string;\n }) {\n const { transformArgs } = strapi.plugin('graphql').service('builders').utils;\n\n return async (parent: any, args: any, ctx: any) => {\n const contentType = strapi.getModel(contentTypeUID);\n\n const { component: componentName } = contentType.attributes[\n attributeName\n ] as Schema.Attribute.Component;\n\n const component = strapi.getModel(componentName);\n\n // `transformArgs` keeps its published content type parameter; components share the shape.\n const transformedArgs = transformArgs(args, {\n contentType: component as unknown as Struct.ContentTypeSchema,\n usePagination: true,\n });\n await strapi.contentAPI.validate.query(transformedArgs, component, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = await strapi.contentAPI.sanitize.query(transformedArgs, component, {\n auth: ctx?.state?.auth,\n });\n\n const dbQuery = strapi.get('query-params').transform(component.uid, sanitizedQuery);\n\n return strapi.db?.query(contentTypeUID).load(parent, attributeName, dbQuery);\n };\n },\n});\n"],"names":["strapi","buildComponentResolver","contentTypeUID","attributeName","transformArgs","plugin","service","utils","parent","args","ctx","contentType","getModel","component","componentName","attributes","transformedArgs","usePagination","contentAPI","validate","query","auth","state","sanitizedQuery","sanitize","dbQuery","get","transform","uid","db","load"],"mappings":"AAIA,yBAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,IAAM;AACvCC,QAAAA,sBAAAA,CAAAA,CAAuB,EACrBC,cAAc,EACdC,aAAa,EAId,EAAA;YACC,MAAM,EAAEC,aAAa,EAAE,GAAGJ,MAAAA,CAAOK,MAAM,CAAC,SAAA,CAAA,CAAWC,OAAO,CAAC,UAAA,CAAA,CAAYC,KAAK;YAE5E,OAAO,OAAOC,QAAaC,IAAAA,EAAWC,GAAAA,GAAAA;gBACpC,MAAMC,WAAAA,GAAcX,MAAAA,CAAOY,QAAQ,CAACV,cAAAA,CAAAA;gBAEpC,MAAM,EAAEW,WAAWC,aAAa,EAAE,GAAGH,WAAAA,CAAYI,UAAU,CACzDZ,aAAAA,CACD;gBAED,MAAMU,SAAAA,GAAYb,MAAAA,CAAOY,QAAQ,CAACE,aAAAA,CAAAA;;gBAGlC,MAAME,eAAAA,GAAkBZ,cAAcK,IAAAA,EAAM;oBAC1CE,WAAAA,EAAaE,SAAAA;oBACbI,aAAAA,EAAe;AACjB,iBAAA,CAAA;gBACA,MAAMjB,MAAAA,CAAOkB,UAAU,CAACC,QAAQ,CAACC,KAAK,CAACJ,iBAAiBH,SAAAA,EAAW;AACjEQ,oBAAAA,IAAAA,EAAMX,KAAKY,KAAAA,EAAOD;AACpB,iBAAA,CAAA;gBAEA,MAAME,cAAAA,GAAiB,MAAMvB,MAAAA,CAAOkB,UAAU,CAACM,QAAQ,CAACJ,KAAK,CAACJ,eAAAA,EAAiBH,SAAAA,EAAW;AACxFQ,oBAAAA,IAAAA,EAAMX,KAAKY,KAAAA,EAAOD;AACpB,iBAAA,CAAA;gBAEA,MAAMI,OAAAA,GAAUzB,OAAO0B,GAAG,CAAC,gBAAgBC,SAAS,CAACd,SAAAA,CAAUe,GAAG,EAAEL,cAAAA,CAAAA;AAEpE,gBAAA,OAAOvB,OAAO6B,EAAE,EAAET,MAAMlB,cAAAA,CAAAA,CAAgB4B,IAAAA,CAAKtB,QAAQL,aAAAA,EAAesB,OAAAA,CAAAA;AACtE,YAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAC;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var lodash = require('lodash');
|
|
4
4
|
var mergePublicationArgs = require('./merge-publication-args.js');
|
|
5
5
|
|
|
6
6
|
/** Merge sanitized query with resolver args so GraphQL-coerced publication args are not dropped. */ const mergeDocumentListParams = (sanitizedQuery, args)=>{
|
|
@@ -45,10 +45,10 @@ var queriesResolvers = (({ strapi })=>({
|
|
|
45
45
|
const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
|
|
46
46
|
auth: ctx?.state?.auth
|
|
47
47
|
});
|
|
48
|
-
const merged = mergeDocumentListParams(
|
|
48
|
+
const merged = mergeDocumentListParams(lodash.omit(sanitizedQuery, [
|
|
49
49
|
'id',
|
|
50
50
|
'documentId'
|
|
51
|
-
]
|
|
51
|
+
]), args);
|
|
52
52
|
return strapi.documents(uid).findOne({
|
|
53
53
|
...merged,
|
|
54
54
|
documentId
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sources":["../../../../../server/src/services/builders/resolvers/query.ts"],"sourcesContent":["import { omit } from 'lodash
|
|
1
|
+
{"version":3,"file":"query.js","sources":["../../../../../server/src/services/builders/resolvers/query.ts"],"sourcesContent":["import { omit } from 'lodash';\nimport type { Schema } from '@strapi/types';\nimport type { Context } from '../../types';\n\nimport { mergePublicationFilterFromGraphQLArgs } from './merge-publication-args';\n\n/** Merge sanitized query with resolver args so GraphQL-coerced publication args are not dropped. */\nconst mergeDocumentListParams = (\n sanitizedQuery: Record<string, unknown>,\n args: Record<string, unknown>\n) => {\n const { status, ...rest } = sanitizedQuery;\n\n const merged: Record<string, unknown> = {\n ...rest,\n status: (status as 'draft' | 'published' | undefined) ?? 'published',\n };\n\n const { publicationFilter } = mergePublicationFilterFromGraphQLArgs(args);\n if (publicationFilter !== undefined) {\n merged.publicationFilter = publicationFilter;\n }\n\n return merged;\n};\n\nexport default ({ strapi }: Context) => ({\n buildQueriesResolvers({ contentType }: { contentType: Schema.ContentType }) {\n const { uid } = contentType;\n\n return {\n async findMany(parent: any, args: any, ctx: any) {\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = (await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n })) as Record<string, unknown>;\n\n return strapi.documents!(uid).findMany(\n mergeDocumentListParams(sanitizedQuery, args) as any\n );\n },\n\n async findFirst(parent: any, args: any, ctx: any) {\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = (await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n })) as Record<string, unknown>;\n\n return strapi.documents!(uid).findFirst(\n mergeDocumentListParams(sanitizedQuery, args) as any\n );\n },\n\n async findOne(parent: any, args: any, ctx: any) {\n const { documentId } = args;\n\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = (await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n })) as Record<string, unknown>;\n\n const merged = mergeDocumentListParams(\n omit(sanitizedQuery, ['id', 'documentId']) as Record<string, unknown>,\n args\n );\n\n return strapi.documents!(uid).findOne({ ...merged, documentId } as any);\n },\n };\n },\n});\n"],"names":["mergeDocumentListParams","sanitizedQuery","args","status","rest","merged","publicationFilter","mergePublicationFilterFromGraphQLArgs","undefined","strapi","buildQueriesResolvers","contentType","uid","findMany","parent","ctx","contentAPI","validate","query","auth","state","sanitize","documents","findFirst","findOne","documentId","omit"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { omit } from 'lodash
|
|
1
|
+
import { omit } from 'lodash';
|
|
2
2
|
import { mergePublicationFilterFromGraphQLArgs } from './merge-publication-args.mjs';
|
|
3
3
|
|
|
4
4
|
/** Merge sanitized query with resolver args so GraphQL-coerced publication args are not dropped. */ const mergeDocumentListParams = (sanitizedQuery, args)=>{
|
|
@@ -43,10 +43,10 @@ var queriesResolvers = (({ strapi })=>({
|
|
|
43
43
|
const sanitizedQuery = await strapi.contentAPI.sanitize.query(args, contentType, {
|
|
44
44
|
auth: ctx?.state?.auth
|
|
45
45
|
});
|
|
46
|
-
const merged = mergeDocumentListParams(omit([
|
|
46
|
+
const merged = mergeDocumentListParams(omit(sanitizedQuery, [
|
|
47
47
|
'id',
|
|
48
48
|
'documentId'
|
|
49
|
-
]
|
|
49
|
+
]), args);
|
|
50
50
|
return strapi.documents(uid).findOne({
|
|
51
51
|
...merged,
|
|
52
52
|
documentId
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.mjs","sources":["../../../../../server/src/services/builders/resolvers/query.ts"],"sourcesContent":["import { omit } from 'lodash
|
|
1
|
+
{"version":3,"file":"query.mjs","sources":["../../../../../server/src/services/builders/resolvers/query.ts"],"sourcesContent":["import { omit } from 'lodash';\nimport type { Schema } from '@strapi/types';\nimport type { Context } from '../../types';\n\nimport { mergePublicationFilterFromGraphQLArgs } from './merge-publication-args';\n\n/** Merge sanitized query with resolver args so GraphQL-coerced publication args are not dropped. */\nconst mergeDocumentListParams = (\n sanitizedQuery: Record<string, unknown>,\n args: Record<string, unknown>\n) => {\n const { status, ...rest } = sanitizedQuery;\n\n const merged: Record<string, unknown> = {\n ...rest,\n status: (status as 'draft' | 'published' | undefined) ?? 'published',\n };\n\n const { publicationFilter } = mergePublicationFilterFromGraphQLArgs(args);\n if (publicationFilter !== undefined) {\n merged.publicationFilter = publicationFilter;\n }\n\n return merged;\n};\n\nexport default ({ strapi }: Context) => ({\n buildQueriesResolvers({ contentType }: { contentType: Schema.ContentType }) {\n const { uid } = contentType;\n\n return {\n async findMany(parent: any, args: any, ctx: any) {\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = (await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n })) as Record<string, unknown>;\n\n return strapi.documents!(uid).findMany(\n mergeDocumentListParams(sanitizedQuery, args) as any\n );\n },\n\n async findFirst(parent: any, args: any, ctx: any) {\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = (await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n })) as Record<string, unknown>;\n\n return strapi.documents!(uid).findFirst(\n mergeDocumentListParams(sanitizedQuery, args) as any\n );\n },\n\n async findOne(parent: any, args: any, ctx: any) {\n const { documentId } = args;\n\n await strapi.contentAPI.validate.query(args, contentType, {\n auth: ctx?.state?.auth,\n });\n\n const sanitizedQuery = (await strapi.contentAPI.sanitize.query(args, contentType, {\n auth: ctx?.state?.auth,\n })) as Record<string, unknown>;\n\n const merged = mergeDocumentListParams(\n omit(sanitizedQuery, ['id', 'documentId']) as Record<string, unknown>,\n args\n );\n\n return strapi.documents!(uid).findOne({ ...merged, documentId } as any);\n },\n };\n },\n});\n"],"names":["mergeDocumentListParams","sanitizedQuery","args","status","rest","merged","publicationFilter","mergePublicationFilterFromGraphQLArgs","undefined","strapi","buildQueriesResolvers","contentType","uid","findMany","parent","ctx","contentAPI","validate","query","auth","state","sanitize","documents","findFirst","findOne","documentId","omit"],"mappings":";;;AAMA,qGACA,MAAMA,uBAAAA,GAA0B,CAC9BC,cAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAGC,MAAM,GAAGH,cAAAA;AAE5B,IAAA,MAAMI,MAAAA,GAAkC;AACtC,QAAA,GAAGD,IAAI;AACPD,QAAAA,MAAAA,EAAQ,MAACA,IAAgD;AAC3D,KAAA;AAEA,IAAA,MAAM,EAAEG,iBAAiB,EAAE,GAAGC,qCAAAA,CAAsCL,IAAAA,CAAAA;AACpE,IAAA,IAAII,sBAAsBE,SAAAA,EAAW;AACnCH,QAAAA,MAAAA,CAAOC,iBAAiB,GAAGA,iBAAAA;AAC7B,IAAA;IAEA,OAAOD,MAAAA;AACT,CAAA;AAEA,uBAAe,CAAA,CAAC,EAAEI,MAAM,EAAW,IAAM;QACvCC,qBAAAA,CAAAA,CAAsB,EAAEC,WAAW,EAAuC,EAAA;YACxE,MAAM,EAAEC,GAAG,EAAE,GAAGD,WAAAA;YAEhB,OAAO;AACL,gBAAA,MAAME,QAAAA,CAAAA,CAASC,MAAW,EAAEZ,IAAS,EAAEa,GAAQ,EAAA;oBAC7C,MAAMN,MAAAA,CAAOO,UAAU,CAACC,QAAQ,CAACC,KAAK,CAAChB,MAAMS,WAAAA,EAAa;AACxDQ,wBAAAA,IAAAA,EAAMJ,KAAKK,KAAAA,EAAOD;AACpB,qBAAA,CAAA;oBAEA,MAAMlB,cAAAA,GAAkB,MAAMQ,MAAAA,CAAOO,UAAU,CAACK,QAAQ,CAACH,KAAK,CAAChB,IAAAA,EAAMS,WAAAA,EAAa;AAChFQ,wBAAAA,IAAAA,EAAMJ,KAAKK,KAAAA,EAAOD;AACpB,qBAAA,CAAA;AAEA,oBAAA,OAAOV,OAAOa,SAAS,CAAEV,KAAKC,QAAQ,CACpCb,wBAAwBC,cAAAA,EAAgBC,IAAAA,CAAAA,CAAAA;AAE5C,gBAAA,CAAA;AAEA,gBAAA,MAAMqB,SAAAA,CAAAA,CAAUT,MAAW,EAAEZ,IAAS,EAAEa,GAAQ,EAAA;oBAC9C,MAAMN,MAAAA,CAAOO,UAAU,CAACC,QAAQ,CAACC,KAAK,CAAChB,MAAMS,WAAAA,EAAa;AACxDQ,wBAAAA,IAAAA,EAAMJ,KAAKK,KAAAA,EAAOD;AACpB,qBAAA,CAAA;oBAEA,MAAMlB,cAAAA,GAAkB,MAAMQ,MAAAA,CAAOO,UAAU,CAACK,QAAQ,CAACH,KAAK,CAAChB,IAAAA,EAAMS,WAAAA,EAAa;AAChFQ,wBAAAA,IAAAA,EAAMJ,KAAKK,KAAAA,EAAOD;AACpB,qBAAA,CAAA;AAEA,oBAAA,OAAOV,OAAOa,SAAS,CAAEV,KAAKW,SAAS,CACrCvB,wBAAwBC,cAAAA,EAAgBC,IAAAA,CAAAA,CAAAA;AAE5C,gBAAA,CAAA;AAEA,gBAAA,MAAMsB,OAAAA,CAAAA,CAAQV,MAAW,EAAEZ,IAAS,EAAEa,GAAQ,EAAA;oBAC5C,MAAM,EAAEU,UAAU,EAAE,GAAGvB,IAAAA;oBAEvB,MAAMO,MAAAA,CAAOO,UAAU,CAACC,QAAQ,CAACC,KAAK,CAAChB,MAAMS,WAAAA,EAAa;AACxDQ,wBAAAA,IAAAA,EAAMJ,KAAKK,KAAAA,EAAOD;AACpB,qBAAA,CAAA;oBAEA,MAAMlB,cAAAA,GAAkB,MAAMQ,MAAAA,CAAOO,UAAU,CAACK,QAAQ,CAACH,KAAK,CAAChB,IAAAA,EAAMS,WAAAA,EAAa;AAChFQ,wBAAAA,IAAAA,EAAMJ,KAAKK,KAAAA,EAAOD;AACpB,qBAAA,CAAA;oBAEA,MAAMd,MAAAA,GAASL,uBAAAA,CACb0B,IAAAA,CAAKzB,cAAAA,EAAgB;AAAC,wBAAA,IAAA;AAAM,wBAAA;qBAAa,CAAA,EACzCC,IAAAA,CAAAA;AAGF,oBAAA,OAAOO,MAAAA,CAAOa,SAAS,CAAEV,GAAAA,CAAAA,CAAKY,OAAO,CAAC;AAAE,wBAAA,GAAGnB,MAAM;AAAEoB,wBAAAA;AAAW,qBAAA,CAAA;AAChE,gBAAA;AACF,aAAA;AACF,QAAA;AACF,KAAA,CAAC;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var nexus = require('nexus');
|
|
4
|
-
var
|
|
4
|
+
var lodash = require('lodash');
|
|
5
5
|
|
|
6
6
|
var responseCollection = (({ strapi })=>{
|
|
7
7
|
const { service: getService } = strapi.plugin('graphql');
|
|
@@ -22,7 +22,7 @@ var responseCollection = (({ strapi })=>{
|
|
|
22
22
|
// NOTE: add edges & cursor based pagination to support the relay spec in a later version
|
|
23
23
|
t.nonNull.list.field('nodes', {
|
|
24
24
|
type: nexus.nonNull(typeName),
|
|
25
|
-
resolve:
|
|
25
|
+
resolve: (parent)=>lodash.defaultTo(parent?.nodes, [])
|
|
26
26
|
});
|
|
27
27
|
t.nonNull.field('pageInfo', {
|
|
28
28
|
type: PAGINATION_TYPE_NAME,
|
|
@@ -32,12 +32,12 @@ var responseCollection = (({ strapi })=>{
|
|
|
32
32
|
t.nonNull.list.field('data', {
|
|
33
33
|
deprecation: 'Use `nodes` field instead',
|
|
34
34
|
type: nexus.nonNull(typeName),
|
|
35
|
-
resolve:
|
|
35
|
+
resolve: (parent)=>lodash.defaultTo(parent?.nodes, [])
|
|
36
36
|
});
|
|
37
37
|
t.nonNull.field('meta', {
|
|
38
38
|
deprecation: 'Use the `pageInfo` field instead',
|
|
39
39
|
type: RESPONSE_COLLECTION_META_TYPE_NAME,
|
|
40
|
-
resolve:
|
|
40
|
+
resolve: lodash.identity
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-collection.js","sources":["../../../../server/src/services/builders/response-collection.ts"],"sourcesContent":["import { objectType, nonNull } from 'nexus';\nimport { defaultTo,
|
|
1
|
+
{"version":3,"file":"response-collection.js","sources":["../../../../server/src/services/builders/response-collection.ts"],"sourcesContent":["import { objectType, nonNull } from 'nexus';\nimport { defaultTo, identity } from 'lodash';\nimport type { Schema } from '@strapi/types';\nimport type { Context } from '../types';\n\nexport default ({ strapi }: Context) => {\n const { service: getService } = strapi.plugin('graphql');\n\n const { naming } = getService('utils');\n const { RESPONSE_COLLECTION_META_TYPE_NAME, PAGINATION_TYPE_NAME } = getService('constants');\n\n return {\n /**\n * Build a type definition for a content API collection response for a given content type\n * @param {Schema.ContentType} contentType The content type which will be used to build its content API response definition\n * @return {NexusObjectTypeDef}\n */\n buildResponseCollectionDefinition(contentType: Schema.ContentType) {\n const name = naming.getEntityResponseCollectionName(contentType);\n const typeName = naming.getTypeName(contentType);\n const { resolvePagination } = getService('builders').get('content-api');\n\n return objectType({\n name,\n definition(t) {\n // NOTE: add edges & cursor based pagination to support the relay spec in a later version\n\n t.nonNull.list.field('nodes', {\n type: nonNull(typeName),\n resolve: (parent) => defaultTo(parent?.nodes, []),\n });\n\n t.nonNull.field('pageInfo', {\n type: PAGINATION_TYPE_NAME,\n resolve: resolvePagination,\n });\n\n if (strapi.plugin('graphql').config('v4CompatibilityMode', false)) {\n t.nonNull.list.field('data', {\n deprecation: 'Use `nodes` field instead',\n type: nonNull(typeName),\n resolve: (parent) => defaultTo(parent?.nodes, []),\n });\n\n t.nonNull.field('meta', {\n deprecation: 'Use the `pageInfo` field instead',\n type: RESPONSE_COLLECTION_META_TYPE_NAME,\n resolve: identity,\n });\n }\n },\n });\n },\n };\n};\n"],"names":["strapi","service","getService","plugin","naming","RESPONSE_COLLECTION_META_TYPE_NAME","PAGINATION_TYPE_NAME","buildResponseCollectionDefinition","contentType","name","getEntityResponseCollectionName","typeName","getTypeName","resolvePagination","get","objectType","definition","t","nonNull","list","field","type","resolve","parent","defaultTo","nodes","config","deprecation","identity"],"mappings":";;;;;AAKA,yBAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,GAAA;AACjC,IAAA,MAAM,EAAEC,OAAAA,EAASC,UAAU,EAAE,GAAGF,MAAAA,CAAOG,MAAM,CAAC,SAAA,CAAA;AAE9C,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAGF,UAAAA,CAAW,OAAA,CAAA;AAC9B,IAAA,MAAM,EAAEG,kCAAkC,EAAEC,oBAAoB,EAAE,GAAGJ,UAAAA,CAAW,WAAA,CAAA;IAEhF,OAAO;AACL;;;;AAIC,QACDK,mCAAkCC,WAA+B,EAAA;YAC/D,MAAMC,IAAAA,GAAOL,MAAAA,CAAOM,+BAA+B,CAACF,WAAAA,CAAAA;YACpD,MAAMG,QAAAA,GAAWP,MAAAA,CAAOQ,WAAW,CAACJ,WAAAA,CAAAA;AACpC,YAAA,MAAM,EAAEK,iBAAiB,EAAE,GAAGX,UAAAA,CAAW,UAAA,CAAA,CAAYY,GAAG,CAAC,aAAA,CAAA;AAEzD,YAAA,OAAOC,gBAAAA,CAAW;AAChBN,gBAAAA,IAAAA;AACAO,gBAAAA,UAAAA,CAAAA,CAAWC,CAAC,EAAA;;AAGVA,oBAAAA,CAAAA,CAAEC,OAAO,CAACC,IAAI,CAACC,KAAK,CAAC,OAAA,EAAS;AAC5BC,wBAAAA,IAAAA,EAAMH,aAAAA,CAAQP,QAAAA,CAAAA;AACdW,wBAAAA,OAAAA,EAAS,CAACC,MAAAA,GAAWC,gBAAAA,CAAUD,MAAAA,EAAQE,OAAO,EAAE;AAClD,qBAAA,CAAA;AAEAR,oBAAAA,CAAAA,CAAEC,OAAO,CAACE,KAAK,CAAC,UAAA,EAAY;wBAC1BC,IAAAA,EAAMf,oBAAAA;wBACNgB,OAAAA,EAAST;AACX,qBAAA,CAAA;AAEA,oBAAA,IAAIb,OAAOG,MAAM,CAAC,WAAWuB,MAAM,CAAC,uBAAuB,KAAA,CAAA,EAAQ;AACjET,wBAAAA,CAAAA,CAAEC,OAAO,CAACC,IAAI,CAACC,KAAK,CAAC,MAAA,EAAQ;4BAC3BO,WAAAA,EAAa,2BAAA;AACbN,4BAAAA,IAAAA,EAAMH,aAAAA,CAAQP,QAAAA,CAAAA;AACdW,4BAAAA,OAAAA,EAAS,CAACC,MAAAA,GAAWC,gBAAAA,CAAUD,MAAAA,EAAQE,OAAO,EAAE;AAClD,yBAAA,CAAA;AAEAR,wBAAAA,CAAAA,CAAEC,OAAO,CAACE,KAAK,CAAC,MAAA,EAAQ;4BACtBO,WAAAA,EAAa,kCAAA;4BACbN,IAAAA,EAAMhB,kCAAAA;4BACNiB,OAAAA,EAASM;AACX,yBAAA,CAAA;AACF,oBAAA;AACF,gBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { objectType, nonNull } from 'nexus';
|
|
2
|
-
import {
|
|
2
|
+
import { defaultTo, identity } from 'lodash';
|
|
3
3
|
|
|
4
4
|
var responseCollection = (({ strapi })=>{
|
|
5
5
|
const { service: getService } = strapi.plugin('graphql');
|
|
@@ -20,7 +20,7 @@ var responseCollection = (({ strapi })=>{
|
|
|
20
20
|
// NOTE: add edges & cursor based pagination to support the relay spec in a later version
|
|
21
21
|
t.nonNull.list.field('nodes', {
|
|
22
22
|
type: nonNull(typeName),
|
|
23
|
-
resolve:
|
|
23
|
+
resolve: (parent)=>defaultTo(parent?.nodes, [])
|
|
24
24
|
});
|
|
25
25
|
t.nonNull.field('pageInfo', {
|
|
26
26
|
type: PAGINATION_TYPE_NAME,
|
|
@@ -30,7 +30,7 @@ var responseCollection = (({ strapi })=>{
|
|
|
30
30
|
t.nonNull.list.field('data', {
|
|
31
31
|
deprecation: 'Use `nodes` field instead',
|
|
32
32
|
type: nonNull(typeName),
|
|
33
|
-
resolve:
|
|
33
|
+
resolve: (parent)=>defaultTo(parent?.nodes, [])
|
|
34
34
|
});
|
|
35
35
|
t.nonNull.field('meta', {
|
|
36
36
|
deprecation: 'Use the `pageInfo` field instead',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-collection.mjs","sources":["../../../../server/src/services/builders/response-collection.ts"],"sourcesContent":["import { objectType, nonNull } from 'nexus';\nimport { defaultTo,
|
|
1
|
+
{"version":3,"file":"response-collection.mjs","sources":["../../../../server/src/services/builders/response-collection.ts"],"sourcesContent":["import { objectType, nonNull } from 'nexus';\nimport { defaultTo, identity } from 'lodash';\nimport type { Schema } from '@strapi/types';\nimport type { Context } from '../types';\n\nexport default ({ strapi }: Context) => {\n const { service: getService } = strapi.plugin('graphql');\n\n const { naming } = getService('utils');\n const { RESPONSE_COLLECTION_META_TYPE_NAME, PAGINATION_TYPE_NAME } = getService('constants');\n\n return {\n /**\n * Build a type definition for a content API collection response for a given content type\n * @param {Schema.ContentType} contentType The content type which will be used to build its content API response definition\n * @return {NexusObjectTypeDef}\n */\n buildResponseCollectionDefinition(contentType: Schema.ContentType) {\n const name = naming.getEntityResponseCollectionName(contentType);\n const typeName = naming.getTypeName(contentType);\n const { resolvePagination } = getService('builders').get('content-api');\n\n return objectType({\n name,\n definition(t) {\n // NOTE: add edges & cursor based pagination to support the relay spec in a later version\n\n t.nonNull.list.field('nodes', {\n type: nonNull(typeName),\n resolve: (parent) => defaultTo(parent?.nodes, []),\n });\n\n t.nonNull.field('pageInfo', {\n type: PAGINATION_TYPE_NAME,\n resolve: resolvePagination,\n });\n\n if (strapi.plugin('graphql').config('v4CompatibilityMode', false)) {\n t.nonNull.list.field('data', {\n deprecation: 'Use `nodes` field instead',\n type: nonNull(typeName),\n resolve: (parent) => defaultTo(parent?.nodes, []),\n });\n\n t.nonNull.field('meta', {\n deprecation: 'Use the `pageInfo` field instead',\n type: RESPONSE_COLLECTION_META_TYPE_NAME,\n resolve: identity,\n });\n }\n },\n });\n },\n };\n};\n"],"names":["strapi","service","getService","plugin","naming","RESPONSE_COLLECTION_META_TYPE_NAME","PAGINATION_TYPE_NAME","buildResponseCollectionDefinition","contentType","name","getEntityResponseCollectionName","typeName","getTypeName","resolvePagination","get","objectType","definition","t","nonNull","list","field","type","resolve","parent","defaultTo","nodes","config","deprecation","identity"],"mappings":";;;AAKA,yBAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,GAAA;AACjC,IAAA,MAAM,EAAEC,OAAAA,EAASC,UAAU,EAAE,GAAGF,MAAAA,CAAOG,MAAM,CAAC,SAAA,CAAA;AAE9C,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAGF,UAAAA,CAAW,OAAA,CAAA;AAC9B,IAAA,MAAM,EAAEG,kCAAkC,EAAEC,oBAAoB,EAAE,GAAGJ,UAAAA,CAAW,WAAA,CAAA;IAEhF,OAAO;AACL;;;;AAIC,QACDK,mCAAkCC,WAA+B,EAAA;YAC/D,MAAMC,IAAAA,GAAOL,MAAAA,CAAOM,+BAA+B,CAACF,WAAAA,CAAAA;YACpD,MAAMG,QAAAA,GAAWP,MAAAA,CAAOQ,WAAW,CAACJ,WAAAA,CAAAA;AACpC,YAAA,MAAM,EAAEK,iBAAiB,EAAE,GAAGX,UAAAA,CAAW,UAAA,CAAA,CAAYY,GAAG,CAAC,aAAA,CAAA;AAEzD,YAAA,OAAOC,UAAAA,CAAW;AAChBN,gBAAAA,IAAAA;AACAO,gBAAAA,UAAAA,CAAAA,CAAWC,CAAC,EAAA;;AAGVA,oBAAAA,CAAAA,CAAEC,OAAO,CAACC,IAAI,CAACC,KAAK,CAAC,OAAA,EAAS;AAC5BC,wBAAAA,IAAAA,EAAMH,OAAAA,CAAQP,QAAAA,CAAAA;AACdW,wBAAAA,OAAAA,EAAS,CAACC,MAAAA,GAAWC,SAAAA,CAAUD,MAAAA,EAAQE,OAAO,EAAE;AAClD,qBAAA,CAAA;AAEAR,oBAAAA,CAAAA,CAAEC,OAAO,CAACE,KAAK,CAAC,UAAA,EAAY;wBAC1BC,IAAAA,EAAMf,oBAAAA;wBACNgB,OAAAA,EAAST;AACX,qBAAA,CAAA;AAEA,oBAAA,IAAIb,OAAOG,MAAM,CAAC,WAAWuB,MAAM,CAAC,uBAAuB,KAAA,CAAA,EAAQ;AACjET,wBAAAA,CAAAA,CAAEC,OAAO,CAACC,IAAI,CAACC,KAAK,CAAC,MAAA,EAAQ;4BAC3BO,WAAAA,EAAa,2BAAA;AACbN,4BAAAA,IAAAA,EAAMH,OAAAA,CAAQP,QAAAA,CAAAA;AACdW,4BAAAA,OAAAA,EAAS,CAACC,MAAAA,GAAWC,SAAAA,CAAUD,MAAAA,EAAQE,OAAO,EAAE;AAClD,yBAAA,CAAA;AAEAR,wBAAAA,CAAAA,CAAEC,OAAO,CAACE,KAAK,CAAC,MAAA,EAAQ;4BACtBO,WAAAA,EAAa,kCAAA;4BACbN,IAAAA,EAAMhB,kCAAAA;4BACNiB,OAAAA,EAASM;AACX,yBAAA,CAAA;AACF,oBAAA;AACF,gBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var nexus = require('nexus');
|
|
4
|
-
var fp = require('lodash/fp');
|
|
5
4
|
|
|
6
5
|
var response = (({ strapi })=>{
|
|
7
6
|
const { naming } = strapi.plugin('graphql').service('utils');
|
|
@@ -16,7 +15,7 @@ var response = (({ strapi })=>{
|
|
|
16
15
|
definition (t) {
|
|
17
16
|
t.field('data', {
|
|
18
17
|
type: typeName,
|
|
19
|
-
resolve:
|
|
18
|
+
resolve: (parent)=>parent?.value
|
|
20
19
|
});
|
|
21
20
|
}
|
|
22
21
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sources":["../../../../server/src/services/builders/response.ts"],"sourcesContent":["import { objectType } from 'nexus';\nimport
|
|
1
|
+
{"version":3,"file":"response.js","sources":["../../../../server/src/services/builders/response.ts"],"sourcesContent":["import { objectType } from 'nexus';\nimport type { Schema } from '@strapi/types';\nimport type { Context } from '../types';\n\nexport default ({ strapi }: Context) => {\n const { naming } = strapi.plugin('graphql').service('utils');\n\n return {\n /**\n * Build a type definition for a content API response for a given content type\n */\n buildResponseDefinition(contentType: Schema.ContentType) {\n const name = naming.getEntityResponseName(contentType);\n const typeName = naming.getTypeName(contentType);\n\n return objectType({\n name,\n\n definition(t) {\n t.field('data', {\n type: typeName,\n\n resolve: (parent) => parent?.value,\n });\n },\n });\n },\n };\n};\n"],"names":["strapi","naming","plugin","service","buildResponseDefinition","contentType","name","getEntityResponseName","typeName","getTypeName","objectType","definition","t","field","type","resolve","parent","value"],"mappings":";;;;AAIA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,GAAA;IACjC,MAAM,EAAEC,MAAM,EAAE,GAAGD,OAAOE,MAAM,CAAC,SAAA,CAAA,CAAWC,OAAO,CAAC,OAAA,CAAA;IAEpD,OAAO;AACL;;AAEC,QACDC,yBAAwBC,WAA+B,EAAA;YACrD,MAAMC,IAAAA,GAAOL,MAAAA,CAAOM,qBAAqB,CAACF,WAAAA,CAAAA;YAC1C,MAAMG,QAAAA,GAAWP,MAAAA,CAAOQ,WAAW,CAACJ,WAAAA,CAAAA;AAEpC,YAAA,OAAOK,gBAAAA,CAAW;AAChBJ,gBAAAA,IAAAA;AAEAK,gBAAAA,UAAAA,CAAAA,CAAWC,CAAC,EAAA;oBACVA,CAAAA,CAAEC,KAAK,CAAC,MAAA,EAAQ;wBACdC,IAAAA,EAAMN,QAAAA;wBAENO,OAAAA,EAAS,CAACC,SAAWA,MAAAA,EAAQC;AAC/B,qBAAA,CAAA;AACF,gBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { objectType } from 'nexus';
|
|
2
|
-
import { prop } from 'lodash/fp';
|
|
3
2
|
|
|
4
3
|
var response = (({ strapi })=>{
|
|
5
4
|
const { naming } = strapi.plugin('graphql').service('utils');
|
|
@@ -14,7 +13,7 @@ var response = (({ strapi })=>{
|
|
|
14
13
|
definition (t) {
|
|
15
14
|
t.field('data', {
|
|
16
15
|
type: typeName,
|
|
17
|
-
resolve:
|
|
16
|
+
resolve: (parent)=>parent?.value
|
|
18
17
|
});
|
|
19
18
|
}
|
|
20
19
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.mjs","sources":["../../../../server/src/services/builders/response.ts"],"sourcesContent":["import { objectType } from 'nexus';\nimport
|
|
1
|
+
{"version":3,"file":"response.mjs","sources":["../../../../server/src/services/builders/response.ts"],"sourcesContent":["import { objectType } from 'nexus';\nimport type { Schema } from '@strapi/types';\nimport type { Context } from '../types';\n\nexport default ({ strapi }: Context) => {\n const { naming } = strapi.plugin('graphql').service('utils');\n\n return {\n /**\n * Build a type definition for a content API response for a given content type\n */\n buildResponseDefinition(contentType: Schema.ContentType) {\n const name = naming.getEntityResponseName(contentType);\n const typeName = naming.getTypeName(contentType);\n\n return objectType({\n name,\n\n definition(t) {\n t.field('data', {\n type: typeName,\n\n resolve: (parent) => parent?.value,\n });\n },\n });\n },\n };\n};\n"],"names":["strapi","naming","plugin","service","buildResponseDefinition","contentType","name","getEntityResponseName","typeName","getTypeName","objectType","definition","t","field","type","resolve","parent","value"],"mappings":";;AAIA,eAAe,CAAA,CAAC,EAAEA,MAAM,EAAW,GAAA;IACjC,MAAM,EAAEC,MAAM,EAAE,GAAGD,OAAOE,MAAM,CAAC,SAAA,CAAA,CAAWC,OAAO,CAAC,OAAA,CAAA;IAEpD,OAAO;AACL;;AAEC,QACDC,yBAAwBC,WAA+B,EAAA;YACrD,MAAMC,IAAAA,GAAOL,MAAAA,CAAOM,qBAAqB,CAACF,WAAAA,CAAAA;YAC1C,MAAMG,QAAAA,GAAWP,MAAAA,CAAOQ,WAAW,CAACJ,WAAAA,CAAAA;AAEpC,YAAA,OAAOK,UAAAA,CAAW;AAChBJ,gBAAAA,IAAAA;AAEAK,gBAAAA,UAAAA,CAAAA,CAAWC,CAAC,EAAA;oBACVA,CAAAA,CAAEC,KAAK,CAAC,MAAA,EAAQ;wBACdC,IAAAA,EAAMN,QAAAA;wBAENO,OAAAA,EAAS,CAACC,SAAWA,MAAAA,EAAQC;AAC/B,qBAAA,CAAA;AACF,gBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -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 = require('@strapi/utils');
|
|
6
6
|
|
|
@@ -65,7 +65,7 @@ var typeBuilder = ((context)=>{
|
|
|
65
65
|
const { components } = contentType.attributes[attributeName];
|
|
66
66
|
const isEmpty = components.length === 0;
|
|
67
67
|
const type = naming.getDynamicZoneName(contentType, attributeName);
|
|
68
|
-
const resolve = isEmpty ?
|
|
68
|
+
const resolve = isEmpty ? lodash.constant({
|
|
69
69
|
code: ERROR_CODES.emptyDynamicZone,
|
|
70
70
|
message: `This dynamic zone don't have any component attached to it`
|
|
71
71
|
}) : buildDynamicZoneResolver({
|
|
@@ -159,12 +159,12 @@ var typeBuilder = ((context)=>{
|
|
|
159
159
|
strapi
|
|
160
160
|
});
|
|
161
161
|
// If there is no specific target specified, then use the GenericMorph type
|
|
162
|
-
if (
|
|
162
|
+
if (target === undefined) {
|
|
163
163
|
builder.field(attributeName, {
|
|
164
164
|
type: GENERIC_MORPH_TYPENAME,
|
|
165
165
|
resolve
|
|
166
166
|
});
|
|
167
|
-
} else if (
|
|
167
|
+
} else if (Array.isArray(target) && target.every(lodash.isString)) {
|
|
168
168
|
const type = naming.getMorphRelationTypeName(contentType, attributeName);
|
|
169
169
|
builder.field(attributeName, {
|
|
170
170
|
type,
|