@payloadcms/graphql 3.0.0-canary.fb81f02 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/bin.js +51 -2
  2. package/dist/bin/index.js +2 -2
  3. package/dist/bin/index.js.map +1 -1
  4. package/dist/index.js +8 -8
  5. package/dist/index.js.map +1 -1
  6. package/dist/packages/graphql-query-complexity/QueryComplexity.d.ts +2 -2
  7. package/dist/packages/graphql-query-complexity/QueryComplexity.d.ts.map +1 -1
  8. package/dist/packages/graphql-query-complexity/QueryComplexity.js +6 -6
  9. package/dist/packages/graphql-query-complexity/QueryComplexity.js.map +1 -1
  10. package/dist/packages/graphql-query-complexity/createComplexityRule.d.ts +1 -1
  11. package/dist/packages/graphql-query-complexity/createComplexityRule.d.ts.map +1 -1
  12. package/dist/packages/graphql-query-complexity/createComplexityRule.js +1 -1
  13. package/dist/packages/graphql-query-complexity/createComplexityRule.js.map +1 -1
  14. package/dist/packages/graphql-type-json/index.js +4 -4
  15. package/dist/packages/graphql-type-json/index.js.map +1 -1
  16. package/dist/resolvers/auth/access.d.ts +1 -2
  17. package/dist/resolvers/auth/access.d.ts.map +1 -1
  18. package/dist/resolvers/auth/access.js +2 -3
  19. package/dist/resolvers/auth/access.js.map +1 -1
  20. package/dist/resolvers/auth/forgotPassword.d.ts +1 -2
  21. package/dist/resolvers/auth/forgotPassword.d.ts.map +1 -1
  22. package/dist/resolvers/auth/forgotPassword.js +1 -2
  23. package/dist/resolvers/auth/forgotPassword.js.map +1 -1
  24. package/dist/resolvers/auth/init.d.ts +1 -2
  25. package/dist/resolvers/auth/init.d.ts.map +1 -1
  26. package/dist/resolvers/auth/init.js +1 -2
  27. package/dist/resolvers/auth/init.js.map +1 -1
  28. package/dist/resolvers/auth/login.d.ts +1 -2
  29. package/dist/resolvers/auth/login.d.ts.map +1 -1
  30. package/dist/resolvers/auth/login.js +3 -4
  31. package/dist/resolvers/auth/login.js.map +1 -1
  32. package/dist/resolvers/auth/logout.d.ts +1 -2
  33. package/dist/resolvers/auth/logout.d.ts.map +1 -1
  34. package/dist/resolvers/auth/logout.js +4 -4
  35. package/dist/resolvers/auth/logout.js.map +1 -1
  36. package/dist/resolvers/auth/me.d.ts +1 -2
  37. package/dist/resolvers/auth/me.d.ts.map +1 -1
  38. package/dist/resolvers/auth/me.js +1 -2
  39. package/dist/resolvers/auth/me.js.map +1 -1
  40. package/dist/resolvers/auth/refresh.d.ts +1 -2
  41. package/dist/resolvers/auth/refresh.d.ts.map +1 -1
  42. package/dist/resolvers/auth/refresh.js +3 -4
  43. package/dist/resolvers/auth/refresh.js.map +1 -1
  44. package/dist/resolvers/auth/resetPassword.d.ts +1 -2
  45. package/dist/resolvers/auth/resetPassword.d.ts.map +1 -1
  46. package/dist/resolvers/auth/resetPassword.js +9 -6
  47. package/dist/resolvers/auth/resetPassword.js.map +1 -1
  48. package/dist/resolvers/auth/unlock.d.ts +1 -2
  49. package/dist/resolvers/auth/unlock.d.ts.map +1 -1
  50. package/dist/resolvers/auth/unlock.js +1 -2
  51. package/dist/resolvers/auth/unlock.js.map +1 -1
  52. package/dist/resolvers/auth/verifyEmail.d.ts +1 -2
  53. package/dist/resolvers/auth/verifyEmail.d.ts.map +1 -1
  54. package/dist/resolvers/auth/verifyEmail.js +7 -4
  55. package/dist/resolvers/auth/verifyEmail.js.map +1 -1
  56. package/dist/resolvers/collections/create.d.ts +1 -1
  57. package/dist/resolvers/collections/create.d.ts.map +1 -1
  58. package/dist/resolvers/collections/create.js +1 -1
  59. package/dist/resolvers/collections/create.js.map +1 -1
  60. package/dist/resolvers/collections/delete.d.ts.map +1 -1
  61. package/dist/resolvers/collections/delete.js +6 -2
  62. package/dist/resolvers/collections/delete.js.map +1 -1
  63. package/dist/resolvers/collections/duplicate.d.ts +1 -1
  64. package/dist/resolvers/collections/duplicate.d.ts.map +1 -1
  65. package/dist/resolvers/collections/duplicate.js +1 -1
  66. package/dist/resolvers/collections/duplicate.js.map +1 -1
  67. package/dist/resolvers/collections/find.d.ts.map +1 -1
  68. package/dist/resolvers/collections/find.js +6 -2
  69. package/dist/resolvers/collections/find.js.map +1 -1
  70. package/dist/resolvers/collections/findByID.d.ts.map +1 -1
  71. package/dist/resolvers/collections/findByID.js +6 -2
  72. package/dist/resolvers/collections/findByID.js.map +1 -1
  73. package/dist/resolvers/collections/findVersions.d.ts.map +1 -1
  74. package/dist/resolvers/collections/findVersions.js +6 -2
  75. package/dist/resolvers/collections/findVersions.js.map +1 -1
  76. package/dist/resolvers/collections/restoreVersion.d.ts +1 -1
  77. package/dist/resolvers/collections/restoreVersion.d.ts.map +1 -1
  78. package/dist/resolvers/collections/restoreVersion.js +1 -1
  79. package/dist/resolvers/collections/restoreVersion.js.map +1 -1
  80. package/dist/resolvers/collections/update.d.ts.map +1 -1
  81. package/dist/resolvers/collections/update.js +6 -2
  82. package/dist/resolvers/collections/update.js.map +1 -1
  83. package/dist/resolvers/globals/findOne.d.ts +1 -1
  84. package/dist/resolvers/globals/findOne.d.ts.map +1 -1
  85. package/dist/resolvers/globals/findOne.js +7 -3
  86. package/dist/resolvers/globals/findOne.js.map +1 -1
  87. package/dist/resolvers/globals/findVersionByID.d.ts +1 -1
  88. package/dist/resolvers/globals/findVersionByID.d.ts.map +1 -1
  89. package/dist/resolvers/globals/findVersionByID.js +7 -3
  90. package/dist/resolvers/globals/findVersionByID.js.map +1 -1
  91. package/dist/resolvers/globals/findVersions.d.ts +1 -1
  92. package/dist/resolvers/globals/findVersions.d.ts.map +1 -1
  93. package/dist/resolvers/globals/findVersions.js +1 -1
  94. package/dist/resolvers/globals/findVersions.js.map +1 -1
  95. package/dist/resolvers/globals/index.d.ts +5 -5
  96. package/dist/resolvers/globals/index.d.ts.map +1 -1
  97. package/dist/resolvers/globals/index.js +5 -5
  98. package/dist/resolvers/globals/index.js.map +1 -1
  99. package/dist/resolvers/globals/restoreVersion.d.ts +1 -1
  100. package/dist/resolvers/globals/restoreVersion.d.ts.map +1 -1
  101. package/dist/resolvers/globals/restoreVersion.js +1 -1
  102. package/dist/resolvers/globals/restoreVersion.js.map +1 -1
  103. package/dist/resolvers/globals/update.d.ts +1 -1
  104. package/dist/resolvers/globals/update.d.ts.map +1 -1
  105. package/dist/resolvers/globals/update.js +7 -3
  106. package/dist/resolvers/globals/update.js.map +1 -1
  107. package/dist/schema/buildFallbackLocaleInputType.d.ts +1 -2
  108. package/dist/schema/buildFallbackLocaleInputType.d.ts.map +1 -1
  109. package/dist/schema/buildFallbackLocaleInputType.js +2 -3
  110. package/dist/schema/buildFallbackLocaleInputType.js.map +1 -1
  111. package/dist/schema/buildLocaleInputType.d.ts +1 -2
  112. package/dist/schema/buildLocaleInputType.d.ts.map +1 -1
  113. package/dist/schema/buildLocaleInputType.js +2 -3
  114. package/dist/schema/buildLocaleInputType.js.map +1 -1
  115. package/dist/schema/buildMutationInputType.d.ts.map +1 -1
  116. package/dist/schema/buildMutationInputType.js +58 -14
  117. package/dist/schema/buildMutationInputType.js.map +1 -1
  118. package/dist/schema/buildObjectType.d.ts.map +1 -1
  119. package/dist/schema/buildObjectType.js +262 -86
  120. package/dist/schema/buildObjectType.js.map +1 -1
  121. package/dist/schema/buildPoliciesType.d.ts +1 -1
  122. package/dist/schema/buildPoliciesType.d.ts.map +1 -1
  123. package/dist/schema/buildPoliciesType.js +5 -3
  124. package/dist/schema/buildPoliciesType.js.map +1 -1
  125. package/dist/schema/buildWhereInputType.d.ts +2 -2
  126. package/dist/schema/buildWhereInputType.d.ts.map +1 -1
  127. package/dist/schema/buildWhereInputType.js +3 -4
  128. package/dist/schema/buildWhereInputType.js.map +1 -1
  129. package/dist/schema/fieldToWhereInputSchemaMap.d.ts +2 -2
  130. package/dist/schema/fieldToWhereInputSchemaMap.d.ts.map +1 -1
  131. package/dist/schema/fieldToWhereInputSchemaMap.js +31 -7
  132. package/dist/schema/fieldToWhereInputSchemaMap.js.map +1 -1
  133. package/dist/schema/initCollections.d.ts +2 -2
  134. package/dist/schema/initCollections.d.ts.map +1 -1
  135. package/dist/schema/initCollections.js +26 -22
  136. package/dist/schema/initCollections.js.map +1 -1
  137. package/dist/schema/initGlobals.d.ts +2 -2
  138. package/dist/schema/initGlobals.d.ts.map +1 -1
  139. package/dist/schema/initGlobals.js +17 -16
  140. package/dist/schema/initGlobals.js.map +1 -1
  141. package/dist/schema/isFieldNullable.d.ts +1 -2
  142. package/dist/schema/isFieldNullable.d.ts.map +1 -1
  143. package/dist/schema/isFieldNullable.js +1 -2
  144. package/dist/schema/isFieldNullable.js.map +1 -1
  145. package/dist/schema/operators.d.ts +1 -2
  146. package/dist/schema/operators.d.ts.map +1 -1
  147. package/dist/schema/operators.js +1 -2
  148. package/dist/schema/operators.js.map +1 -1
  149. package/dist/schema/recursivelyBuildNestedPaths.d.ts +2 -2
  150. package/dist/schema/recursivelyBuildNestedPaths.d.ts.map +1 -1
  151. package/dist/schema/recursivelyBuildNestedPaths.js +2 -3
  152. package/dist/schema/recursivelyBuildNestedPaths.js.map +1 -1
  153. package/dist/schema/withNullableType.d.ts +1 -2
  154. package/dist/schema/withNullableType.d.ts.map +1 -1
  155. package/dist/schema/withNullableType.js +1 -2
  156. package/dist/schema/withNullableType.js.map +1 -1
  157. package/dist/schema/withOperators.d.ts.map +1 -1
  158. package/dist/schema/withOperators.js +11 -6
  159. package/dist/schema/withOperators.js.map +1 -1
  160. package/dist/utilities/combineParentName.d.ts +1 -2
  161. package/dist/utilities/combineParentName.d.ts.map +1 -1
  162. package/dist/utilities/combineParentName.js +2 -3
  163. package/dist/utilities/combineParentName.js.map +1 -1
  164. package/dist/utilities/formatName.d.ts +1 -2
  165. package/dist/utilities/formatName.d.ts.map +1 -1
  166. package/dist/utilities/formatName.js +1 -2
  167. package/dist/utilities/formatName.js.map +1 -1
  168. package/dist/utilities/formatName.spec.js +1 -1
  169. package/dist/utilities/formatName.spec.js.map +1 -1
  170. package/dist/utilities/formatOptions.d.ts +1 -2
  171. package/dist/utilities/formatOptions.d.ts.map +1 -1
  172. package/dist/utilities/formatOptions.js +2 -3
  173. package/dist/utilities/formatOptions.js.map +1 -1
  174. package/license.md +22 -0
  175. package/package.json +18 -6
  176. package/dist/utilities/getCheckIfLocaleObject.d.ts +0 -5
  177. package/dist/utilities/getCheckIfLocaleObject.d.ts.map +0 -1
  178. package/dist/utilities/getCheckIfLocaleObject.js +0 -3
  179. package/dist/utilities/getCheckIfLocaleObject.js.map +0 -1
  180. package/dist/utilities/uppercase.d.ts +0 -3
  181. package/dist/utilities/uppercase.d.ts.map +0 -1
  182. package/dist/utilities/uppercase.js +0 -11
  183. package/dist/utilities/uppercase.js.map +0 -1
