payload 3.0.0-beta.127 → 3.0.0-beta.129

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 (294) hide show
  1. package/dist/admin/RichText.d.ts +8 -21
  2. package/dist/admin/RichText.d.ts.map +1 -1
  3. package/dist/admin/RichText.js.map +1 -1
  4. package/dist/admin/elements/Cell.d.ts +7 -9
  5. package/dist/admin/elements/Cell.d.ts.map +1 -1
  6. package/dist/admin/elements/Cell.js.map +1 -1
  7. package/dist/admin/fields/Array.d.ts +3 -3
  8. package/dist/admin/fields/Array.d.ts.map +1 -1
  9. package/dist/admin/fields/Array.js.map +1 -1
  10. package/dist/admin/fields/Blocks.d.ts +2 -1
  11. package/dist/admin/fields/Blocks.d.ts.map +1 -1
  12. package/dist/admin/fields/Blocks.js.map +1 -1
  13. package/dist/admin/fields/Checkbox.d.ts +1 -0
  14. package/dist/admin/fields/Checkbox.d.ts.map +1 -1
  15. package/dist/admin/fields/Checkbox.js.map +1 -1
  16. package/dist/admin/fields/Code.d.ts +2 -1
  17. package/dist/admin/fields/Code.d.ts.map +1 -1
  18. package/dist/admin/fields/Code.js.map +1 -1
  19. package/dist/admin/fields/Collapsible.d.ts +5 -2
  20. package/dist/admin/fields/Collapsible.d.ts.map +1 -1
  21. package/dist/admin/fields/Collapsible.js.map +1 -1
  22. package/dist/admin/fields/Date.d.ts +1 -0
  23. package/dist/admin/fields/Date.d.ts.map +1 -1
  24. package/dist/admin/fields/Date.js.map +1 -1
  25. package/dist/admin/fields/Email.d.ts +1 -1
  26. package/dist/admin/fields/Email.d.ts.map +1 -1
  27. package/dist/admin/fields/Email.js.map +1 -1
  28. package/dist/admin/fields/Group.d.ts +5 -2
  29. package/dist/admin/fields/Group.d.ts.map +1 -1
  30. package/dist/admin/fields/Group.js.map +1 -1
  31. package/dist/admin/fields/Hidden.d.ts +7 -6
  32. package/dist/admin/fields/Hidden.d.ts.map +1 -1
  33. package/dist/admin/fields/Hidden.js.map +1 -1
  34. package/dist/admin/fields/JSON.d.ts +1 -0
  35. package/dist/admin/fields/JSON.d.ts.map +1 -1
  36. package/dist/admin/fields/JSON.js.map +1 -1
  37. package/dist/admin/fields/Join.d.ts +3 -1
  38. package/dist/admin/fields/Join.d.ts.map +1 -1
  39. package/dist/admin/fields/Join.js.map +1 -1
  40. package/dist/admin/fields/Number.d.ts +1 -0
  41. package/dist/admin/fields/Number.d.ts.map +1 -1
  42. package/dist/admin/fields/Number.js.map +1 -1
  43. package/dist/admin/fields/Point.d.ts +1 -0
  44. package/dist/admin/fields/Point.d.ts.map +1 -1
  45. package/dist/admin/fields/Point.js.map +1 -1
  46. package/dist/admin/fields/Radio.d.ts +1 -0
  47. package/dist/admin/fields/Radio.d.ts.map +1 -1
  48. package/dist/admin/fields/Radio.js.map +1 -1
  49. package/dist/admin/fields/Relationship.d.ts +1 -0
  50. package/dist/admin/fields/Relationship.d.ts.map +1 -1
  51. package/dist/admin/fields/Relationship.js.map +1 -1
  52. package/dist/admin/fields/RichText.d.ts +3 -2
  53. package/dist/admin/fields/RichText.d.ts.map +1 -1
  54. package/dist/admin/fields/RichText.js.map +1 -1
  55. package/dist/admin/fields/Row.d.ts +1 -2
  56. package/dist/admin/fields/Row.d.ts.map +1 -1
  57. package/dist/admin/fields/Row.js.map +1 -1
  58. package/dist/admin/fields/Select.d.ts +1 -0
  59. package/dist/admin/fields/Select.d.ts.map +1 -1
  60. package/dist/admin/fields/Select.js.map +1 -1
  61. package/dist/admin/fields/Tabs.d.ts +4 -2
  62. package/dist/admin/fields/Tabs.d.ts.map +1 -1
  63. package/dist/admin/fields/Tabs.js.map +1 -1
  64. package/dist/admin/fields/Text.d.ts +1 -0
  65. package/dist/admin/fields/Text.d.ts.map +1 -1
  66. package/dist/admin/fields/Text.js.map +1 -1
  67. package/dist/admin/fields/Textarea.d.ts +1 -0
  68. package/dist/admin/fields/Textarea.d.ts.map +1 -1
  69. package/dist/admin/fields/Textarea.js.map +1 -1
  70. package/dist/admin/fields/UI.d.ts +8 -0
  71. package/dist/admin/fields/UI.d.ts.map +1 -0
  72. package/dist/admin/fields/UI.js +3 -0
  73. package/dist/admin/fields/UI.js.map +1 -0
  74. package/dist/admin/fields/Upload.d.ts +1 -0
  75. package/dist/admin/fields/Upload.d.ts.map +1 -1
  76. package/dist/admin/fields/Upload.js.map +1 -1
  77. package/dist/admin/forms/Description.d.ts +1 -2
  78. package/dist/admin/forms/Description.d.ts.map +1 -1
  79. package/dist/admin/forms/Description.js.map +1 -1
  80. package/dist/admin/forms/Error.d.ts +0 -2
  81. package/dist/admin/forms/Error.d.ts.map +1 -1
  82. package/dist/admin/forms/Error.js.map +1 -1
  83. package/dist/admin/forms/Field.d.ts +53 -29
  84. package/dist/admin/forms/Field.d.ts.map +1 -1
  85. package/dist/admin/forms/Field.js.map +1 -1
  86. package/dist/admin/forms/Form.d.ts +46 -3
  87. package/dist/admin/forms/Form.d.ts.map +1 -1
  88. package/dist/admin/forms/Form.js.map +1 -1
  89. package/dist/admin/forms/Label.d.ts +1 -2
  90. package/dist/admin/forms/Label.d.ts.map +1 -1
  91. package/dist/admin/forms/Label.js.map +1 -1
  92. package/dist/admin/functions/index.d.ts +44 -0
  93. package/dist/admin/functions/index.d.ts.map +1 -0
  94. package/dist/admin/functions/index.js +3 -0
  95. package/dist/admin/functions/index.js.map +1 -0
  96. package/dist/admin/types.d.ts +63 -20
  97. package/dist/admin/types.d.ts.map +1 -1
  98. package/dist/admin/types.js +4 -1
  99. package/dist/admin/types.js.map +1 -1
  100. package/dist/admin/views/types.d.ts +9 -6
  101. package/dist/admin/views/types.d.ts.map +1 -1
  102. package/dist/admin/views/types.js.map +1 -1
  103. package/dist/assets/images/github-banner-nextjs-native.jpg +0 -0
  104. package/dist/auth/ensureUsernameOrEmail.js +4 -4
  105. package/dist/auth/ensureUsernameOrEmail.js.map +1 -1
  106. package/dist/auth/getFieldsToSign.js +13 -13
  107. package/dist/auth/getFieldsToSign.js.map +1 -1
  108. package/dist/auth/operations/local/auth.d.ts.map +1 -1
  109. package/dist/auth/operations/local/auth.js +2 -2
  110. package/dist/auth/operations/local/auth.js.map +1 -1
  111. package/dist/auth/operations/login.js +10 -10
  112. package/dist/auth/operations/login.js.map +1 -1
  113. package/dist/auth/strategies/local/generatePasswordSaltHash.js +2 -2
  114. package/dist/auth/strategies/local/generatePasswordSaltHash.js.map +1 -1
  115. package/dist/auth/strategies/local/register.js +4 -4
  116. package/dist/auth/strategies/local/register.js.map +1 -1
  117. package/dist/bin/generateImportMap/index.d.ts.map +1 -1
  118. package/dist/bin/generateImportMap/index.js +32 -5
  119. package/dist/bin/generateImportMap/index.js.map +1 -1
  120. package/dist/bin/generateImportMap/parsePayloadComponent.d.ts +1 -1
  121. package/dist/bin/generateImportMap/parsePayloadComponent.js +5 -5
  122. package/dist/bin/generateImportMap/parsePayloadComponent.js.map +1 -1
  123. package/dist/bin/migrate.js +17 -17
  124. package/dist/bin/migrate.js.map +1 -1
  125. package/dist/collections/config/client.d.ts +23 -35
  126. package/dist/collections/config/client.d.ts.map +1 -1
  127. package/dist/collections/config/client.js +104 -1
  128. package/dist/collections/config/client.js.map +1 -1
  129. package/dist/collections/config/sanitize.d.ts.map +1 -1
  130. package/dist/collections/config/sanitize.js +4 -2
  131. package/dist/collections/config/sanitize.js.map +1 -1
  132. package/dist/collections/config/types.d.ts +3 -3
  133. package/dist/collections/config/types.d.ts.map +1 -1
  134. package/dist/collections/config/types.js.map +1 -1
  135. package/dist/collections/operations/countVersions.d.ts +14 -0
  136. package/dist/collections/operations/countVersions.d.ts.map +1 -0
  137. package/dist/collections/operations/countVersions.js +74 -0
  138. package/dist/collections/operations/countVersions.js.map +1 -0
  139. package/dist/collections/operations/local/count.d.ts.map +1 -1
  140. package/dist/collections/operations/local/count.js +1 -0
  141. package/dist/collections/operations/local/count.js.map +1 -1
  142. package/dist/collections/operations/local/countVersions.d.ts +20 -0
  143. package/dist/collections/operations/local/countVersions.d.ts.map +1 -0
  144. package/dist/collections/operations/local/countVersions.js +20 -0
  145. package/dist/collections/operations/local/countVersions.js.map +1 -0
  146. package/dist/collections/operations/local/index.d.ts +2 -0
  147. package/dist/collections/operations/local/index.d.ts.map +1 -1
  148. package/dist/collections/operations/local/index.js +2 -0
  149. package/dist/collections/operations/local/index.js.map +1 -1
  150. package/dist/collections/operations/utils.d.ts +6 -0
  151. package/dist/collections/operations/utils.d.ts.map +1 -1
  152. package/dist/collections/operations/utils.js.map +1 -1
  153. package/dist/config/client.d.ts +10 -13
  154. package/dist/config/client.d.ts.map +1 -1
  155. package/dist/config/client.js +36 -0
  156. package/dist/config/client.js.map +1 -1
  157. package/dist/config/types.d.ts +20 -15
  158. package/dist/config/types.d.ts.map +1 -1
  159. package/dist/config/types.js.map +1 -1
  160. package/dist/database/getLocalizedPaths.js +1 -1
  161. package/dist/database/getLocalizedPaths.js.map +1 -1
  162. package/dist/database/sanitizeJoinQuery.js +6 -6
  163. package/dist/database/sanitizeJoinQuery.js.map +1 -1
  164. package/dist/database/types.d.ts +14 -0
  165. package/dist/database/types.d.ts.map +1 -1
  166. package/dist/database/types.js.map +1 -1
  167. package/dist/errors/ValidationError.d.ts +1 -1
  168. package/dist/errors/ValidationError.d.ts.map +1 -1
  169. package/dist/errors/ValidationError.js +1 -1
  170. package/dist/errors/ValidationError.js.map +1 -1
  171. package/dist/exports/shared.d.ts +3 -1
  172. package/dist/exports/shared.d.ts.map +1 -1
  173. package/dist/exports/shared.js +3 -1
  174. package/dist/exports/shared.js.map +1 -1
  175. package/dist/fields/config/client.d.ts +16 -1
  176. package/dist/fields/config/client.d.ts.map +1 -1
  177. package/dist/fields/config/client.js +229 -1
  178. package/dist/fields/config/client.js.map +1 -1
  179. package/dist/fields/config/sanitize.d.ts +2 -2
  180. package/dist/fields/config/sanitize.d.ts.map +1 -1
  181. package/dist/fields/config/sanitize.js +7 -21
  182. package/dist/fields/config/sanitize.js.map +1 -1
  183. package/dist/fields/config/sanitizeJoinField.d.ts +2 -2
  184. package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
  185. package/dist/fields/config/sanitizeJoinField.js +2 -2
  186. package/dist/fields/config/sanitizeJoinField.js.map +1 -1
  187. package/dist/fields/config/types.d.ts +28 -171
  188. package/dist/fields/config/types.d.ts.map +1 -1
  189. package/dist/fields/config/types.js.map +1 -1
  190. package/dist/fields/getFieldPaths.d.ts +25 -8
  191. package/dist/fields/getFieldPaths.d.ts.map +1 -1
  192. package/dist/fields/getFieldPaths.js +9 -37
  193. package/dist/fields/getFieldPaths.js.map +1 -1
  194. package/dist/fields/hooks/afterChange/promise.d.ts +2 -1
  195. package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
  196. package/dist/fields/hooks/afterChange/promise.js +66 -62
  197. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  198. package/dist/fields/hooks/afterChange/traverseFields.d.ts.map +1 -1
  199. package/dist/fields/hooks/afterChange/traverseFields.js +2 -1
  200. package/dist/fields/hooks/afterChange/traverseFields.js.map +1 -1
  201. package/dist/fields/hooks/afterRead/promise.d.ts +2 -1
  202. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  203. package/dist/fields/hooks/afterRead/promise.js +107 -103
  204. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  205. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  206. package/dist/fields/hooks/afterRead/traverseFields.js +2 -1
  207. package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
  208. package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
  209. package/dist/fields/hooks/beforeChange/index.js.map +1 -1
  210. package/dist/fields/hooks/beforeChange/promise.d.ts +8 -5
  211. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  212. package/dist/fields/hooks/beforeChange/promise.js +99 -110
  213. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  214. package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -4
  215. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  216. package/dist/fields/hooks/beforeChange/traverseFields.js +2 -1
  217. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  218. package/dist/fields/hooks/beforeDuplicate/promise.d.ts +2 -1
  219. package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
  220. package/dist/fields/hooks/beforeDuplicate/promise.js +47 -43
  221. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  222. package/dist/fields/hooks/beforeDuplicate/traverseFields.d.ts.map +1 -1
  223. package/dist/fields/hooks/beforeDuplicate/traverseFields.js +2 -1
  224. package/dist/fields/hooks/beforeDuplicate/traverseFields.js.map +1 -1
  225. package/dist/fields/hooks/beforeValidate/promise.d.ts +2 -1
  226. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  227. package/dist/fields/hooks/beforeValidate/promise.js +105 -101
  228. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  229. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  230. package/dist/fields/hooks/beforeValidate/traverseFields.js +2 -1
  231. package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
  232. package/dist/globals/config/client.d.ts +18 -25
  233. package/dist/globals/config/client.d.ts.map +1 -1
  234. package/dist/globals/config/client.js +53 -1
  235. package/dist/globals/config/client.js.map +1 -1
  236. package/dist/globals/config/sanitize.d.ts.map +1 -1
  237. package/dist/globals/config/sanitize.js +3 -1
  238. package/dist/globals/config/sanitize.js.map +1 -1
  239. package/dist/globals/operations/countGlobalVersions.d.ts +13 -0
  240. package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -0
  241. package/dist/globals/operations/countGlobalVersions.js +49 -0
  242. package/dist/globals/operations/countGlobalVersions.js.map +1 -0
  243. package/dist/globals/operations/local/countGlobalVersions.d.ts +20 -0
  244. package/dist/globals/operations/local/countGlobalVersions.d.ts.map +1 -0
  245. package/dist/globals/operations/local/countGlobalVersions.js +20 -0
  246. package/dist/globals/operations/local/countGlobalVersions.js.map +1 -0
  247. package/dist/globals/operations/local/index.d.ts +2 -0
  248. package/dist/globals/operations/local/index.d.ts.map +1 -1
  249. package/dist/globals/operations/local/index.js +2 -0
  250. package/dist/globals/operations/local/index.js.map +1 -1
  251. package/dist/index.d.ts +28 -12
  252. package/dist/index.d.ts.map +1 -1
  253. package/dist/index.js +21 -2
  254. package/dist/index.js.map +1 -1
  255. package/dist/queues/config/jobsCollection.d.ts.map +1 -1
  256. package/dist/queues/config/jobsCollection.js +2 -11
  257. package/dist/queues/config/jobsCollection.js.map +1 -1
  258. package/dist/queues/config/types/workflowTypes.d.ts +2 -1
  259. package/dist/queues/config/types/workflowTypes.d.ts.map +1 -1
  260. package/dist/queues/config/types/workflowTypes.js.map +1 -1
  261. package/dist/queues/localAPI.d.ts +2 -0
  262. package/dist/queues/localAPI.d.ts.map +1 -1
  263. package/dist/queues/localAPI.js +13 -0
  264. package/dist/queues/localAPI.js.map +1 -1
  265. package/dist/utilities/configToJSONSchema.js +232 -232
  266. package/dist/utilities/configToJSONSchema.js.map +1 -1
  267. package/dist/utilities/createLocalReq.d.ts +1 -1
  268. package/dist/utilities/createLocalReq.d.ts.map +1 -1
  269. package/dist/utilities/createLocalReq.js +4 -4
  270. package/dist/utilities/createLocalReq.js.map +1 -1
  271. package/dist/utilities/deepCopyObject.d.ts +1 -0
  272. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  273. package/dist/utilities/deepCopyObject.js +23 -0
  274. package/dist/utilities/deepCopyObject.js.map +1 -1
  275. package/dist/utilities/fieldSchemaToJSON.js +17 -17
  276. package/dist/utilities/fieldSchemaToJSON.js.map +1 -1
  277. package/dist/utilities/formatErrors.d.ts +6 -0
  278. package/dist/utilities/formatErrors.d.ts.map +1 -0
  279. package/dist/utilities/formatErrors.js +56 -0
  280. package/dist/utilities/formatErrors.js.map +1 -0
  281. package/dist/utilities/telemetry/conf/index.js +2 -2
  282. package/dist/utilities/telemetry/conf/index.js.map +1 -1
  283. package/dist/versions/saveVersion.d.ts.map +1 -1
  284. package/dist/versions/saveVersion.js +1 -7
  285. package/dist/versions/saveVersion.js.map +1 -1
  286. package/dist/versions/types.d.ts +1 -1
  287. package/dist/versions/types.d.ts.map +1 -1
  288. package/dist/versions/types.js.map +1 -1
  289. package/license.md +22 -0
  290. package/package.json +3 -3
  291. package/dist/utilities/mergeListSearchAndWhere.d.ts +0 -12
  292. package/dist/utilities/mergeListSearchAndWhere.d.ts.map +0 -1
  293. package/dist/utilities/mergeListSearchAndWhere.js +0 -57
  294. package/dist/utilities/mergeListSearchAndWhere.js.map +0 -1
