@payloadcms/graphql 3.0.0-beta.11 → 3.0.0-beta.111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/bin.js +54 -0
  2. package/dist/bin/generateSchema.d.ts +3 -0
  3. package/dist/bin/generateSchema.d.ts.map +1 -0
  4. package/dist/bin/generateSchema.js +10 -0
  5. package/dist/bin/generateSchema.js.map +1 -0
  6. package/dist/bin/index.d.ts +2 -0
  7. package/dist/bin/index.d.ts.map +1 -0
  8. package/dist/bin/index.js +17 -0
  9. package/dist/bin/index.js.map +1 -0
  10. package/dist/exports/types.d.ts +4 -0
  11. package/dist/exports/types.d.ts.map +1 -0
  12. package/dist/exports/types.js +5 -0
  13. package/dist/exports/types.js.map +1 -0
  14. package/dist/exports/utilities.d.ts +3 -0
  15. package/dist/exports/utilities.d.ts.map +1 -0
  16. package/dist/exports/utilities.js +4 -0
  17. package/dist/exports/utilities.js.map +1 -0
  18. package/dist/index.d.ts +3 -3
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +11 -11
  21. package/dist/index.js.map +1 -1
  22. package/dist/packages/graphql-query-complexity/QueryComplexity.d.ts +51 -0
  23. package/dist/packages/graphql-query-complexity/QueryComplexity.d.ts.map +1 -0
  24. package/dist/packages/graphql-query-complexity/QueryComplexity.js +270 -0
  25. package/dist/packages/graphql-query-complexity/QueryComplexity.js.map +1 -0
  26. package/dist/packages/graphql-query-complexity/createComplexityRule.d.ts +5 -0
  27. package/dist/packages/graphql-query-complexity/createComplexityRule.d.ts.map +1 -0
  28. package/dist/packages/graphql-query-complexity/createComplexityRule.js +8 -0
  29. package/dist/packages/graphql-query-complexity/createComplexityRule.js.map +1 -0
  30. package/dist/packages/graphql-query-complexity/estimators/fieldExtensions/index.d.ts +3 -0
  31. package/dist/packages/graphql-query-complexity/estimators/fieldExtensions/index.d.ts.map +1 -0
  32. package/dist/packages/graphql-query-complexity/estimators/fieldExtensions/index.js +14 -0
  33. package/dist/packages/graphql-query-complexity/estimators/fieldExtensions/index.js.map +1 -0
  34. package/dist/packages/graphql-query-complexity/estimators/simple/index.d.ts +5 -0
  35. package/dist/packages/graphql-query-complexity/estimators/simple/index.d.ts.map +1 -0
  36. package/dist/packages/graphql-query-complexity/estimators/simple/index.js +8 -0
  37. package/dist/packages/graphql-query-complexity/estimators/simple/index.js.map +1 -0
  38. package/dist/packages/graphql-query-complexity/index.d.ts +4 -0
  39. package/dist/packages/graphql-query-complexity/index.d.ts.map +1 -0
  40. package/dist/packages/graphql-query-complexity/index.js +5 -0
  41. package/dist/packages/graphql-query-complexity/index.js.map +1 -0
  42. package/dist/packages/graphql-type-json/index.d.ts +4 -0
  43. package/dist/packages/graphql-type-json/index.d.ts.map +1 -0
  44. package/dist/packages/graphql-type-json/index.js +63 -0
  45. package/dist/packages/graphql-type-json/index.js.map +1 -0
  46. package/dist/resolvers/auth/access.d.ts +2 -3
  47. package/dist/resolvers/auth/access.d.ts.map +1 -1
  48. package/dist/resolvers/auth/access.js +3 -5
  49. package/dist/resolvers/auth/access.js.map +1 -1
  50. package/dist/resolvers/auth/forgotPassword.d.ts +2 -3
  51. package/dist/resolvers/auth/forgotPassword.d.ts.map +1 -1
  52. package/dist/resolvers/auth/forgotPassword.js +4 -5
  53. package/dist/resolvers/auth/forgotPassword.js.map +1 -1
  54. package/dist/resolvers/auth/init.d.ts +1 -2
  55. package/dist/resolvers/auth/init.d.ts.map +1 -1
  56. package/dist/resolvers/auth/init.js +2 -4
  57. package/dist/resolvers/auth/init.js.map +1 -1
  58. package/dist/resolvers/auth/login.d.ts +2 -3
  59. package/dist/resolvers/auth/login.d.ts.map +1 -1
  60. package/dist/resolvers/auth/login.js +4 -6
  61. package/dist/resolvers/auth/login.js.map +1 -1
  62. package/dist/resolvers/auth/logout.d.ts +2 -3
  63. package/dist/resolvers/auth/logout.d.ts.map +1 -1
  64. package/dist/resolvers/auth/logout.js +2 -5
  65. package/dist/resolvers/auth/logout.js.map +1 -1
  66. package/dist/resolvers/auth/me.d.ts +2 -3
  67. package/dist/resolvers/auth/me.d.ts.map +1 -1
  68. package/dist/resolvers/auth/me.js +4 -4
  69. package/dist/resolvers/auth/me.js.map +1 -1
  70. package/dist/resolvers/auth/refresh.d.ts +2 -3
  71. package/dist/resolvers/auth/refresh.d.ts.map +1 -1
  72. package/dist/resolvers/auth/refresh.js +4 -13
  73. package/dist/resolvers/auth/refresh.js.map +1 -1
  74. package/dist/resolvers/auth/resetPassword.d.ts +2 -3
  75. package/dist/resolvers/auth/resetPassword.d.ts.map +1 -1
  76. package/dist/resolvers/auth/resetPassword.js +8 -7
  77. package/dist/resolvers/auth/resetPassword.js.map +1 -1
  78. package/dist/resolvers/auth/unlock.d.ts +2 -3
  79. package/dist/resolvers/auth/unlock.d.ts.map +1 -1
  80. package/dist/resolvers/auth/unlock.js +4 -5
  81. package/dist/resolvers/auth/unlock.js.map +1 -1
  82. package/dist/resolvers/auth/verifyEmail.d.ts +2 -3
  83. package/dist/resolvers/auth/verifyEmail.d.ts.map +1 -1
  84. package/dist/resolvers/auth/verifyEmail.js +8 -6
  85. package/dist/resolvers/auth/verifyEmail.js.map +1 -1
  86. package/dist/resolvers/collections/count.d.ts +12 -0
  87. package/dist/resolvers/collections/count.d.ts.map +1 -0
  88. package/dist/resolvers/collections/count.js +22 -0
  89. package/dist/resolvers/collections/count.js.map +1 -0
  90. package/dist/resolvers/collections/create.d.ts +5 -8
  91. package/dist/resolvers/collections/create.d.ts.map +1 -1
  92. package/dist/resolvers/collections/create.js +2 -3
  93. package/dist/resolvers/collections/create.js.map +1 -1
  94. package/dist/resolvers/collections/delete.d.ts +6 -6
  95. package/dist/resolvers/collections/delete.d.ts.map +1 -1
  96. package/dist/resolvers/collections/delete.js +12 -6
  97. package/dist/resolvers/collections/delete.js.map +1 -1
  98. package/dist/resolvers/collections/docAccess.d.ts +1 -2
  99. package/dist/resolvers/collections/docAccess.d.ts.map +1 -1
  100. package/dist/resolvers/collections/docAccess.js +1 -2
  101. package/dist/resolvers/collections/docAccess.js.map +1 -1
  102. package/dist/resolvers/collections/duplicate.d.ts +4 -6
  103. package/dist/resolvers/collections/duplicate.d.ts.map +1 -1
  104. package/dist/resolvers/collections/duplicate.js +3 -3
  105. package/dist/resolvers/collections/duplicate.js.map +1 -1
  106. package/dist/resolvers/collections/find.d.ts +2 -4
  107. package/dist/resolvers/collections/find.d.ts.map +1 -1
  108. package/dist/resolvers/collections/find.js +16 -6
  109. package/dist/resolvers/collections/find.js.map +1 -1
  110. package/dist/resolvers/collections/findByID.d.ts +4 -6
  111. package/dist/resolvers/collections/findByID.d.ts.map +1 -1
  112. package/dist/resolvers/collections/findByID.js +10 -3
  113. package/dist/resolvers/collections/findByID.js.map +1 -1
  114. package/dist/resolvers/collections/findVersionByID.d.ts +2 -5
  115. package/dist/resolvers/collections/findVersionByID.d.ts.map +1 -1
  116. package/dist/resolvers/collections/findVersionByID.js +3 -4
  117. package/dist/resolvers/collections/findVersionByID.js.map +1 -1
  118. package/dist/resolvers/collections/findVersions.d.ts +3 -4
  119. package/dist/resolvers/collections/findVersions.d.ts.map +1 -1
  120. package/dist/resolvers/collections/findVersions.js +12 -6
  121. package/dist/resolvers/collections/findVersions.js.map +1 -1
  122. package/dist/resolvers/collections/restoreVersion.d.ts +3 -3
  123. package/dist/resolvers/collections/restoreVersion.d.ts.map +1 -1
  124. package/dist/resolvers/collections/restoreVersion.js +3 -3
  125. package/dist/resolvers/collections/restoreVersion.js.map +1 -1
  126. package/dist/resolvers/collections/update.d.ts +6 -7
  127. package/dist/resolvers/collections/update.d.ts.map +1 -1
  128. package/dist/resolvers/collections/update.js +12 -6
  129. package/dist/resolvers/collections/update.js.map +1 -1
  130. package/dist/resolvers/globals/docAccess.d.ts +1 -2
  131. package/dist/resolvers/globals/docAccess.d.ts.map +1 -1
  132. package/dist/resolvers/globals/docAccess.js +1 -2
  133. package/dist/resolvers/globals/docAccess.js.map +1 -1
  134. package/dist/resolvers/globals/findOne.d.ts +2 -2
  135. package/dist/resolvers/globals/findOne.d.ts.map +1 -1
  136. package/dist/resolvers/globals/findOne.js +8 -5
  137. package/dist/resolvers/globals/findOne.js.map +1 -1
  138. package/dist/resolvers/globals/findVersionByID.d.ts +2 -2
  139. package/dist/resolvers/globals/findVersionByID.d.ts.map +1 -1
  140. package/dist/resolvers/globals/findVersionByID.js +8 -5
  141. package/dist/resolvers/globals/findVersionByID.js.map +1 -1
  142. package/dist/resolvers/globals/findVersions.d.ts +2 -2
  143. package/dist/resolvers/globals/findVersions.d.ts.map +1 -1
  144. package/dist/resolvers/globals/findVersions.js +2 -3
  145. package/dist/resolvers/globals/findVersions.js.map +1 -1
  146. package/dist/resolvers/globals/index.d.ts +5 -5
  147. package/dist/resolvers/globals/index.d.ts.map +1 -1
  148. package/dist/resolvers/globals/index.js +5 -5
  149. package/dist/resolvers/globals/index.js.map +1 -1
  150. package/dist/resolvers/globals/restoreVersion.d.ts +3 -2
  151. package/dist/resolvers/globals/restoreVersion.d.ts.map +1 -1
  152. package/dist/resolvers/globals/restoreVersion.js +3 -3
  153. package/dist/resolvers/globals/restoreVersion.js.map +1 -1
  154. package/dist/resolvers/globals/update.d.ts +5 -6
  155. package/dist/resolvers/globals/update.d.ts.map +1 -1
  156. package/dist/resolvers/globals/update.js +8 -5
  157. package/dist/resolvers/globals/update.js.map +1 -1
  158. package/dist/resolvers/types.d.ts +1 -1
  159. package/dist/resolvers/types.d.ts.map +1 -1
  160. package/dist/resolvers/types.js.map +1 -1
  161. package/dist/schema/buildFallbackLocaleInputType.d.ts +2 -3
  162. package/dist/schema/buildFallbackLocaleInputType.d.ts.map +1 -1
  163. package/dist/schema/buildFallbackLocaleInputType.js +2 -3
  164. package/dist/schema/buildFallbackLocaleInputType.js.map +1 -1
  165. package/dist/schema/buildLocaleInputType.d.ts +2 -3
  166. package/dist/schema/buildLocaleInputType.d.ts.map +1 -1
  167. package/dist/schema/buildLocaleInputType.js +2 -3
  168. package/dist/schema/buildLocaleInputType.js.map +1 -1
  169. package/dist/schema/buildMutationInputType.d.ts +1 -2
  170. package/dist/schema/buildMutationInputType.d.ts.map +1 -1
  171. package/dist/schema/buildMutationInputType.js +62 -19
  172. package/dist/schema/buildMutationInputType.js.map +1 -1
  173. package/dist/schema/buildObjectType.d.ts +3 -4
  174. package/dist/schema/buildObjectType.d.ts.map +1 -1
  175. package/dist/schema/buildObjectType.js +303 -102
  176. package/dist/schema/buildObjectType.js.map +1 -1
  177. package/dist/schema/buildPaginatedListType.d.ts +1 -2
  178. package/dist/schema/buildPaginatedListType.d.ts.map +1 -1
  179. package/dist/schema/buildPaginatedListType.js +1 -2
  180. package/dist/schema/buildPaginatedListType.js.map +1 -1
  181. package/dist/schema/buildPoliciesType.d.ts +2 -2
  182. package/dist/schema/buildPoliciesType.d.ts.map +1 -1
  183. package/dist/schema/buildPoliciesType.js +7 -5
  184. package/dist/schema/buildPoliciesType.js.map +1 -1
  185. package/dist/schema/buildWhereInputType.d.ts +3 -3
  186. package/dist/schema/buildWhereInputType.d.ts.map +1 -1
  187. package/dist/schema/buildWhereInputType.js +6 -7
  188. package/dist/schema/buildWhereInputType.js.map +1 -1
  189. package/dist/schema/fieldToWhereInputSchemaMap.d.ts +2 -2
  190. package/dist/schema/fieldToWhereInputSchemaMap.d.ts.map +1 -1
  191. package/dist/schema/fieldToWhereInputSchemaMap.js +32 -9
  192. package/dist/schema/fieldToWhereInputSchemaMap.js.map +1 -1
  193. package/dist/schema/initCollections.d.ts +3 -4
  194. package/dist/schema/initCollections.d.ts.map +1 -1
  195. package/dist/schema/initCollections.js +83 -49
  196. package/dist/schema/initCollections.js.map +1 -1
  197. package/dist/schema/initGlobals.d.ts +3 -4
  198. package/dist/schema/initGlobals.d.ts.map +1 -1
  199. package/dist/schema/initGlobals.js +27 -21
  200. package/dist/schema/initGlobals.js.map +1 -1
  201. package/dist/schema/isFieldNullable.d.ts +2 -3
  202. package/dist/schema/isFieldNullable.d.ts.map +1 -1
  203. package/dist/schema/isFieldNullable.js +2 -3
  204. package/dist/schema/isFieldNullable.js.map +1 -1
  205. package/dist/schema/operators.d.ts +1 -2
  206. package/dist/schema/operators.d.ts.map +1 -1
  207. package/dist/schema/operators.js +1 -2
  208. package/dist/schema/operators.js.map +1 -1
  209. package/dist/schema/recursivelyBuildNestedPaths.d.ts +3 -3
  210. package/dist/schema/recursivelyBuildNestedPaths.d.ts.map +1 -1
  211. package/dist/schema/recursivelyBuildNestedPaths.js +3 -4
  212. package/dist/schema/recursivelyBuildNestedPaths.js.map +1 -1
  213. package/dist/schema/withNullableType.d.ts +2 -3
  214. package/dist/schema/withNullableType.d.ts.map +1 -1
  215. package/dist/schema/withNullableType.js +1 -2
  216. package/dist/schema/withNullableType.js.map +1 -1
  217. package/dist/schema/withOperators.d.ts +1 -1
  218. package/dist/schema/withOperators.d.ts.map +1 -1
  219. package/dist/schema/withOperators.js +13 -8
  220. package/dist/schema/withOperators.js.map +1 -1
  221. package/dist/utilities/combineParentName.d.ts +1 -2
  222. package/dist/utilities/combineParentName.d.ts.map +1 -1
  223. package/dist/utilities/combineParentName.js +2 -3
  224. package/dist/utilities/combineParentName.js.map +1 -1
  225. package/dist/utilities/formatName.d.ts +1 -2
  226. package/dist/utilities/formatName.d.ts.map +1 -1
  227. package/dist/utilities/formatName.js +1 -2
  228. package/dist/utilities/formatName.js.map +1 -1
  229. package/dist/utilities/formatName.spec.js +1 -1
  230. package/dist/utilities/formatName.spec.js.map +1 -1
  231. package/dist/utilities/formatOptions.d.ts +2 -3
  232. package/dist/utilities/formatOptions.d.ts.map +1 -1
  233. package/dist/utilities/formatOptions.js +2 -3
  234. package/dist/utilities/formatOptions.js.map +1 -1
  235. package/dist/utilities/groupOrTabHasRequiredSubfield.d.ts +1 -1
  236. package/dist/utilities/groupOrTabHasRequiredSubfield.d.ts.map +1 -1
  237. package/dist/utilities/groupOrTabHasRequiredSubfield.js +1 -1
  238. package/dist/utilities/groupOrTabHasRequiredSubfield.js.map +1 -1
  239. package/dist/utilities/wrapCustomResolver.d.ts +1 -1
  240. package/dist/utilities/wrapCustomResolver.d.ts.map +1 -1
  241. package/dist/utilities/wrapCustomResolver.js +1 -1
  242. package/dist/utilities/wrapCustomResolver.js.map +1 -1
  243. package/package.json +37 -24
  244. package/dist/utilities/getCheckIfLocaleObject.d.ts +0 -5
  245. package/dist/utilities/getCheckIfLocaleObject.d.ts.map +0 -1
  246. package/dist/utilities/getCheckIfLocaleObject.js +0 -3
  247. package/dist/utilities/getCheckIfLocaleObject.js.map +0 -1
  248. package/dist/utilities/uppercase.d.ts +0 -3
  249. package/dist/utilities/uppercase.d.ts.map +0 -1
  250. package/dist/utilities/uppercase.js +0 -11
  251. package/dist/utilities/uppercase.js.map +0 -1
  252. package/src/index.ts +0 -126