@@ -1,14 +1,13 @@
1
1
  import { GraphQLBoolean, GraphQLEnumType, GraphQLFloat, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString, GraphQLUnionType } from 'graphql';
2
2
  import { DateTimeResolver, EmailAddressResolver } from 'graphql-scalars';
3
- import { MissingEditorProp, createDataloaderCacheKey, toWords } from 'payload';
3
+ import { combineQueries, createDataloaderCacheKey, MissingEditorProp, toWords } from 'payload';
4
4
  import { tabHasName } from 'payload/shared';
5
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 buildWhereInputType from './buildWhereInputType.js';
10
- import isFieldNullable from './isFieldNullable.js';
11
- import withNullableType from './withNullableType.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';
12
11
  export function buildObjectType({ name, baseFields = {}, config, fields, forceNullable, graphqlResult, parentName }) {
13
12
  const fieldToSchemaMap = {
14
13
  array: (objectTypeConfig, field)=>{
@@ -94,7 +93,9 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
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 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
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 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
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 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
191
255
  value: {
192
256
  type: new GraphQLUnionType({
193
257
  name: relationshipName,
194
- resolveType (data, { req }) {
258
+ resolveType (data) {
195
259
  return graphqlResult.collections[data.collection].graphQL.type.name;
196
260
  },
197
261
  types
@@ -210,7 +274,7 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
210
274
  const relationshipArgs = {};
211
275
  const relationsUseDrafts = (Array.isArray(relationTo) ? relationTo : [
212
276
  relationTo
213
- ]).some((relation)=>graphqlResult.collections[relation].config.versions?.drafts);
277
+ ]).filter((relation)=>graphQLCollections.some((collection)=>collection.slug === relation)).some((relation)=>graphqlResult.collections[relation].config.versions?.drafts);
214
278
  if (relationsUseDrafts) {
215
279
  relationshipArgs.draft = {
216
280
  type: GraphQLBoolean
@@ -242,33 +306,36 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
242
306
  const createPopulationPromise = async (relatedDoc, i)=>{
243
307
  let id = relatedDoc;
244
308
  let collectionSlug = field.relationTo;
245
- if (isRelatedToManyCollections) {
246
- collectionSlug = relatedDoc.relationTo;
247
- id = relatedDoc.value;
248
- }
249
- const result = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
250
- collectionSlug: collectionSlug,
251
- currentDepth: 0,
252
- depth: 0,
253
- docID: id,
254
- draft,
255
- fallbackLocale,
256
- locale,
257
- overrideAccess: false,
258
- showHiddenFields: false,
259
- transactionID: context.req.transactionID
260
- }));
261
- if (result) {
309
+ const isValidGraphQLCollection = isRelatedToManyCollections ? graphQLCollections.some((collection)=>collectionSlug.includes(collection.slug)) : graphQLCollections.some((collection)=>collectionSlug === collection.slug);
310
+ if (isValidGraphQLCollection) {
262
311
  if (isRelatedToManyCollections) {
263
- results[i] = {
264
- relationTo: collectionSlug,
265
- value: {
266
- ...result,
267
- collection: collectionSlug
268
- }
269
- };
270
- } else {
271
- results[i] = result;
312
+ collectionSlug = relatedDoc.relationTo;
313
+ id = relatedDoc.value;
314
+ }
315
+ const result = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
316
+ collectionSlug: collectionSlug,
317
+ currentDepth: 0,
318
+ depth: 0,
319
+ docID: id,
320
+ draft,
321
+ fallbackLocale,
322
+ locale,
323
+ overrideAccess: false,
324
+ showHiddenFields: false,
325
+ transactionID: context.req.transactionID
326
+ }));
327
+ if (result) {
328
+ if (isRelatedToManyCollections) {
329
+ results[i] = {
330
+ relationTo: collectionSlug,
331
+ value: {
332
+ ...result,
333
+ collection: collectionSlug
334
+ }
335
+ };
336
+ } else {
337
+ results[i] = result;
338
+ }
272
339
  }
273
340
  }
274
341
  };
@@ -286,29 +353,31 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
286
353
  relatedCollectionSlug = value.relationTo;
287
354
  }
288
355
  if (id) {
289
- const relatedDocument = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
290
- collectionSlug: relatedCollectionSlug,
291
- currentDepth: 0,
292
- depth: 0,
293
- docID: id,
294
- draft,
295
- fallbackLocale,
296
- locale,
297
- overrideAccess: false,
298
- showHiddenFields: false,
299
- transactionID: context.req.transactionID
300
- }));
301
- if (relatedDocument) {
302
- if (isRelatedToManyCollections) {
303
- return {
304
- relationTo: relatedCollectionSlug,
305
- value: {
306
- ...relatedDocument,
307
- collection: relatedCollectionSlug
308
- }
309
- };
356
+ if (graphQLCollections.some((collection)=>collection.slug === relatedCollectionSlug)) {
357
+ const relatedDocument = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
358
+ collectionSlug: relatedCollectionSlug,
359
+ currentDepth: 0,
360
+ depth: 0,
361
+ docID: id,
362
+ draft,
363
+ fallbackLocale,
364
+ locale,
365
+ overrideAccess: false,
366
+ showHiddenFields: false,
367
+ transactionID: context.req.transactionID
368
+ }));
369
+ if (relatedDocument) {
370
+ if (isRelatedToManyCollections) {
371
+ return {
372
+ relationTo: relatedCollectionSlug,
373
+ value: {
374
+ ...relatedDocument,
375
+ collection: relatedCollectionSlug
376
+ }
377
+ };
378
+ }
379
+ return relatedDocument;
310
380
  }