@@ -82,13 +82,13 @@ function generateCollectionJoinsSchemas(collections) {
82
82
  };
83
83
  for(const collectionSlug in joins){
84
84
  for (const join of joins[collectionSlug]){
85
- schema.properties[join.schemaPath] = {
85
+ schema.properties[join.joinPath] = {
86
86
  type: 'string',
87
87
  enum: [
88
88
  collectionSlug
89
89
  ]
90
90
  };
91
- schema.required.push(join.schemaPath);
91
+ schema.required.push(join.joinPath);
92
92
  }
93
93
  }
94
94
  if (Object.keys(schema.properties).length > 0) {
@@ -200,50 +200,128 @@ export function fieldsToJSONSchema(/**
200
200
  }
201
201
  let fieldSchema;
202
202
  switch(field.type){
203
- case 'text':
204
- if (field.hasMany === true) {
203
+ case 'array':
204
+ {
205
205
  fieldSchema = {
206
206
  type: withNullableJSONSchemaType('array', isRequired),
207
207
  items: {
208
- type: 'string'
208
+ type: 'object',
209
+ additionalProperties: false,
210
+ ...fieldsToJSONSchema(collectionIDFieldTypes, field.fields, interfaceNameDefinitions, config)
209
211
  }
210
212
  };
211
- } else {
213
+ if (field.interfaceName) {
214
+ interfaceNameDefinitions.set(field.interfaceName, fieldSchema);
215
+ fieldSchema = {
216
+ $ref: `#/definitions/${field.interfaceName}`
217
+ };
218
+ }
219
+ break;
220
+ }
221
+ case 'blocks':
222
+ {
223
+ // Check for a case where no blocks are provided.
224
+ // We need to generate an empty array for this case, note that JSON schema 4 doesn't support empty arrays
225
+ // so the best we can get is `unknown[]`
226
+ const hasBlocks = Boolean(field.blocks.length);
212
227
  fieldSchema = {
213
- type: withNullableJSONSchemaType('string', isRequired)
228
+ type: withNullableJSONSchemaType('array', isRequired),
229
+ items: hasBlocks ? {
230
+ oneOf: field.blocks.map((block)=>{
231
+ const blockFieldSchemas = fieldsToJSONSchema(collectionIDFieldTypes, block.fields, interfaceNameDefinitions, config);
232
+ const blockSchema = {
233
+ type: 'object',
234
+ additionalProperties: false,
235
+ properties: {
236
+ ...blockFieldSchemas.properties,
237
+ blockType: {
238
+ const: block.slug
239
+ }
240
+ },
241
+ required: [
242
+ 'blockType',
243
+ ...blockFieldSchemas.required
244
+ ]
245
+ };
246
+ if (block.interfaceName) {
247
+ interfaceNameDefinitions.set(block.interfaceName, blockSchema);
248
+ return {
249
+ $ref: `#/definitions/${block.interfaceName}`
250
+ };
251
+ }
252
+ return blockSchema;
253
+ })
254
+ } : {}
214
255
  };
256
+ break;
257
+ }
258
+ case 'checkbox':
259
+ {
260
+ fieldSchema = {
261
+ type: withNullableJSONSchemaType('boolean', isRequired)
262
+ };
263
+ break;
215
264
  }
216
- break;
217
- case 'textarea':
218
265
  case 'code':
219
- case 'email':
220
266
  case 'date':
267
+ case 'email':
268
+ case 'textarea':
221
269
  {
222
270
  fieldSchema = {
223
271
  type: withNullableJSONSchemaType('string', isRequired)
224
272
  };
225
273
  break;
226
274
  }
227
- case 'number':
275
+ case 'collapsible':
276
+ case 'row':
228
277
  {
229
- if (field.hasMany === true) {
230
- fieldSchema = {
231
- type: withNullableJSONSchemaType('array', isRequired),
232
- items: {
233
- type: 'number'
234
- }
235
- };
236
- } else {
278
+ const childSchema = fieldsToJSONSchema(collectionIDFieldTypes, field.fields, interfaceNameDefinitions, config);
279
+ Object.entries(childSchema.properties).forEach(([propName, propSchema])=>{
280
+ fieldSchemas.set(propName, propSchema);
281
+ });
282
+ childSchema.required.forEach((propName)=>{
283
+ requiredFieldNames.add(propName);
284
+ });
285
+ break;
286
+ }
287
+ case 'group':
288
+ {
289
+ fieldSchema = {
290
+ type: 'object',
291
+ additionalProperties: false,
292
+ ...fieldsToJSONSchema(collectionIDFieldTypes, field.fields, interfaceNameDefinitions, config)
293
+ };
294
+ if (field.interfaceName) {
295
+ interfaceNameDefinitions.set(field.interfaceName, fieldSchema);
237
296
  fieldSchema = {
238
- type: withNullableJSONSchemaType('number', isRequired)
297
+ $ref: `#/definitions/${field.interfaceName}`
239
298
  };
240
299
  }
241
300
  break;
242
301
  }
243
- case 'checkbox':
302
+ case 'join':
244
303
  {
245
304
  fieldSchema = {
246
- type: withNullableJSONSchemaType('boolean', isRequired)
305
+ type: withNullableJSONSchemaType('object', false),
306
+ additionalProperties: false,
307
+ properties: {
308
+ docs: {
309
+ type: withNullableJSONSchemaType('array', false),
310
+ items: {
311
+ oneOf: [
312
+ {
313
+ type: collectionIDFieldTypes[field.collection]
314
+ },
315
+ {
316
+ $ref: `#/definitions/${field.collection}`
317
+ }
318
+ ]
319
+ }
320
+ },
321
+ hasNextPage: {
322
+ type: withNullableJSONSchemaType('boolean', false)
323
+ }
324
+ }
247
325
  };
248
326
  break;
249
327
  }
@@ -261,62 +339,19 @@ export function fieldsToJSONSchema(/**
261
339
  };
262
340
  break;
263
341
  }
264
- case 'richText':
265
- {
266
- if (!field?.editor) {
267
- 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
268
- ;
269
- }
270
- if (typeof field.editor === 'function') {
271
- throw new Error('Attempted to access unsanitized rich text editor.');
272
- }
273
- if (field.editor.outputSchema) {
274
- fieldSchema = field.editor.outputSchema({
275
- collectionIDFieldTypes,
276
- config,
277
- field,
278
- interfaceNameDefinitions,
279
- isRequired
280
- });
281
- } else {
282
- // Maintain backwards compatibility with existing rich text editors
283
- fieldSchema = {
284
- type: withNullableJSONSchemaType('array', isRequired),
285
- items: {
286
- type: 'object'
287
- }
288
- };
289
- }
290
- break;
291
- }
292
- case 'radio':
293
- {
294
- fieldSchema = {
295
- type: withNullableJSONSchemaType('string', isRequired),
296
- enum: buildOptionEnums(field.options)
297
- };
298
- break;
299
- }
300
- case 'select':
342
+ case 'number':
301
343
  {
302
- const optionEnums = buildOptionEnums(field.options);
303
- if (field.hasMany) {
344
+ if (field.hasMany === true) {
304
345
  fieldSchema = {
305
346
  type: withNullableJSONSchemaType('array', isRequired),
306
347
  items: {
307
- type: 'string'
348
+ type: 'number'
308
349
  }
309
350
  };
310
- if (optionEnums?.length) {
311
- fieldSchema.items.enum = optionEnums;
312
- }
313
351
  } else {
314
352
  fieldSchema = {
315
- type: withNullableJSONSchemaType('string', isRequired)
353
+ type: withNullableJSONSchemaType('number', isRequired)
316
354
  };
317
- if (optionEnums?.length) {
318
- fieldSchema.enum = optionEnums;
319
- }
320
355
  }
321
356
  break;
322
357
  }
@@ -337,34 +372,16 @@ export function fieldsToJSONSchema(/**
337
372
  };
338
373
  break;
339
374
  }
340
- case 'join':
375
+ case 'radio':
341
376
  {
342
377
  fieldSchema = {
343
- type: withNullableJSONSchemaType('object', false),
344
- additionalProperties: false,
345
- properties: {
346
- docs: {
347
- type: withNullableJSONSchemaType('array', false),
348
- items: {
349
- oneOf: [
350
- {
351
- type: collectionIDFieldTypes[field.collection]
352
- },
353
- {
354
- $ref: `#/definitions/${field.collection}`
355
- }
356
- ]
357
- }
358
- },
359
- hasNextPage: {
360
- type: withNullableJSONSchemaType('boolean', false)
361
- }
362
- }
378
+ type: withNullableJSONSchemaType('string', isRequired),
379
+ enum: buildOptionEnums(field.options)
363
380
  };
364
381
  break;
365
382
  }
366
- case 'upload':
367
383
  case 'relationship':
384
+ case 'upload':
368
385
  {
369
386
  if (Array.isArray(field.relationTo)) {
370
387
  if (field.hasMany) {
@@ -455,73 +472,57 @@ export function fieldsToJSONSchema(/**
455
472
  }
456
473
  break;
457
474
  }
458
- case 'blocks':
475
+ case 'richText':
459
476
  {
460
- // Check for a case where no blocks are provided.
461
- // We need to generate an empty array for this case, note that JSON schema 4 doesn't support empty arrays
462
- // so the best we can get is `unknown[]`
463
- const hasBlocks = Boolean(field.blocks.length);
464
- fieldSchema = {
465
- type: withNullableJSONSchemaType('array', isRequired),
466
- items: hasBlocks ? {
467
- oneOf: field.blocks.map((block)=>{
468
- const blockFieldSchemas = fieldsToJSONSchema(collectionIDFieldTypes, block.fields, interfaceNameDefinitions, config);
469
- const blockSchema = {
470
- type: 'object',
471
- additionalProperties: false,
472
- properties: {
473
- ...blockFieldSchemas.properties,
474
- blockType: {
475
- const: block.slug
476
- }
477
- },
478
- required: [
479
- 'blockType',
480
- ...blockFieldSchemas.required
481
- ]
482
- };
483
- if (block.interfaceName) {
484
- interfaceNameDefinitions.set(block.interfaceName, blockSchema);
485
- return {
486
- $ref: `#/definitions/${block.interfaceName}`
487
- };
488
- }
489
- return blockSchema;
490
- })
491
- } : {}
492
- };
477
+ if (!field?.editor) {
478
+ 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
479
+ ;
480
+ }
481
+ if (typeof field.editor === 'function') {
482
+ throw new Error('Attempted to access unsanitized rich text editor.');
483
+ }
484
+ if (field.editor.outputSchema) {
485
+ fieldSchema = field.editor.outputSchema({
486
+ collectionIDFieldTypes,
487
+ config,
488
+ field,
489
+ interfaceNameDefinitions,
490
+ isRequired
491
+ });
492
+ } else {
493
+ // Maintain backwards compatibility with existing rich text editors
494
+ fieldSchema = {
495
+ type: withNullableJSONSchemaType('array', isRequired),
496
+ items: {
497
+ type: 'object'
498
+ }
499
+ };
500
+ }
493
501
  break;
494
502
  }
495
- case 'array':
503
+ case 'select':
496
504
  {
497
- fieldSchema = {
498
- type: withNullableJSONSchemaType('array', isRequired),
499
- items: {
500
- type: 'object',
501
- additionalProperties: false,
502
- ...fieldsToJSONSchema(collectionIDFieldTypes, field.fields, interfaceNameDefinitions, config)
505
+ const optionEnums = buildOptionEnums(field.options);
506
+ if (field.hasMany) {
507
+ fieldSchema = {
508
+ type: withNullableJSONSchemaType('array', isRequired),
509
+ items: {
510
+ type: 'string'
511
+ }
512
+ };
513
+ if (optionEnums?.length) {
514
+ fieldSchema.items.enum = optionEnums;
503
515
  }
504
- };
505
- if (field.interfaceName) {
506
- interfaceNameDefinitions.set(field.interfaceName, fieldSchema);
516
+ } else {
507
517
  fieldSchema = {
508
- $ref: `#/definitions/${field.interfaceName}`
518
+ type: withNullableJSONSchemaType('string', isRequired)
509
519
  };
520
+ if (optionEnums?.length) {
521
+ fieldSchema.enum = optionEnums;
522
+ }
510
523
  }
511
524
  break;
512
525
  }
513
- case 'row':
514
- case 'collapsible':
515
- {
516
- const childSchema = fieldsToJSONSchema(collectionIDFieldTypes, field.fields, interfaceNameDefinitions, config);
517
- Object.entries(childSchema.properties).forEach(([propName, propSchema])=>{
518
- fieldSchemas.set(propName, propSchema);
519
- });
520
- childSchema.required.forEach((propName)=>{
521
- requiredFieldNames.add(propName);
522
- });
523
- break;
524
- }
525
526
  case 'tabs':
526
527
  {
527
528
  field.tabs.forEach((tab)=>{
@@ -549,21 +550,20 @@ export function fieldsToJSONSchema(/**
549
550
  });
550
551
  break;
551
552
  }
552
- case 'group':
553
- {
553
+ case 'text':
554
+ if (field.hasMany === true) {
554
555
  fieldSchema = {
555
- type: 'object',
556
- additionalProperties: false,
557
- ...fieldsToJSONSchema(collectionIDFieldTypes, field.fields, interfaceNameDefinitions, config)
556
+ type: withNullableJSONSchemaType('array', isRequired),
557
+ items: {
558
+ type: 'string'
559
+ }
560
+ };
561
+ } else {
562
+ fieldSchema = {
563
+ type: withNullableJSONSchemaType('string', isRequired)
558
564
  };
559
- if (field.interfaceName) {
560
- interfaceNameDefinitions.set(field.interfaceName, fieldSchema);
561
- fieldSchema = {
562
- $ref: `#/definitions/${field.interfaceName}`
563
- };
564
- }
565
- break;
566
565
  }
566
+ break;
567
567
  default:
568
568
  {
569
569
  break;
@@ -638,15 +638,6 @@ export function fieldsToSelectJSONSchema({ fields }) {
638
638
  };
639
639
  for (const field of fields){
640
640
  switch(field.type){
641
- case 'row':
642
- case 'collapsible':
643
- schema.properties = {
644
- ...schema.properties,
645
- ...fieldsToSelectJSONSchema({
646
- fields: field.fields
647
- }).properties
648
- };
649
- break;
650
641
  case 'array':
651
642
  case 'group':
652
643
  schema.properties[field.name] = {
@@ -660,29 +651,6 @@ export function fieldsToSelectJSONSchema({ fields }) {
660
651
  ]
661
652
  };
662
653
  break;
663
- case 'tabs':
664
- for (const tab of field.tabs){
665
- if (tabHasName(tab)) {
666
- schema.properties[tab.name] = {
667
- oneOf: [
668
- {
669
- type: 'boolean'
670
- },
671
- fieldsToSelectJSONSchema({
672
- fields: tab.fields
673
- })
674
- ]
675
- };
676
- continue;
677
- }
678
- schema.properties = {
679
- ...schema.properties,
680
- ...fieldsToSelectJSONSchema({
681
- fields: tab.fields
682
- }).properties
683
- };
684
- }
685
- break;
686
654
  case 'blocks':
687
655
  {
688
656
  const blocksSchema = {
@@ -712,6 +680,38 @@ export function fieldsToSelectJSONSchema({ fields }) {
712
680
  };
713
681
  break;
714
682
  }
683
+ case 'collapsible':
684
+ case 'row':
685
+ schema.properties = {
686
+ ...schema.properties,
687
+ ...fieldsToSelectJSONSchema({
688
+ fields: field.fields
689
+ }).properties
690
+ };
691
+ break;
692
+ case 'tabs':
693
+ for (const tab of field.tabs){
694
+ if (tabHasName(tab)) {
695
+ schema.properties[tab.name] = {
696
+ oneOf: [
697
+ {
698
+ type: 'boolean'
699
+ },
700
+ fieldsToSelectJSONSchema({
701
+ fields: tab.fields
702
+ })
703
+ ]
704
+ };
705
+ continue;
706
+ }
707
+ schema.properties = {
708
+ ...schema.properties,
709
+ ...fieldsToSelectJSONSchema({
710
+ fields: tab.fields
711
+ }).properties
712
+ };
713
+ }
714
+ break;
715
715
  default:
716
716
  schema.properties[field.name] = {
717
717
  type: 'boolean'
@@ -728,6 +728,46 @@ const fieldType = {
728
728
  const generateAuthFieldTypes = ({ type, loginWithUsername })=>{
729
729
  if (loginWithUsername) {
730
730
  switch(type){
731
+ case 'forgotOrUnlock':
732
+ {
733
+ if (loginWithUsername.allowEmailLogin) {
734
+ // allow email or username for unlock/forgot-password
735
+ return {
736
+ additionalProperties: false,
737
+ oneOf: [
738
+ {
739
+ additionalProperties: false,
740
+ properties: {
741
+ email: fieldType
742
+ },
743
+ required: [
744
+ 'email'
745
+ ]
746
+ },
747
+ {
748
+ additionalProperties: false,
749
+ properties: {
750
+ username: fieldType
751
+ },
752
+ required: [
753
+ 'username'
754
+ ]
755
+ }
756
+ ]
757
+ };
758
+ } else {
759
+ // allow only username for unlock/forgot-password
760
+ return {
761
+ additionalProperties: false,
762
+ properties: {
763
+ username: fieldType
764
+ },
765
+ required: [
766
+ 'username'
767
+ ]
768
+ };
769
+ }
770
+ }
731
771
  case 'login':
732
772
  {
733
773
  if (loginWithUsername.allowEmailLogin) {
@@ -798,46 +838,6 @@ const generateAuthFieldTypes = ({ type, loginWithUsername })=>{
798
838
  required: requiredFields
799
839
  };
800
840
  }
801
- case 'forgotOrUnlock':
802
- {
803
- if (loginWithUsername.allowEmailLogin) {
804
- // allow email or username for unlock/forgot-password
805
- return {
806
- additionalProperties: false,
807
- oneOf: [
808
- {
809
- additionalProperties: false,
810
- properties: {
811
- email: fieldType
812
- },
813
- required: [
814
- 'email'
815
- ]
816
- },
817
- {
818
- additionalProperties: false,
819
- properties: {
820
- username: fieldType
821
- },
822
- required: [
823
- 'username'
824
- ]
825
- }
826
- ]
827
- };
828
- } else {
829
- // allow only username for unlock/forgot-password
830
- return {
831
- additionalProperties: false,
832
- properties: {
833
- username: fieldType
834
- },
835
- required: [
836
- 'username'
837
- ]
838
- };
839
- }
840
- }
841
841
  }
842
842
  }
843
843
  // default email (and password for login/register)