@@ -1,15 +1,14 @@
1
- /* eslint-disable @typescript-eslint/no-use-before-define */ /* eslint-disable no-await-in-loop */ /* eslint-disable no-restricted-syntax */ import { GraphQLBoolean, GraphQLEnumType, GraphQLFloat, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, GraphQLUnionType } from 'graphql';
1
+ import { GraphQLBoolean, GraphQLEnumType, GraphQLFloat, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, GraphQLUnionType } from 'graphql';
2
2
  import { DateTimeResolver, EmailAddressResolver } from 'graphql-scalars';
3
- /* eslint-disable no-use-before-define */ import { GraphQLJSON } from 'graphql-type-json';
4
- import { tabHasName } from 'payload/types';
5
- import { toWords } from 'payload/utilities';
6
- import combineParentName from '../utilities/combineParentName.js';
7
- import formatName from '../utilities/formatName.js';
8
- import formatOptions from '../utilities/formatOptions.js';
9
- import buildWhereInputType from './buildWhereInputType.js';
10
- import isFieldNullable from './isFieldNullable.js';
11
- import withNullableType from './withNullableType.js';
12
- function buildObjectType({ name, baseFields = {}, config, fields, forceNullable, graphqlResult, parentName }) {
3
+ import { combineQueries, createDataloaderCacheKey, MissingEditorProp, toWords } from 'payload';
4
+ import { tabHasName } from 'payload/shared';
5
+ import { GraphQLJSON } from '../packages/graphql-type-json/index.js';
6
+ import { combineParentName } from '../utilities/combineParentName.js';
7
+ import { formatName } from '../utilities/formatName.js';
8
+ import { formatOptions } from '../utilities/formatOptions.js';
9
+ import { isFieldNullable } from './isFieldNullable.js';
10
+ import { withNullableType } from './withNullableType.js';
11
+ export function buildObjectType({ name, baseFields = {}, config, fields, forceNullable, graphqlResult, parentName }) {
13
12
  const fieldToSchemaMap = {
14
13
  array: (objectTypeConfig, field)=>{
15
14
  const interfaceName = field?.interfaceName || combineParentName(parentName, toWords(field.name, true));
@@ -94,7 +93,9 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
94
93
  }),
95
94
  collapsible: (objectTypeConfig, field)=>field.fields.reduce((objectTypeConfigWithCollapsibleFields, subField)=>{
96
95
  const addSubField = fieldToSchemaMap[subField.type];
97
- if (addSubField) return addSubField(objectTypeConfigWithCollapsibleFields, subField);
96
+ if (addSubField) {
97
+ return addSubField(objectTypeConfigWithCollapsibleFields, subField);
98
+ }
98
99
  return objectTypeConfigWithCollapsibleFields;
99
100
  }, objectTypeConfig),
100
101
  date: (objectTypeConfig, field)=>({
@@ -130,10 +131,71 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
130
131
  return {
131
132
  ...objectTypeConfig,
132
133
  [field.name]: {
133
- type: graphqlResult.types.groupTypes[interfaceName]
134
+ type: graphqlResult.types.groupTypes[interfaceName],
135
+ resolve: (parent, args, context)=>{
136
+ return {
137
+ ...parent[field.name],
138
+ _id: parent._id ?? parent.id
139
+ };
140
+ }
134
141
  }
135
142
  };
136
143
  },
144
+ join: (objectTypeConfig, field)=>{
145
+ const joinName = combineParentName(parentName, toWords(field.name, true));
146
+ const joinType = {
147
+ type: new GraphQLObjectType({
148
+ name: joinName,
149
+ fields: {
150
+ docs: {
151
+ type: new GraphQLList(graphqlResult.collections[field.collection].graphQL.type)
152
+ },
153
+ hasNextPage: {
154
+ type: GraphQLBoolean
155
+ }
156
+ }
157
+ }),
158
+ args: {
159
+ limit: {
160
+ type: GraphQLInt
161
+ },
162
+ sort: {
163
+ type: GraphQLString
164
+ },
165
+ where: {
166
+ type: graphqlResult.collections[field.collection].graphQL.whereInputType
167
+ }
168
+ },
169
+ extensions: {
170
+ complexity: 10
171
+ },
172
+ async resolve (parent, args, context) {
173
+ const { collection } = field;
174
+ const { limit, sort, where } = args;
175
+ const { req } = context;
176
+ const fullWhere = combineQueries(where, {
177
+ [field.on]: {
178
+ equals: parent._id ?? parent.id
179
+ }
180
+ });
181
+ const results = await req.payload.find({
182
+ collection,
183
+ depth: 0,
184
+ fallbackLocale: req.fallbackLocale,
185
+ limit,
186
+ locale: req.locale,
187
+ req,
188
+ sort,
189
+ where: fullWhere
190
+ });
191
+ return results;
192
+ }
193
+ };
194
+ return {
195
+ ...objectTypeConfig,
196
+ [field.name]: joinType
197
+ };
198
+ },
137
199
  json: (objectTypeConfig, field)=>({
138
200
  ...objectTypeConfig,
139
201
  [field.name]: {
@@ -171,17 +233,19 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
171
233
  const relationshipName = combineParentName(parentName, toWords(field.name, true));
172
234
  let type;
173
235
  let relationToType = null;
236
+ const graphQLCollections = config.collections.filter((collectionConfig)=>collectionConfig.graphQL !== false);
174
237
  if (Array.isArray(relationTo)) {
175
238
  relationToType = new GraphQLEnumType({
176
239
  name: `${relationshipName}_RelationTo`,
177
- values: relationTo.reduce((relations, relation)=>({
240
+ values: relationTo.filter((relation)=>graphQLCollections.some((collection)=>collection.slug === relation)).reduce((relations, relation)=>({
178
241
  ...relations,
179
242
  [formatName(relation)]: {
180
243
  value: relation
181
244
  }
182
245
  }), {})
183
246
  });
184
- const types = relationTo.map((relation)=>graphqlResult.collections[relation].graphQL.type);
247
+ // Only pass collections that are GraphQL enabled
248
+ const types = relationTo.filter((relation)=>graphQLCollections.some((collection)=>collection.slug === relation)).map((relation)=>graphqlResult.collections[relation]?.graphQL.type);
185
249
  type = new GraphQLObjectType({
186
250
  name: `${relationshipName}_Relationship`,
187
251
  fields: {
@@ -191,7 +255,7 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
191
255
  value: {
192
256
  type: new GraphQLUnionType({
193
257
  name: relationshipName,
194
- async resolveType (data, { req }) {
258
+ resolveType (data) {
195
259
  return graphqlResult.collections[data.collection].graphQL.type.name;
196
260
  },
197
261
  types
@@ -208,6 +272,14 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
208
272
  // that is currently being created.
209
273
  type = type || newlyCreatedBlockType;
210
274
  const relationshipArgs = {};
275
+ const relationsUseDrafts = (Array.isArray(relationTo) ? relationTo : [
276
+ relationTo
277
+ ]).filter((relation)=>graphQLCollections.some((collection)=>collection.slug === relation)).some((relation)=>graphqlResult.collections[relation].config.versions?.drafts);
278
+ if (relationsUseDrafts) {
279
+ relationshipArgs.draft = {
280
+ type: GraphQLBoolean
281
+ };
282
+ }
211
283
  if (config.localization) {
212
284
  relationshipArgs.locale = {
213
285
  type: graphqlResult.types.localeInputType
@@ -227,38 +299,42 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
227
299
  const locale = args.locale || context.req.locale;
228
300
  const fallbackLocale = args.fallbackLocale || context.req.fallbackLocale;
229
301
  let relatedCollectionSlug = field.relationTo;
302
+ const draft = Boolean(args.draft ?? context.req.query?.draft);
230
303
  if (hasManyValues) {
231
304
  const results = [];
232
305
  const resultPromises = [];
233
306
  const createPopulationPromise = async (relatedDoc, i)=>{
234
307
  let id = relatedDoc;
235
308
  let collectionSlug = field.relationTo;
236
- if (isRelatedToManyCollections) {
237
- collectionSlug = relatedDoc.relationTo;
238
- id = relatedDoc.value;
239
- }
240
- const result = await context.req.payloadDataLoader.load(JSON.stringify([
241
- context.req.transactionID,
242
- collectionSlug,
243
- id,
244
- 0,
245
- 0,
246
- locale,
247
- fallbackLocale,
248
- false,
249
- false
250
- ]));
251
- if (result) {
309
+ if (graphQLCollections.some((collection)=>collection.slug === collectionSlug)) {
252
310
  if (isRelatedToManyCollections) {
253
- results[i] = {
254
- relationTo: collectionSlug,
255
- value: {
256
- ...result,
257
- collection: collectionSlug
258
- }
259
- };
260
- } else {
261
- results[i] = result;
311
+ collectionSlug = relatedDoc.relationTo;
312
+ id = relatedDoc.value;
313
+ }
314
+ const result = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
315
+ collectionSlug: collectionSlug,
316
+ currentDepth: 0,
317
+ depth: 0,
318
+ docID: id,
319
+ draft,
320
+ fallbackLocale,
321
+ locale,
322
+ overrideAccess: false,
323
+ showHiddenFields: false,
324
+ transactionID: context.req.transactionID
325
+ }));
326
+ if (result) {
327
+ if (isRelatedToManyCollections) {
328
+ results[i] = {
329
+ relationTo: collectionSlug,
330
+ value: {
331
+ ...result,
332
+ collection: collectionSlug
333
+ }
334
+ };
335
+ } else {
336
+ results[i] = result;
337
+ }
262
338
  }
263
339
  }
264
340
  };
@@ -276,28 +352,31 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
276
352
  relatedCollectionSlug = value.relationTo;
277
353
  }
278
354
  if (id) {
279
- const relatedDocument = await context.req.payloadDataLoader.load(JSON.stringify([
280
- context.req.transactionID,
281
- relatedCollectionSlug,
282
- id,
283
- 0,
284
- 0,
285
- locale,
286
- fallbackLocale,
287
- false,
288
- false
289
- ]));
290
- if (relatedDocument) {
291
- if (isRelatedToManyCollections) {
292
- return {
293
- relationTo: relatedCollectionSlug,
294
- value: {
295
- ...relatedDocument,
296
- collection: relatedCollectionSlug
297
- }
298
- };
355
+ if (graphQLCollections.some((collection)=>collection.slug === relatedCollectionSlug)) {
356
+ const relatedDocument = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
357
+ collectionSlug: relatedCollectionSlug,
358
+ currentDepth: 0,
359
+ depth: 0,
360
+ docID: id,
361
+ draft,
362
+ fallbackLocale,
363
+ locale,
364
+ overrideAccess: false,
365
+ showHiddenFields: false,
366
+ transactionID: context.req.transactionID
367
+ }));
368
+ if (relatedDocument) {
369
+ if (isRelatedToManyCollections) {
370
+ return {
371
+ relationTo: relatedCollectionSlug,
372
+ value: {
373
+ ...relatedDocument,
374
+ collection: relatedCollectionSlug
375
+ }
376
+ };
377
+ }
378
+ return relatedDocument;
299
379
  }
300
- return relatedDocument;
301
380
  }
302
381
  return null;
303
382
  }
@@ -320,26 +399,42 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
320
399
  },
321
400
  async resolve (parent, args, context) {
322
401
  let depth = config.defaultDepth;
323
- if (typeof args.depth !== 'undefined') depth = args.depth;
402
+ if (typeof args.depth !== 'undefined') {
403
+ depth = args.depth;
404
+ }
405
+ if (!field?.editor) {
406
+ throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor
407
+ ;
408
+ }
409
+ if (typeof field?.editor === 'function') {
410
+ throw new Error('Attempted to access unsanitized rich text editor.');
411
+ }
324
412
  const editor = field?.editor;
325
413
  // RichText fields have their own depth argument in GraphQL.
326
414
  // This is why the populationPromise (which populates richtext fields like uploads and relationships)
327
415
  // is run here again, with the provided depth.
328
416
  // In the graphql find.ts resolver, the depth is then hard-coded to 0.
329
417
  // Effectively, this means that the populationPromise for GraphQL is only run here, and not in the find.ts resolver / normal population promise.
330
- if (editor?.populationPromise) {
331
- await editor?.populationPromise({
418
+ if (editor?.graphQLPopulationPromises) {
419
+ const fieldPromises = [];
420
+ const populationPromises = [];
421
+ const populateDepth = field?.maxDepth !== undefined && field?.maxDepth < depth ? field?.maxDepth : depth;
422
+ editor?.graphQLPopulationPromises({
332
423
  context,
333
- depth,
424
+ depth: populateDepth,
425
+ draft: args.draft,
334
426
  field,
427
+ fieldPromises,
335
428
  findMany: false,
336
429
  flattenLocales: false,
337
430
  overrideAccess: false,
338
- populationPromises: [],
431
+ populationPromises,
339
432
  req: context.req,
340
433
  showHiddenFields: false,
341
434
  siblingDoc: parent
342
435
  });
436
+ await Promise.all(fieldPromises);
437
+ await Promise.all(populationPromises);
343
438
  }
344
439
  return parent[field.name];
345
440
  }
@@ -347,7 +442,9 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
347
442
  }),
348
443
  row: (objectTypeConfig, field)=>field.fields.reduce((objectTypeConfigWithRowFields, subField)=>{
349
444
  const addSubField = fieldToSchemaMap[subField.type];
350
- if (addSubField) return addSubField(objectTypeConfigWithRowFields, subField);
445
+ if (addSubField) {
446
+ return addSubField(objectTypeConfigWithRowFields, subField);
447
+ }
351
448
  return objectTypeConfigWithRowFields;
352
449
  }, objectTypeConfig),
353
450
  select: (objectTypeConfig, field)=>{
@@ -387,7 +484,13 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
387
484
  return {
388
485
  ...tabSchema,
389
486
  [tab.name]: {
390
- type: graphqlResult.types.groupTypes[interfaceName]
487
+ type: graphqlResult.types.groupTypes[interfaceName],
488
+ resolve (parent, args, context) {
489
+ return {
490
+ ...parent[tab.name],
491
+ _id: parent._id ?? parent.id
492
+ };
493
+ }
391
494
  }
392
495
  };
393
496
  }
@@ -395,7 +498,9 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
395
498
  ...tabSchema,
396
499
  ...tab.fields.reduce((subFieldSchema, subField)=>{
397
500
  const addSubField = fieldToSchemaMap[subField.type];
398
- if (addSubField) return addSubField(subFieldSchema, subField);
501
+ if (addSubField) {
502
+ return addSubField(subFieldSchema, subField);
503
+ }
399
504
  return subFieldSchema;
400
505
  }, tabSchema)
401
506
  };
@@ -414,61 +519,158 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
414
519
  }),
415
520
  upload: (objectTypeConfig, field)=>{
416
521
  const { relationTo } = field;
417
- const uploadName = combineParentName(parentName, toWords(field.name, true));
522
+ const isRelatedToManyCollections = Array.isArray(relationTo);
523
+ const hasManyValues = field.hasMany;
524
+ const relationshipName = combineParentName(parentName, toWords(field.name, true));
525
+ let type;
526
+ let relationToType = null;
527
+ if (Array.isArray(relationTo)) {
528
+ relationToType = new GraphQLEnumType({
529
+ name: `${relationshipName}_RelationTo`,
530
+ values: relationTo.reduce((relations, relation)=>({
531
+ ...relations,
532
+ [formatName(relation)]: {
533
+ value: relation
534
+ }
535
+ }), {})
536
+ });
537
+ const types = relationTo.map((relation)=>graphqlResult.collections[relation].graphQL.type);
538
+ type = new GraphQLObjectType({
539
+ name: `${relationshipName}_Relationship`,
540
+ fields: {
541
+ relationTo: {
542
+ type: relationToType
543
+ },
544
+ value: {
545
+ type: new GraphQLUnionType({
546
+ name: relationshipName,
547
+ resolveType (data) {
548
+ return graphqlResult.collections[data.collection].graphQL.type.name;
549
+ },
550
+ types
551
+ })
552
+ }
553
+ }
554
+ });
555
+ } else {
556
+ ({ type } = graphqlResult.collections[relationTo].graphQL);
557
+ }
418
558
  // If the relationshipType is undefined at this point,
419
559
  // it can be assumed that this blockType can have a relationship
420
560
  // to itself. Therefore, we set the relationshipType equal to the blockType
421
561
  // that is currently being created.
422
- const type = withNullableType(field, graphqlResult.collections[relationTo].graphQL.type || newlyCreatedBlockType, forceNullable);
423
- const uploadArgs = {};
562
+ type = type || newlyCreatedBlockType;
563
+ const relationshipArgs = {};
564
+ const relationsUseDrafts = (Array.isArray(relationTo) ? relationTo : [
565
+ relationTo
566
+ ]).some((relation)=>graphqlResult.collections[relation].config.versions?.drafts);
567
+ if (relationsUseDrafts) {
568
+ relationshipArgs.draft = {
569
+ type: GraphQLBoolean
570
+ };
571
+ }
424
572
  if (config.localization) {
425
- uploadArgs.locale = {
573
+ relationshipArgs.locale = {
426
574
  type: graphqlResult.types.localeInputType
427
575
  };
428
- uploadArgs.fallbackLocale = {
576
+ relationshipArgs.fallbackLocale = {
429
577
  type: graphqlResult.types.fallbackLocaleInputType
430
578
  };
431
579
  }
432
- const relatedCollectionSlug = field.relationTo;
433
- const upload = {
434
- type,
435
- args: uploadArgs,
580
+ const relationship = {
581
+ type: withNullableType(field, hasManyValues ? new GraphQLList(new GraphQLNonNull(type)) : type, forceNullable),
582
+ args: relationshipArgs,
436
583
  extensions: {
437
- complexity: 20
584
+ complexity: 10
438
585
  },
439
586
  async resolve (parent, args, context) {
440
587
  const value = parent[field.name];
441
588
  const locale = args.locale || context.req.locale;
442
589
  const fallbackLocale = args.fallbackLocale || context.req.fallbackLocale;
443
- const id = value;
590
+ let relatedCollectionSlug = field.relationTo;
591
+ const draft = Boolean(args.draft ?? context.req.query?.draft);
592
+ if (hasManyValues) {
593
+ const results = [];
594
+ const resultPromises = [];
595
+ const createPopulationPromise = async (relatedDoc, i)=>{
596
+ let id = relatedDoc;
597
+ let collectionSlug = field.relationTo;
598
+ if (isRelatedToManyCollections) {
599
+ collectionSlug = relatedDoc.relationTo;
600
+ id = relatedDoc.value;
601
+ }
602
+ const result = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
603
+ collectionSlug,
604
+ currentDepth: 0,
605
+ depth: 0,
606
+ docID: id,
607
+ draft,
608
+ fallbackLocale,
609
+ locale,
610
+ overrideAccess: false,
611
+ showHiddenFields: false,
612
+ transactionID: context.req.transactionID
613
+ }));
614
+ if (result) {
615
+ if (isRelatedToManyCollections) {
616
+ results[i] = {
617
+ relationTo: collectionSlug,
618
+ value: {
619
+ ...result,
620
+ collection: collectionSlug
621
+ }
622
+ };
623
+ } else {
624
+ results[i] = result;
625
+ }
626
+ }
627
+ };
628
+ if (value) {
629
+ value.forEach((relatedDoc, i)=>{
630
+ resultPromises.push(createPopulationPromise(relatedDoc, i));
631
+ });
632
+ }
633
+ await Promise.all(resultPromises);
634
+ return results;
635
+ }
636
+ let id = value;
637
+ if (isRelatedToManyCollections && value) {
638
+ id = value.value;
639
+ relatedCollectionSlug = value.relationTo;
640
+ }
444
641
  if (id) {
445
- const relatedDocument = await context.req.payloadDataLoader.load(JSON.stringify([
446
- context.req.transactionID,
447
- relatedCollectionSlug,
448
- id,
449
- 0,
450
- 0,
451
- locale,
642
+ const relatedDocument = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
643
+ collectionSlug: relatedCollectionSlug,
644
+ currentDepth: 0,
645
+ depth: 0,
646
+ docID: id,
647
+ draft,
452
648
  fallbackLocale,
453
- false,
454
- false
455
- ]));
456
- return relatedDocument || null;
649
+ locale,
650
+ overrideAccess: false,
651
+ showHiddenFields: false,
652
+ transactionID: context.req.transactionID
653
+ }));
654
+ if (relatedDocument) {
655
+ if (isRelatedToManyCollections) {
656
+ return {
657
+ relationTo: relatedCollectionSlug,
658
+ value: {
659
+ ...relatedDocument,
660
+ collection: relatedCollectionSlug
661
+ }
662
+ };
663
+ }
664
+ return relatedDocument;
665
+ }
666
+ return null;
457
667
  }
458
668
  return null;
459
669
  }
460
670
  };
461
- const whereFields = graphqlResult.collections[relationTo].config.fields;
462
- upload.args.where = {
463
- type: buildWhereInputType({
464
- name: uploadName,
465
- fields: whereFields,
466
- parentName: uploadName
467
- })
468
- };
469
671
  return {
470
672
  ...objectTypeConfig,
471
- [field.name]: upload
673
+ [field.name]: relationship
472
674
  };
473
675
  }
474
676
  };
@@ -488,6 +690,5 @@ function buildObjectType({ name, baseFields = {}, config, fields, forceNullable,
488
690
  const newlyCreatedBlockType = new GraphQLObjectType(objectSchema);
489
691
  return newlyCreatedBlockType;
490
692
  }
491
- export default buildObjectType;
492
693
 
493
694
  //# sourceMappingURL=buildObjectType.js.map