311
- return relatedDocument;
312
381
  }
313
382
  return null;
314
383
  }
@@ -331,7 +400,9 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
331
400
  },
332
401
  async resolve (parent, args, context) {
333
402
  let depth = config.defaultDepth;
334
- if (typeof args.depth !== 'undefined') depth = args.depth;
403
+ if (typeof args.depth !== 'undefined') {
404
+ depth = args.depth;
405
+ }
335
406
  if (!field?.editor) {
336
407
  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
337
408
  ;
@@ -372,7 +443,9 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
372
443
  }),
373
444
  row: (objectTypeConfig, field)=>field.fields.reduce((objectTypeConfigWithRowFields, subField)=>{
374
445
  const addSubField = fieldToSchemaMap[subField.type];
375
- if (addSubField) return addSubField(objectTypeConfigWithRowFields, subField);
446
+ if (addSubField) {
447
+ return addSubField(objectTypeConfigWithRowFields, subField);
448
+ }
376
449
  return objectTypeConfigWithRowFields;
377
450
  }, objectTypeConfig),
378
451
  select: (objectTypeConfig, field)=>{
@@ -412,7 +485,13 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
412
485
  return {
413
486
  ...tabSchema,
414
487
  [tab.name]: {
415
- type: graphqlResult.types.groupTypes[interfaceName]
488
+ type: graphqlResult.types.groupTypes[interfaceName],
489
+ resolve (parent, args, context) {
490
+ return {
491
+ ...parent[tab.name],
492
+ _id: parent._id ?? parent.id
493
+ };
494
+ }
416
495
  }
417
496
  };
418
497
  }
@@ -420,7 +499,9 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
420
499
  ...tabSchema,
421
500
  ...tab.fields.reduce((subFieldSchema, subField)=>{
422
501
  const addSubField = fieldToSchemaMap[subField.type];
423
- if (addSubField) return addSubField(subFieldSchema, subField);
502
+ if (addSubField) {
503
+ return addSubField(subFieldSchema, subField);
504
+ }
424
505
  return subFieldSchema;
425
506
  }, tabSchema)
426
507
  };
@@ -439,34 +520,125 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
439
520
  }),
440
521
  upload: (objectTypeConfig, field)=>{
441
522
  const { relationTo } = field;
442
- const uploadName = combineParentName(parentName, toWords(field.name, true));
523
+ const isRelatedToManyCollections = Array.isArray(relationTo);
524
+ const hasManyValues = field.hasMany;
525
+ const relationshipName = combineParentName(parentName, toWords(field.name, true));
526
+ let type;
527
+ let relationToType = null;
528
+ if (Array.isArray(relationTo)) {
529
+ relationToType = new GraphQLEnumType({
530
+ name: `${relationshipName}_RelationTo`,
531
+ values: relationTo.reduce((relations, relation)=>({
532
+ ...relations,
533
+ [formatName(relation)]: {
534
+ value: relation
535
+ }
536
+ }), {})
537
+ });
538
+ const types = relationTo.map((relation)=>graphqlResult.collections[relation].graphQL.type);
539
+ type = new GraphQLObjectType({
540
+ name: `${relationshipName}_Relationship`,
541
+ fields: {
542
+ relationTo: {
543
+ type: relationToType
544
+ },
545
+ value: {
546
+ type: new GraphQLUnionType({
547
+ name: relationshipName,
548
+ resolveType (data) {
549
+ return graphqlResult.collections[data.collection].graphQL.type.name;
550
+ },
551
+ types
552
+ })
553
+ }
554
+ }
555
+ });
556
+ } else {
557
+ ({ type } = graphqlResult.collections[relationTo].graphQL);
558
+ }
443
559
  // If the relationshipType is undefined at this point,
444
560
  // it can be assumed that this blockType can have a relationship
445
561
  // to itself. Therefore, we set the relationshipType equal to the blockType
446
562
  // that is currently being created.
447
- const type = withNullableType(field, graphqlResult.collections[relationTo].graphQL.type || newlyCreatedBlockType, forceNullable);
448
- const uploadArgs = {};
563
+ type = type || newlyCreatedBlockType;
564
+ const relationshipArgs = {};
565
+ const relationsUseDrafts = (Array.isArray(relationTo) ? relationTo : [
566
+ relationTo
567
+ ]).some((relation)=>graphqlResult.collections[relation].config.versions?.drafts);
568
+ if (relationsUseDrafts) {
569
+ relationshipArgs.draft = {
570
+ type: GraphQLBoolean
571
+ };
572
+ }
449
573
  if (config.localization) {
450
- uploadArgs.locale = {
574
+ relationshipArgs.locale = {
451
575
  type: graphqlResult.types.localeInputType
452
576
  };
453
- uploadArgs.fallbackLocale = {
577
+ relationshipArgs.fallbackLocale = {
454
578
  type: graphqlResult.types.fallbackLocaleInputType
455
579
  };
456
580
  }
457
- const relatedCollectionSlug = field.relationTo;
458
- const upload = {
459
- type,
460
- args: uploadArgs,
581
+ const relationship = {
582
+ type: withNullableType(field, hasManyValues ? new GraphQLList(new GraphQLNonNull(type)) : type, forceNullable),
583
+ args: relationshipArgs,
461
584
  extensions: {
462
- complexity: 20
585
+ complexity: 10
463
586
  },
464
587
  async resolve (parent, args, context) {
465
588
  const value = parent[field.name];
466
589
  const locale = args.locale || context.req.locale;
467
590
  const fallbackLocale = args.fallbackLocale || context.req.fallbackLocale;
468
- const id = value;
591
+ let relatedCollectionSlug = field.relationTo;
469
592
  const draft = Boolean(args.draft ?? context.req.query?.draft);
593
+ if (hasManyValues) {
594
+ const results = [];
595
+ const resultPromises = [];
596
+ const createPopulationPromise = async (relatedDoc, i)=>{
597
+ let id = relatedDoc;
598
+ let collectionSlug = field.relationTo;
599
+ if (isRelatedToManyCollections) {
600
+ collectionSlug = relatedDoc.relationTo;
601
+ id = relatedDoc.value;
602
+ }
603
+ const result = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
604
+ collectionSlug,
605
+ currentDepth: 0,
606
+ depth: 0,
607
+ docID: id,
608
+ draft,
609
+ fallbackLocale,
610
+ locale,
611
+ overrideAccess: false,
612
+ showHiddenFields: false,
613
+ transactionID: context.req.transactionID
614
+ }));
615
+ if (result) {
616
+ if (isRelatedToManyCollections) {
617
+ results[i] = {
618
+ relationTo: collectionSlug,
619
+ value: {
620
+ ...result,
621
+ collection: collectionSlug
622
+ }
623
+ };
624
+ } else {
625
+ results[i] = result;
626
+ }
627
+ }
628
+ };
629
+ if (value) {
630
+ value.forEach((relatedDoc, i)=>{
631
+ resultPromises.push(createPopulationPromise(relatedDoc, i));
632
+ });
633
+ }
634
+ await Promise.all(resultPromises);
635
+ return results;
636
+ }
637
+ let id = value;
638
+ if (isRelatedToManyCollections && value) {
639
+ id = value.value;
640
+ relatedCollectionSlug = value.relationTo;
641
+ }
470
642
  if (id) {
471
643
  const relatedDocument = await context.req.payloadDataLoader.load(createDataloaderCacheKey({
472
644
  collectionSlug: relatedCollectionSlug,
@@ -480,22 +652,26 @@ export function buildObjectType({ name, baseFields = {}, config, fields, forceNu
480
652
  showHiddenFields: false,
481
653
  transactionID: context.req.transactionID
482
654
  }));
483
- return relatedDocument || null;
655
+ if (relatedDocument) {
656
+ if (isRelatedToManyCollections) {
657
+ return {
658
+ relationTo: relatedCollectionSlug,
659
+ value: {
660
+ ...relatedDocument,
661
+ collection: relatedCollectionSlug
662
+ }
663
+ };
664
+ }
665
+ return relatedDocument;
666
+ }
667
+ return null;
484
668
  }
485
669
  return null;
486
670
  }
487
671
  };
488
- const whereFields = graphqlResult.collections[relationTo].config.fields;
489
- upload.args.where = {
490
- type: buildWhereInputType({
491
- name: uploadName,
492
- fields: whereFields,
493
- parentName: uploadName
494
- })
495
- };
496
672
  return {
497
673
  ...objectTypeConfig,
498
- [field.name]: upload
674
+ [field.name]: relationship
499
675
  };
500
676
  }
501
677
  };