payload 3.0.0-beta.106 → 3.0.0-beta.108

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 (232) hide show
  1. package/dist/admin/fields/Join.d.ts +18 -0
  2. package/dist/admin/fields/Join.d.ts.map +1 -0
  3. package/dist/admin/fields/Join.js +3 -0
  4. package/dist/admin/fields/Join.js.map +1 -0
  5. package/dist/admin/types.d.ts +1 -0
  6. package/dist/admin/types.d.ts.map +1 -1
  7. package/dist/admin/types.js.map +1 -1
  8. package/dist/auth/operations/login.d.ts.map +1 -1
  9. package/dist/auth/operations/login.js +1 -0
  10. package/dist/auth/operations/login.js.map +1 -1
  11. package/dist/auth/operations/me.d.ts.map +1 -1
  12. package/dist/auth/operations/me.js +1 -1
  13. package/dist/auth/operations/me.js.map +1 -1
  14. package/dist/auth/operations/refresh.d.ts.map +1 -1
  15. package/dist/auth/operations/refresh.js +1 -0
  16. package/dist/auth/operations/refresh.js.map +1 -1
  17. package/dist/auth/types.d.ts +7 -3
  18. package/dist/auth/types.d.ts.map +1 -1
  19. package/dist/auth/types.js.map +1 -1
  20. package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
  21. package/dist/bin/generateImportMap/iterateConfig.js +4 -1
  22. package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
  23. package/dist/bin/loadEnv.d.ts.map +1 -1
  24. package/dist/bin/loadEnv.js +9 -6
  25. package/dist/bin/loadEnv.js.map +1 -1
  26. package/dist/checkPayloadDependencies.d.ts.map +1 -1
  27. package/dist/checkPayloadDependencies.js +1 -44
  28. package/dist/checkPayloadDependencies.js.map +1 -1
  29. package/dist/collections/config/client.d.ts +2 -2
  30. package/dist/collections/config/client.d.ts.map +1 -1
  31. package/dist/collections/config/client.js.map +1 -1
  32. package/dist/collections/config/sanitize.d.ts.map +1 -1
  33. package/dist/collections/config/sanitize.js +6 -1
  34. package/dist/collections/config/sanitize.js.map +1 -1
  35. package/dist/collections/config/types.d.ts +26 -1
  36. package/dist/collections/config/types.d.ts.map +1 -1
  37. package/dist/collections/config/types.js.map +1 -1
  38. package/dist/collections/operations/delete.d.ts +1 -0
  39. package/dist/collections/operations/delete.d.ts.map +1 -1
  40. package/dist/collections/operations/delete.js +12 -1
  41. package/dist/collections/operations/delete.js.map +1 -1
  42. package/dist/collections/operations/deleteByID.d.ts +1 -0
  43. package/dist/collections/operations/deleteByID.d.ts.map +1 -1
  44. package/dist/collections/operations/deleteByID.js +12 -1
  45. package/dist/collections/operations/deleteByID.js.map +1 -1
  46. package/dist/collections/operations/find.d.ts +3 -1
  47. package/dist/collections/operations/find.d.ts.map +1 -1
  48. package/dist/collections/operations/find.js +43 -2
  49. package/dist/collections/operations/find.js.map +1 -1
  50. package/dist/collections/operations/findByID.d.ts +3 -1
  51. package/dist/collections/operations/findByID.d.ts.map +1 -1
  52. package/dist/collections/operations/findByID.js +38 -1
  53. package/dist/collections/operations/findByID.js.map +1 -1
  54. package/dist/collections/operations/findVersions.js +1 -1
  55. package/dist/collections/operations/findVersions.js.map +1 -1
  56. package/dist/collections/operations/local/delete.d.ts +1 -0
  57. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  58. package/dist/collections/operations/local/delete.js +2 -1
  59. package/dist/collections/operations/local/delete.js.map +1 -1
  60. package/dist/collections/operations/local/find.d.ts +3 -1
  61. package/dist/collections/operations/local/find.d.ts.map +1 -1
  62. package/dist/collections/operations/local/find.js +3 -1
  63. package/dist/collections/operations/local/find.js.map +1 -1
  64. package/dist/collections/operations/local/findByID.d.ts +5 -3
  65. package/dist/collections/operations/local/findByID.d.ts.map +1 -1
  66. package/dist/collections/operations/local/findByID.js +3 -1
  67. package/dist/collections/operations/local/findByID.js.map +1 -1
  68. package/dist/collections/operations/local/update.d.ts +2 -0
  69. package/dist/collections/operations/local/update.d.ts.map +1 -1
  70. package/dist/collections/operations/local/update.js +3 -1
  71. package/dist/collections/operations/local/update.js.map +1 -1
  72. package/dist/collections/operations/update.d.ts +1 -0
  73. package/dist/collections/operations/update.d.ts.map +1 -1
  74. package/dist/collections/operations/update.js +13 -2
  75. package/dist/collections/operations/update.js.map +1 -1
  76. package/dist/collections/operations/updateByID.d.ts +2 -0
  77. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  78. package/dist/collections/operations/updateByID.js +44 -5
  79. package/dist/collections/operations/updateByID.js.map +1 -1
  80. package/dist/config/client.d.ts +1 -1
  81. package/dist/config/client.d.ts.map +1 -1
  82. package/dist/config/client.js +2 -1
  83. package/dist/config/client.js.map +1 -1
  84. package/dist/config/find.d.ts +4 -0
  85. package/dist/config/find.d.ts.map +1 -1
  86. package/dist/config/find.js +18 -25
  87. package/dist/config/find.js.map +1 -1
  88. package/dist/config/sanitize.d.ts.map +1 -1
  89. package/dist/config/sanitize.js +2 -0
  90. package/dist/config/sanitize.js.map +1 -1
  91. package/dist/config/types.d.ts +4 -0
  92. package/dist/config/types.d.ts.map +1 -1
  93. package/dist/config/types.js.map +1 -1
  94. package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
  95. package/dist/database/queryValidation/validateSearchParams.js +6 -1
  96. package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
  97. package/dist/database/types.d.ts +12 -2
  98. package/dist/database/types.d.ts.map +1 -1
  99. package/dist/database/types.js.map +1 -1
  100. package/dist/errors/InvalidFieldJoin.d.ts +6 -0
  101. package/dist/errors/InvalidFieldJoin.d.ts.map +1 -0
  102. package/dist/errors/InvalidFieldJoin.js +8 -0
  103. package/dist/errors/InvalidFieldJoin.js.map +1 -0
  104. package/dist/errors/Locked.d.ts +5 -0
  105. package/dist/errors/Locked.d.ts.map +1 -0
  106. package/dist/errors/Locked.js +9 -0
  107. package/dist/errors/Locked.js.map +1 -0
  108. package/dist/errors/index.d.ts +1 -0
  109. package/dist/errors/index.d.ts.map +1 -1
  110. package/dist/errors/index.js +1 -0
  111. package/dist/errors/index.js.map +1 -1
  112. package/dist/exports/shared.d.ts +1 -1
  113. package/dist/exports/shared.d.ts.map +1 -1
  114. package/dist/exports/shared.js +1 -1
  115. package/dist/exports/shared.js.map +1 -1
  116. package/dist/fields/config/client.d.ts +1 -1
  117. package/dist/fields/config/client.d.ts.map +1 -1
  118. package/dist/fields/config/client.js.map +1 -1
  119. package/dist/fields/config/sanitize.d.ts +7 -2
  120. package/dist/fields/config/sanitize.d.ts.map +1 -1
  121. package/dist/fields/config/sanitize.js +27 -5
  122. package/dist/fields/config/sanitize.js.map +1 -1
  123. package/dist/fields/config/sanitizeJoinField.d.ts +10 -0
  124. package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -0
  125. package/dist/fields/config/sanitizeJoinField.js +65 -0
  126. package/dist/fields/config/sanitizeJoinField.js.map +1 -0
  127. package/dist/fields/config/types.d.ts +107 -47
  128. package/dist/fields/config/types.d.ts.map +1 -1
  129. package/dist/fields/config/types.js +4 -1
  130. package/dist/fields/config/types.js.map +1 -1
  131. package/dist/fields/hooks/afterRead/promise.js +1 -1
  132. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  133. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts +2 -2
  134. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
  135. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +16 -9
  136. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js.map +1 -1
  137. package/dist/fields/hooks/beforeChange/index.d.ts +1 -2
  138. package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
  139. package/dist/fields/hooks/beforeChange/index.js.map +1 -1
  140. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  141. package/dist/fields/hooks/beforeChange/promise.js +1 -1
  142. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  143. package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
  144. package/dist/fields/hooks/beforeDuplicate/promise.js +31 -30
  145. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  146. package/dist/fields/validations.d.ts +11 -1
  147. package/dist/fields/validations.d.ts.map +1 -1
  148. package/dist/fields/validations.js.map +1 -1
  149. package/dist/globals/config/types.d.ts +7 -0
  150. package/dist/globals/config/types.d.ts.map +1 -1
  151. package/dist/globals/config/types.js.map +1 -1
  152. package/dist/globals/operations/findOne.d.ts +1 -0
  153. package/dist/globals/operations/findOne.d.ts.map +1 -1
  154. package/dist/globals/operations/findOne.js +28 -1
  155. package/dist/globals/operations/findOne.js.map +1 -1
  156. package/dist/globals/operations/findVersions.js +1 -1
  157. package/dist/globals/operations/findVersions.js.map +1 -1
  158. package/dist/globals/operations/local/findOne.d.ts +1 -0
  159. package/dist/globals/operations/local/findOne.d.ts.map +1 -1
  160. package/dist/globals/operations/local/findOne.js +2 -1
  161. package/dist/globals/operations/local/findOne.js.map +1 -1
  162. package/dist/globals/operations/local/update.d.ts +2 -0
  163. package/dist/globals/operations/local/update.d.ts.map +1 -1
  164. package/dist/globals/operations/local/update.js +3 -1
  165. package/dist/globals/operations/local/update.js.map +1 -1
  166. package/dist/globals/operations/update.d.ts +2 -0
  167. package/dist/globals/operations/update.d.ts.map +1 -1
  168. package/dist/globals/operations/update.js +47 -7
  169. package/dist/globals/operations/update.js.map +1 -1
  170. package/dist/index.d.ts +13 -6
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +29 -10
  173. package/dist/index.js.map +1 -1
  174. package/dist/lockedDocuments/lockedDocumentsCollection.d.ts +4 -0
  175. package/dist/lockedDocuments/lockedDocumentsCollection.d.ts.map +1 -0
  176. package/dist/lockedDocuments/lockedDocumentsCollection.js +31 -0
  177. package/dist/lockedDocuments/lockedDocumentsCollection.js.map +1 -0
  178. package/dist/types/index.d.ts +11 -2
  179. package/dist/types/index.d.ts.map +1 -1
  180. package/dist/types/index.js.map +1 -1
  181. package/dist/utilities/checkDocumentLockStatus.d.ts +13 -0
  182. package/dist/utilities/checkDocumentLockStatus.d.ts.map +1 -0
  183. package/dist/utilities/checkDocumentLockStatus.js +66 -0
  184. package/dist/utilities/checkDocumentLockStatus.js.map +1 -0
  185. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  186. package/dist/utilities/configToJSONSchema.js +26 -0
  187. package/dist/utilities/configToJSONSchema.js.map +1 -1
  188. package/dist/utilities/dependencies/getDependencies.d.ts.map +1 -1
  189. package/dist/utilities/dependencies/getDependencies.js +23 -22
  190. package/dist/utilities/dependencies/getDependencies.js.map +1 -1
  191. package/dist/utilities/findUp.d.ts +19 -0
  192. package/dist/utilities/findUp.d.ts.map +1 -0
  193. package/dist/utilities/findUp.js +102 -0
  194. package/dist/utilities/findUp.js.map +1 -0
  195. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  196. package/dist/utilities/telemetry/index.js +9 -10
  197. package/dist/utilities/telemetry/index.js.map +1 -1
  198. package/dist/utilities/traverseFields.d.ts +36 -0
  199. package/dist/utilities/traverseFields.d.ts.map +1 -0
  200. package/dist/utilities/traverseFields.js +81 -0
  201. package/dist/utilities/traverseFields.js.map +1 -0
  202. package/dist/versions/baseFields.d.ts +1 -0
  203. package/dist/versions/baseFields.d.ts.map +1 -1
  204. package/dist/versions/baseFields.js +14 -0
  205. package/dist/versions/baseFields.js.map +1 -1
  206. package/dist/versions/buildCollectionFields.d.ts +2 -1
  207. package/dist/versions/buildCollectionFields.d.ts.map +1 -1
  208. package/dist/versions/buildCollectionFields.js +27 -8
  209. package/dist/versions/buildCollectionFields.js.map +1 -1
  210. package/dist/versions/buildGlobalFields.d.ts +2 -1
  211. package/dist/versions/buildGlobalFields.d.ts.map +1 -1
  212. package/dist/versions/buildGlobalFields.js +27 -8
  213. package/dist/versions/buildGlobalFields.js.map +1 -1
  214. package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
  215. package/dist/versions/drafts/replaceWithDraftIfAvailable.js +12 -3
  216. package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
  217. package/dist/versions/getLatestCollectionVersion.d.ts +2 -1
  218. package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
  219. package/dist/versions/getLatestCollectionVersion.js +38 -13
  220. package/dist/versions/getLatestCollectionVersion.js.map +1 -1
  221. package/dist/versions/getLatestGlobalVersion.d.ts +2 -1
  222. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  223. package/dist/versions/getLatestGlobalVersion.js +12 -4
  224. package/dist/versions/getLatestGlobalVersion.js.map +1 -1
  225. package/dist/versions/saveVersion.d.ts +3 -1
  226. package/dist/versions/saveVersion.d.ts.map +1 -1
  227. package/dist/versions/saveVersion.js +44 -20
  228. package/dist/versions/saveVersion.js.map +1 -1
  229. package/dist/versions/types.d.ts +1 -0
  230. package/dist/versions/types.d.ts.map +1 -1
  231. package/dist/versions/types.js.map +1 -1
  232. package/package.json +4 -5
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/shared.ts"],"sourcesContent":["export { parsePayloadComponent } from '../bin/generateImportMap/parsePayloadComponent.js'\nexport { defaults as collectionDefaults } from '../collections/config/defaults.js'\nexport { serverProps } from '../config/types.js'\n\nexport {\n fieldAffectsData,\n fieldHasMaxDepth,\n fieldHasSubFields,\n fieldIsArrayType,\n fieldIsBlockType,\n fieldIsGroupType,\n fieldIsLocalized,\n fieldIsPresentationalOnly,\n fieldIsSidebar,\n fieldSupportsMany,\n optionIsObject,\n optionIsValue,\n optionsAreObjects,\n tabHasName,\n valueIsValueWithRelation,\n} from '../fields/config/types.js'\n\nexport * from '../fields/validations.js'\nexport { validOperators } from '../types/constants.js'\n\nexport { formatFilesize } from '../uploads/formatFilesize.js'\n\nexport { isImage } from '../uploads/isImage.js'\n\nexport {\n deepCopyObject,\n deepCopyObjectComplex,\n deepCopyObjectSimple,\n} from '../utilities/deepCopyObject.js'\nexport {\n deepMerge,\n deepMergeWithCombinedArrays,\n deepMergeWithReactComponents,\n deepMergeWithSourceArrays,\n} from '../utilities/deepMerge.js'\n\nexport { fieldSchemaToJSON } from '../utilities/fieldSchemaToJSON.js'\n\nexport { getDataByPath } from '../utilities/getDataByPath.js'\nexport { getSiblingData } from '../utilities/getSiblingData.js'\n\nexport { getUniqueListBy } from '../utilities/getUniqueListBy.js'\n\nexport { isNumber } from '../utilities/isNumber.js'\n\nexport {\n isReactClientComponent,\n isReactComponentOrFunction,\n isReactServerComponentOrFunction,\n} from '../utilities/isReactComponent.js'\n\nexport { reduceFieldsToValues } from '../utilities/reduceFieldsToValues.js'\n\nexport { setsAreEqual } from '../utilities/setsAreEqual.js'\n\nexport { default as toKebabCase } from '../utilities/toKebabCase.js'\n\nexport { unflatten } from '../utilities/unflatten.js'\n\nexport { wait } from '../utilities/wait.js'\n\nexport { default as wordBoundariesRegex } from '../utilities/wordBoundariesRegex.js'\n\nexport { versionDefaults } from '../versions/defaults.js'\nexport { deepMergeSimple } from '@payloadcms/translations/utilities'\n"],"names":["parsePayloadComponent","defaults","collectionDefaults","serverProps","fieldAffectsData","fieldHasMaxDepth","fieldHasSubFields","fieldIsArrayType","fieldIsBlockType","fieldIsGroupType","fieldIsLocalized","fieldIsPresentationalOnly","fieldIsSidebar","fieldSupportsMany","optionIsObject","optionIsValue","optionsAreObjects","tabHasName","valueIsValueWithRelation","validOperators","formatFilesize","isImage","deepCopyObject","deepCopyObjectComplex","deepCopyObjectSimple","deepMerge","deepMergeWithCombinedArrays","deepMergeWithReactComponents","deepMergeWithSourceArrays","fieldSchemaToJSON","getDataByPath","getSiblingData","getUniqueListBy","isNumber","isReactClientComponent","isReactComponentOrFunction","isReactServerComponentOrFunction","reduceFieldsToValues","setsAreEqual","default","toKebabCase","unflatten","wait","wordBoundariesRegex","versionDefaults","deepMergeSimple"],"mappings":"AAAA,SAASA,qBAAqB,QAAQ,oDAAmD;AACzF,SAASC,YAAYC,kBAAkB,QAAQ,oCAAmC;AAClF,SAASC,WAAW,QAAQ,qBAAoB;AAEhD,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,iBAAiB,EACjBC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,EAChBC,yBAAyB,EACzBC,cAAc,EACdC,iBAAiB,EACjBC,cAAc,EACdC,aAAa,EACbC,iBAAiB,EACjBC,UAAU,EACVC,wBAAwB,QACnB,4BAA2B;AAElC,cAAc,2BAA0B;AACxC,SAASC,cAAc,QAAQ,wBAAuB;AAEtD,SAASC,cAAc,QAAQ,+BAA8B;AAE7D,SAASC,OAAO,QAAQ,wBAAuB;AAE/C,SACEC,cAAc,EACdC,qBAAqB,EACrBC,oBAAoB,QACf,iCAAgC;AACvC,SACEC,SAAS,EACTC,2BAA2B,EAC3BC,4BAA4B,EAC5BC,yBAAyB,QACpB,4BAA2B;AAElC,SAASC,iBAAiB,QAAQ,oCAAmC;AAErE,SAASC,aAAa,QAAQ,gCAA+B;AAC7D,SAASC,cAAc,QAAQ,iCAAgC;AAE/D,SAASC,eAAe,QAAQ,kCAAiC;AAEjE,SAASC,QAAQ,QAAQ,2BAA0B;AAEnD,SACEC,sBAAsB,EACtBC,0BAA0B,EAC1BC,gCAAgC,QAC3B,mCAAkC;AAEzC,SAASC,oBAAoB,QAAQ,uCAAsC;AAE3E,SAASC,YAAY,QAAQ,+BAA8B;AAE3D,SAASC,WAAWC,WAAW,QAAQ,8BAA6B;AAEpE,SAASC,SAAS,QAAQ,4BAA2B;AAErD,SAASC,IAAI,QAAQ,uBAAsB;AAE3C,SAASH,WAAWI,mBAAmB,QAAQ,sCAAqC;AAEpF,SAASC,eAAe,QAAQ,0BAAyB;AACzD,SAASC,eAAe,QAAQ,qCAAoC"}
1
+ {"version":3,"sources":["../../src/exports/shared.ts"],"sourcesContent":["export { parsePayloadComponent } from '../bin/generateImportMap/parsePayloadComponent.js'\nexport { defaults as collectionDefaults } from '../collections/config/defaults.js'\nexport { serverProps } from '../config/types.js'\n\nexport {\n fieldAffectsData,\n fieldHasMaxDepth,\n fieldHasSubFields,\n fieldIsArrayType,\n fieldIsBlockType,\n fieldIsGroupType,\n fieldIsLocalized,\n fieldIsPresentationalOnly,\n fieldIsSidebar,\n fieldIsVirtual,\n fieldSupportsMany,\n optionIsObject,\n optionIsValue,\n optionsAreObjects,\n tabHasName,\n valueIsValueWithRelation,\n} from '../fields/config/types.js'\n\nexport * from '../fields/validations.js'\nexport { validOperators } from '../types/constants.js'\n\nexport { formatFilesize } from '../uploads/formatFilesize.js'\n\nexport { isImage } from '../uploads/isImage.js'\n\nexport {\n deepCopyObject,\n deepCopyObjectComplex,\n deepCopyObjectSimple,\n} from '../utilities/deepCopyObject.js'\nexport {\n deepMerge,\n deepMergeWithCombinedArrays,\n deepMergeWithReactComponents,\n deepMergeWithSourceArrays,\n} from '../utilities/deepMerge.js'\n\nexport { fieldSchemaToJSON } from '../utilities/fieldSchemaToJSON.js'\n\nexport { getDataByPath } from '../utilities/getDataByPath.js'\nexport { getSiblingData } from '../utilities/getSiblingData.js'\n\nexport { getUniqueListBy } from '../utilities/getUniqueListBy.js'\n\nexport { isNumber } from '../utilities/isNumber.js'\n\nexport {\n isReactClientComponent,\n isReactComponentOrFunction,\n isReactServerComponentOrFunction,\n} from '../utilities/isReactComponent.js'\n\nexport { reduceFieldsToValues } from '../utilities/reduceFieldsToValues.js'\n\nexport { setsAreEqual } from '../utilities/setsAreEqual.js'\n\nexport { default as toKebabCase } from '../utilities/toKebabCase.js'\n\nexport { unflatten } from '../utilities/unflatten.js'\n\nexport { wait } from '../utilities/wait.js'\n\nexport { default as wordBoundariesRegex } from '../utilities/wordBoundariesRegex.js'\n\nexport { versionDefaults } from '../versions/defaults.js'\nexport { deepMergeSimple } from '@payloadcms/translations/utilities'\n"],"names":["parsePayloadComponent","defaults","collectionDefaults","serverProps","fieldAffectsData","fieldHasMaxDepth","fieldHasSubFields","fieldIsArrayType","fieldIsBlockType","fieldIsGroupType","fieldIsLocalized","fieldIsPresentationalOnly","fieldIsSidebar","fieldIsVirtual","fieldSupportsMany","optionIsObject","optionIsValue","optionsAreObjects","tabHasName","valueIsValueWithRelation","validOperators","formatFilesize","isImage","deepCopyObject","deepCopyObjectComplex","deepCopyObjectSimple","deepMerge","deepMergeWithCombinedArrays","deepMergeWithReactComponents","deepMergeWithSourceArrays","fieldSchemaToJSON","getDataByPath","getSiblingData","getUniqueListBy","isNumber","isReactClientComponent","isReactComponentOrFunction","isReactServerComponentOrFunction","reduceFieldsToValues","setsAreEqual","default","toKebabCase","unflatten","wait","wordBoundariesRegex","versionDefaults","deepMergeSimple"],"mappings":"AAAA,SAASA,qBAAqB,QAAQ,oDAAmD;AACzF,SAASC,YAAYC,kBAAkB,QAAQ,oCAAmC;AAClF,SAASC,WAAW,QAAQ,qBAAoB;AAEhD,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,iBAAiB,EACjBC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,EAChBC,yBAAyB,EACzBC,cAAc,EACdC,cAAc,EACdC,iBAAiB,EACjBC,cAAc,EACdC,aAAa,EACbC,iBAAiB,EACjBC,UAAU,EACVC,wBAAwB,QACnB,4BAA2B;AAElC,cAAc,2BAA0B;AACxC,SAASC,cAAc,QAAQ,wBAAuB;AAEtD,SAASC,cAAc,QAAQ,+BAA8B;AAE7D,SAASC,OAAO,QAAQ,wBAAuB;AAE/C,SACEC,cAAc,EACdC,qBAAqB,EACrBC,oBAAoB,QACf,iCAAgC;AACvC,SACEC,SAAS,EACTC,2BAA2B,EAC3BC,4BAA4B,EAC5BC,yBAAyB,QACpB,4BAA2B;AAElC,SAASC,iBAAiB,QAAQ,oCAAmC;AAErE,SAASC,aAAa,QAAQ,gCAA+B;AAC7D,SAASC,cAAc,QAAQ,iCAAgC;AAE/D,SAASC,eAAe,QAAQ,kCAAiC;AAEjE,SAASC,QAAQ,QAAQ,2BAA0B;AAEnD,SACEC,sBAAsB,EACtBC,0BAA0B,EAC1BC,gCAAgC,QAC3B,mCAAkC;AAEzC,SAASC,oBAAoB,QAAQ,uCAAsC;AAE3E,SAASC,YAAY,QAAQ,+BAA8B;AAE3D,SAASC,WAAWC,WAAW,QAAQ,8BAA6B;AAEpE,SAASC,SAAS,QAAQ,4BAA2B;AAErD,SAASC,IAAI,QAAQ,uBAAsB;AAE3C,SAASH,WAAWI,mBAAmB,QAAQ,sCAAqC;AAEpF,SAASC,eAAe,QAAQ,0BAAyB;AACzD,SAASC,eAAe,QAAQ,qCAAoC"}
@@ -1,5 +1,5 @@
1
1
  import type { ClientField, FieldBase } from '../../fields/config/types.js';
2
2
  export { ClientField };
3
- export type ServerOnlyFieldProperties = 'dbName' | 'editor' | 'enumName' | 'filterOptions' | 'label' | 'typescriptSchema' | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks' | 'validate'>;
3
+ export type ServerOnlyFieldProperties = 'dbName' | 'editor' | 'enumName' | 'filterOptions' | 'label' | 'typescriptSchema' | 'validate' | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>;
4
4
  export type ServerOnlyFieldAdminProperties = keyof Pick<FieldBase['admin'], 'condition'>;
5
5
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/fields/config/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAK1E,OAAO,EAAE,WAAW,EAAE,CAAA;AAEtB,MAAM,MAAM,yBAAyB,GACjC,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,eAAe,GACf,OAAO,GACP,kBAAkB,GAClB,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,GAAG,UAAU,CAAC,CAAA;AAEtF,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/fields/config/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAK1E,OAAO,EAAE,WAAW,EAAE,CAAA;AAEtB,MAAM,MAAM,yBAAyB,GACjC,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,eAAe,GACf,OAAO,GACP,kBAAkB,GAClB,UAAU,GACV,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC,CAAA;AAEzE,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/client.ts"],"sourcesContent":["import type { ClientField, FieldBase } from '../../fields/config/types.js'\n\n// Should not be used - ClientField should be used instead. This is why we don't export ClientField, we don't want people\n// to accidentally use it instead of ClientField and get confused\n\nexport { ClientField }\n\nexport type ServerOnlyFieldProperties =\n | 'dbName' // can be a function\n | 'editor' // This is a `richText` only property\n | 'enumName' // can be a function\n | 'filterOptions' // This is a `relationship` and `upload` only property\n | 'label'\n | 'typescriptSchema'\n | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks' | 'validate'>\n\nexport type ServerOnlyFieldAdminProperties = keyof Pick<FieldBase['admin'], 'condition'>\n"],"names":[],"mappings":"AAgBA,WAAwF"}
1
+ {"version":3,"sources":["../../../src/fields/config/client.ts"],"sourcesContent":["import type { ClientField, FieldBase } from '../../fields/config/types.js'\n\n// Should not be used - ClientField should be used instead. This is why we don't export ClientField, we don't want people\n// to accidentally use it instead of ClientField and get confused\n\nexport { ClientField }\n\nexport type ServerOnlyFieldProperties =\n | 'dbName' // can be a function\n | 'editor' // This is a `richText` only property\n | 'enumName' // can be a function\n | 'filterOptions' // This is a `relationship` and `upload` only property\n | 'label'\n | 'typescriptSchema'\n | 'validate'\n | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>\n\nexport type ServerOnlyFieldAdminProperties = keyof Pick<FieldBase['admin'], 'condition'>\n"],"names":[],"mappings":"AAiBA,WAAwF"}
@@ -1,4 +1,4 @@
1
- import type { CollectionConfig } from '../../collections/config/types.js';
1
+ import type { CollectionConfig, SanitizedJoins } from '../../collections/config/types.js';
2
2
  import type { Config, SanitizedConfig } from '../../config/types.js';
3
3
  import type { Field } from './types.js';
4
4
  type Args = {
@@ -6,6 +6,10 @@ type Args = {
6
6
  config: Config;
7
7
  existingFieldNames?: Set<string>;
8
8
  fields: Field[];
9
+ /**
10
+ * When not passed in, assume that join are not supported (globals, arrays, blocks)
11
+ */
12
+ joins?: SanitizedJoins;
9
13
  parentIsLocalized: boolean;
10
14
  /**
11
15
  * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.
@@ -18,12 +22,13 @@ type Args = {
18
22
  * so that you can sanitize them together, after the config has been sanitized.
19
23
  */
20
24
  richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>;
25
+ schemaPath?: string;
21
26
  /**
22
27
  * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.
23
28
  * This validation will be skipped if validRelationships is null.
24
29
  */
25
30
  validRelationships: null | string[];
26
31
  };
27
- export declare const sanitizeFields: ({ collectionConfig, config, existingFieldNames, fields, parentIsLocalized, requireFieldLevelRichTextEditor, richTextSanitizationPromises, validRelationships, }: Args) => Promise<Field[]>;
32
+ export declare const sanitizeFields: ({ config, existingFieldNames, fields, joins, parentIsLocalized, requireFieldLevelRichTextEditor, richTextSanitizationPromises, schemaPath: schemaPathArg, validRelationships, }: Args) => Promise<Field[]>;
28
33
  export {};
29
34
  //# sourceMappingURL=sanitize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAgBvC,KAAK,IAAI,GAAG;IACV,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAA;IAEzC;;;OAGG;IACH,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF;;;OAGG;IACH,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,eAAO,MAAM,cAAc,oKASxB,IAAI,KAAG,OAAO,CAAC,KAAK,EAAE,CA0NxB,CAAA"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACzF,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAiBvC,KAAK,IAAI,GAAG;IACV,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAA;IAEzC;;;OAGG;IACH,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,eAAO,MAAM,cAAc,oLAUxB,IAAI,KAAG,OAAO,CAAC,KAAK,EAAE,CA8OxB,CAAA"}
@@ -1,16 +1,17 @@
1
1
  import { deepMergeSimple } from '@payloadcms/translations/utilities';
2
- import { DuplicateFieldName, InvalidFieldName, InvalidFieldRelationship, MissingFieldType } from '../../errors/index.js';
3
- import { MissingEditorProp } from '../../errors/MissingEditorProp.js';
2
+ import { DuplicateFieldName, InvalidFieldName, InvalidFieldRelationship, MissingEditorProp, MissingFieldType } from '../../errors/index.js';
4
3
  import { formatLabels, toWords } from '../../utilities/formatLabels.js';
5
4
  import { baseBlockFields } from '../baseFields/baseBlockFields.js';
6
5
  import { baseIDField } from '../baseFields/baseIDField.js';
7
6
  import { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js';
8
7
  import validations from '../validations.js';
8
+ import { sanitizeJoinField } from './sanitizeJoinField.js';
9
9
  import { fieldAffectsData, tabHasName } from './types.js';
10
- export const sanitizeFields = async ({ collectionConfig, config, existingFieldNames = new Set(), fields, parentIsLocalized, requireFieldLevelRichTextEditor = false, richTextSanitizationPromises, validRelationships })=>{
10
+ export const sanitizeFields = async ({ config, existingFieldNames = new Set(), fields, joins, parentIsLocalized, requireFieldLevelRichTextEditor = false, richTextSanitizationPromises, schemaPath: schemaPathArg, validRelationships })=>{
11
11
  if (!fields) {
12
12
  return [];
13
13
  }
14
+ let schemaPath = schemaPathArg;
14
15
  for(let i = 0; i < fields.length; i++){
15
16
  const field = fields[i];
16
17
  if ('_sanitized' in field && field._sanitized === true) {
@@ -30,6 +31,14 @@ export const sanitizeFields = async ({ collectionConfig, config, existingFieldNa
30
31
  if (field.type === 'checkbox' && typeof field.defaultValue === 'undefined' && field.required === true) {
31
32
  field.defaultValue = false;
32
33
  }
34
+ if (field.type === 'join') {
35
+ sanitizeJoinField({
36
+ config,
37
+ field,
38
+ joins,
39
+ schemaPath
40
+ });
41
+ }
33
42
  if (field.type === 'relationship' || field.type === 'upload') {
34
43
  if (validRelationships) {
35
44
  const relationships = Array.isArray(field.relationTo) ? field.relationTo : [
@@ -93,6 +102,9 @@ export const sanitizeFields = async ({ collectionConfig, config, existingFieldNa
93
102
  field.validate = ()=>true;
94
103
  }
95
104
  }
105
+ if (typeof field.virtual === 'undefined') {
106
+ field.virtual = false;
107
+ }
96
108
  if (!field.hooks) {
97
109
  field.hooks = {};
98
110
  }
@@ -153,29 +165,39 @@ export const sanitizeFields = async ({ collectionConfig, config, existingFieldNa
153
165
  }
154
166
  }
155
167
  if ('fields' in field && field.fields) {
168
+ if ('name' in field && field.name) {
169
+ schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}`;
170
+ }
156
171
  field.fields = await sanitizeFields({
157
172
  config,
158
173
  existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames,
159
174
  fields: field.fields,
175
+ joins,
160
176
  parentIsLocalized: parentIsLocalized || field.localized,
161
177
  requireFieldLevelRichTextEditor,
162
178
  richTextSanitizationPromises,
179
+ schemaPath,
163
180
  validRelationships
164
181
  });
165
182
  }
166
183
  if (field.type === 'tabs') {
167
184
  for(let j = 0; j < field.tabs.length; j++){
168
185
  const tab = field.tabs[j];
169
- if (tabHasName(tab) && typeof tab.label === 'undefined') {
170
- tab.label = toWords(tab.name);
186
+ if (tabHasName(tab)) {
187
+ schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${tab.name}`;
188
+ if (typeof tab.label === 'undefined') {
189
+ tab.label = toWords(tab.name);
190
+ }
171
191
  }
172
192
  tab.fields = await sanitizeFields({
173
193
  config,
174
194
  existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames,
175
195
  fields: tab.fields,
196
+ joins,
176
197
  parentIsLocalized: parentIsLocalized || tabHasName(tab) && tab.localized,
177
198
  requireFieldLevelRichTextEditor,
178
199
  richTextSanitizationPromises,
200
+ schemaPath,
179
201
  validRelationships
180
202
  });
181
203
  field.tabs[j] = tab;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type { CollectionConfig } from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { MissingEditorProp } from '../../errors/MissingEditorProp.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport validations from '../validations.js'\nimport { fieldAffectsData, tabHasName } from './types.js'\n\ntype Args = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n parentIsLocalized: boolean\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nexport const sanitizeFields = async ({\n collectionConfig,\n config,\n existingFieldNames = new Set(),\n fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n validRelationships,\n}: Args): Promise<Field[]> => {\n if (!fields) {\n return []\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]\n\n if ('_sanitized' in field && field._sanitized === true) {\n continue\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n // assert that field names do not contain forbidden characters\n if (fieldAffectsData(field) && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n typeof field.label !== 'function' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n }\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n }\n field.minRows = field.minRows || field.min\n field.maxRows = field.maxRows || field.max\n }\n\n if (field.type === 'upload') {\n if (!field.admin || !('isSortable' in field.admin)) {\n field.admin = {\n isSortable: true,\n ...field.admin,\n }\n }\n }\n\n if (field.type === 'array' && field.fields) {\n field.fields.push(baseIDField)\n }\n\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData(field)) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (typeof field.localized !== 'undefined') {\n let shouldDisableLocalized = !config.localization\n\n if (!config.compatibility?.allowLocalizedWithinLocalized && parentIsLocalized) {\n shouldDisableLocalized = true\n }\n\n if (shouldDisableLocalized) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n const defaultValidate = validations[field.type]\n if (defaultValidate) {\n field.validate = (val, options) => defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = () => true\n }\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n const sanitizeRichText = async (_config: SanitizedConfig) => {\n if (!field.editor) {\n if (_config.editor && !requireFieldLevelRichTextEditor) {\n // config.editor should be sanitized at this point\n field.editor = _config.editor\n } else {\n 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\n }\n }\n\n if (typeof field.editor === 'function') {\n field.editor = await field.editor({\n config: _config,\n isRoot: requireFieldLevelRichTextEditor,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n }\n\n if (field.editor.i18n && Object.keys(field.editor.i18n).length >= 0) {\n config.i18n.translations = deepMergeSimple(config.i18n.translations, field.editor.i18n)\n }\n }\n if (richTextSanitizationPromises) {\n richTextSanitizationPromises.push(sanitizeRichText)\n } else {\n await sanitizeRichText(config as unknown as SanitizedConfig)\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n for (const block of field.blocks) {\n if (block._sanitized === true) {\n continue\n }\n block._sanitized = true\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n\n block.fields = await sanitizeFields({\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n field.fields = await sanitizeFields({\n config,\n existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames,\n fields: field.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n for (let j = 0; j < field.tabs.length; j++) {\n const tab = field.tabs[j]\n if (tabHasName(tab) && typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n\n tab.fields = await sanitizeFields({\n config,\n existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames,\n fields: tab.fields,\n parentIsLocalized: parentIsLocalized || (tabHasName(tab) && tab.localized),\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n field.tabs[j] = tab\n }\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n fields[i] = field\n }\n\n return fields\n}\n"],"names":["deepMergeSimple","DuplicateFieldName","InvalidFieldName","InvalidFieldRelationship","MissingFieldType","MissingEditorProp","formatLabels","toWords","baseBlockFields","baseIDField","setDefaultBeforeDuplicate","validations","fieldAffectsData","tabHasName","sanitizeFields","collectionConfig","config","existingFieldNames","Set","fields","parentIsLocalized","requireFieldLevelRichTextEditor","richTextSanitizationPromises","validRelationships","i","length","field","_sanitized","type","name","includes","label","defaultValue","required","relationships","Array","isArray","relationTo","forEach","relationship","min","minRows","console","warn","max","maxRows","admin","isSortable","push","labels","has","add","localized","shouldDisableLocalized","localization","compatibility","allowLocalizedWithinLocalized","validate","defaultValidate","val","options","hooks","access","sanitizeRichText","_config","editor","isRoot","i18n","Object","keys","translations","blocks","block","concat","slug","j","tabs","tab"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type { CollectionConfig, SanitizedJoins } from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingEditorProp,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport validations from '../validations.js'\nimport { sanitizeJoinField } from './sanitizeJoinField.js'\nimport { fieldAffectsData, tabHasName } from './types.js'\n\ntype Args = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n /**\n * When not passed in, assume that join are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n parentIsLocalized: boolean\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n schemaPath?: string\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nexport const sanitizeFields = async ({\n config,\n existingFieldNames = new Set(),\n fields,\n joins,\n parentIsLocalized,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n schemaPath: schemaPathArg,\n validRelationships,\n}: Args): Promise<Field[]> => {\n if (!fields) {\n return []\n }\n\n let schemaPath = schemaPathArg\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]\n\n if ('_sanitized' in field && field._sanitized === true) {\n continue\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n // assert that field names do not contain forbidden characters\n if (fieldAffectsData(field) && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n typeof field.label !== 'function' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n if (field.type === 'join') {\n sanitizeJoinField({ config, field, joins, schemaPath })\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n }\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n }\n field.minRows = field.minRows || field.min\n field.maxRows = field.maxRows || field.max\n }\n\n if (field.type === 'upload') {\n if (!field.admin || !('isSortable' in field.admin)) {\n field.admin = {\n isSortable: true,\n ...field.admin,\n }\n }\n }\n\n if (field.type === 'array' && field.fields) {\n field.fields.push(baseIDField)\n }\n\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData(field)) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (typeof field.localized !== 'undefined') {\n let shouldDisableLocalized = !config.localization\n\n if (!config.compatibility?.allowLocalizedWithinLocalized && parentIsLocalized) {\n shouldDisableLocalized = true\n }\n\n if (shouldDisableLocalized) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n const defaultValidate = validations[field.type]\n if (defaultValidate) {\n field.validate = (val, options) => defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = (): true => true\n }\n }\n\n if (typeof field.virtual === 'undefined') {\n field.virtual = false\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n const sanitizeRichText = async (_config: SanitizedConfig) => {\n if (!field.editor) {\n if (_config.editor && !requireFieldLevelRichTextEditor) {\n // config.editor should be sanitized at this point\n field.editor = _config.editor\n } else {\n 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\n }\n }\n\n if (typeof field.editor === 'function') {\n field.editor = await field.editor({\n config: _config,\n isRoot: requireFieldLevelRichTextEditor,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n }\n\n if (field.editor.i18n && Object.keys(field.editor.i18n).length >= 0) {\n config.i18n.translations = deepMergeSimple(config.i18n.translations, field.editor.i18n)\n }\n }\n if (richTextSanitizationPromises) {\n richTextSanitizationPromises.push(sanitizeRichText)\n } else {\n await sanitizeRichText(config as unknown as SanitizedConfig)\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n for (const block of field.blocks) {\n if (block._sanitized === true) {\n continue\n }\n block._sanitized = true\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n\n block.fields = await sanitizeFields({\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n if ('name' in field && field.name) {\n schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}`\n }\n field.fields = await sanitizeFields({\n config,\n existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames,\n fields: field.fields,\n joins,\n parentIsLocalized: parentIsLocalized || field.localized,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n schemaPath,\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n for (let j = 0; j < field.tabs.length; j++) {\n const tab = field.tabs[j]\n if (tabHasName(tab)) {\n schemaPath = `${schemaPath || ''}${schemaPath ? '.' : ''}${tab.name}`\n if (typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n }\n\n tab.fields = await sanitizeFields({\n config,\n existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames,\n fields: tab.fields,\n joins,\n parentIsLocalized: parentIsLocalized || (tabHasName(tab) && tab.localized),\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n schemaPath,\n validRelationships,\n })\n field.tabs[j] = tab\n }\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n fields[i] = field\n }\n\n return fields\n}\n"],"names":["deepMergeSimple","DuplicateFieldName","InvalidFieldName","InvalidFieldRelationship","MissingEditorProp","MissingFieldType","formatLabels","toWords","baseBlockFields","baseIDField","setDefaultBeforeDuplicate","validations","sanitizeJoinField","fieldAffectsData","tabHasName","sanitizeFields","config","existingFieldNames","Set","fields","joins","parentIsLocalized","requireFieldLevelRichTextEditor","richTextSanitizationPromises","schemaPath","schemaPathArg","validRelationships","i","length","field","_sanitized","type","name","includes","label","defaultValue","required","relationships","Array","isArray","relationTo","forEach","relationship","min","minRows","console","warn","max","maxRows","admin","isSortable","push","labels","has","add","localized","shouldDisableLocalized","localization","compatibility","allowLocalizedWithinLocalized","validate","defaultValidate","val","options","virtual","hooks","access","sanitizeRichText","_config","editor","isRoot","i18n","Object","keys","translations","blocks","block","concat","slug","j","tabs","tab"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { SanitizedJoins } from '../../collections/config/types.js';
2
+ import type { Config } from '../../config/types.js';
3
+ import type { JoinField } from './types.js';
4
+ export declare const sanitizeJoinField: ({ config, field, joins, schemaPath, }: {
5
+ config: Config;
6
+ field: JoinField;
7
+ joins?: SanitizedJoins;
8
+ schemaPath?: string;
9
+ }) => void;
10
+ //# sourceMappingURL=sanitizeJoinField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitizeJoinField.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitizeJoinField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAA;AAK9D,eAAO,MAAM,iBAAiB,0CAK3B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,SAmEA,CAAA"}
@@ -0,0 +1,65 @@
1
+ import { APIError } from '../../errors/index.js';
2
+ import { InvalidFieldJoin } from '../../errors/InvalidFieldJoin.js';
3
+ import { traverseFields } from '../../utilities/traverseFields.js';
4
+ export const sanitizeJoinField = ({ config, field, joins, schemaPath })=>{
5
+ // the `joins` arg is not passed for globals or when recursing on fields that do not allow a join field
6
+ if (typeof joins === 'undefined') {
7
+ throw new APIError('Join fields cannot be added to arrays, blocks or globals.');
8
+ }
9
+ if (!field.maxDepth) {
10
+ field.maxDepth = 1;
11
+ }
12
+ const join = {
13
+ field,
14
+ schemaPath: `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}`
15
+ };
16
+ const joinCollection = config.collections.find((collection)=>collection.slug === field.collection);
17
+ if (!joinCollection) {
18
+ throw new InvalidFieldJoin(field);
19
+ }
20
+ let joinRelationship;
21
+ const pathSegments = field.on.split('.') // Split the schema path into segments
22
+ ;
23
+ let currentSegmentIndex = 0;
24
+ // Traverse fields and match based on the schema path
25
+ traverseFields({
26
+ callback: ({ field, next })=>{
27
+ const currentSegment = pathSegments[currentSegmentIndex];
28
+ // match field on path segments
29
+ if ('name' in field && field.name === currentSegment) {
30
+ // Check if this is the last segment in the path
31
+ if (currentSegmentIndex === pathSegments.length - 1 && 'type' in field && field.type === 'relationship') {
32
+ joinRelationship = field // Return the matched field
33
+ ;
34
+ next();
35
+ return true;
36
+ } else {
37
+ // Move to the next path segment and continue traversal
38
+ currentSegmentIndex++;
39
+ }
40
+ } else {
41
+ // skip fields in non-matching path segments
42
+ next();
43
+ return;
44
+ }
45
+ },
46
+ fields: joinCollection.fields
47
+ });
48
+ if (!joinRelationship) {
49
+ throw new InvalidFieldJoin(join.field);
50
+ }
51
+ if (joinRelationship.hasMany) {
52
+ throw new APIError('Join fields cannot be used with hasMany relationships.');
53
+ }
54
+ // override the join field localized property to use whatever the relationship field has
55
+ field.localized = joinRelationship.localized;
56
+ if (!joins[field.collection]) {
57
+ joins[field.collection] = [
58
+ join
59
+ ];
60
+ } else {
61
+ joins[field.collection].push(join);
62
+ }
63
+ };
64
+
65
+ //# sourceMappingURL=sanitizeJoinField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fields/config/sanitizeJoinField.ts"],"sourcesContent":["import type { SanitizedJoins } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { JoinField, RelationshipField } from './types.js'\n\nimport { APIError } from '../../errors/index.js'\nimport { InvalidFieldJoin } from '../../errors/InvalidFieldJoin.js'\nimport { traverseFields } from '../../utilities/traverseFields.js'\nexport const sanitizeJoinField = ({\n config,\n field,\n joins,\n schemaPath,\n}: {\n config: Config\n field: JoinField\n joins?: SanitizedJoins\n schemaPath?: string\n}) => {\n // the `joins` arg is not passed for globals or when recursing on fields that do not allow a join field\n if (typeof joins === 'undefined') {\n throw new APIError('Join fields cannot be added to arrays, blocks or globals.')\n }\n if (!field.maxDepth) {\n field.maxDepth = 1\n }\n const join = {\n field,\n schemaPath: `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}`,\n }\n const joinCollection = config.collections.find(\n (collection) => collection.slug === field.collection,\n )\n if (!joinCollection) {\n throw new InvalidFieldJoin(field)\n }\n let joinRelationship: RelationshipField | undefined\n\n const pathSegments = field.on.split('.') // Split the schema path into segments\n let currentSegmentIndex = 0\n\n // Traverse fields and match based on the schema path\n traverseFields({\n callback: ({ field, next }) => {\n const currentSegment = pathSegments[currentSegmentIndex]\n // match field on path segments\n if ('name' in field && field.name === currentSegment) {\n // Check if this is the last segment in the path\n if (\n currentSegmentIndex === pathSegments.length - 1 &&\n 'type' in field &&\n field.type === 'relationship'\n ) {\n joinRelationship = field // Return the matched field\n next()\n return true\n } else {\n // Move to the next path segment and continue traversal\n currentSegmentIndex++\n }\n } else {\n // skip fields in non-matching path segments\n next()\n return\n }\n },\n fields: joinCollection.fields,\n })\n\n if (!joinRelationship) {\n throw new InvalidFieldJoin(join.field)\n }\n\n if (joinRelationship.hasMany) {\n throw new APIError('Join fields cannot be used with hasMany relationships.')\n }\n\n // override the join field localized property to use whatever the relationship field has\n field.localized = joinRelationship.localized\n\n if (!joins[field.collection]) {\n joins[field.collection] = [join]\n } else {\n joins[field.collection].push(join)\n }\n}\n"],"names":["APIError","InvalidFieldJoin","traverseFields","sanitizeJoinField","config","field","joins","schemaPath","maxDepth","join","name","joinCollection","collections","find","collection","slug","joinRelationship","pathSegments","on","split","currentSegmentIndex","callback","next","currentSegment","length","type","fields","hasMany","localized","push"],"mappings":"AAIA,SAASA,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,cAAc,QAAQ,oCAAmC;AAClE,OAAO,MAAMC,oBAAoB,CAAC,EAChCC,MAAM,EACNC,KAAK,EACLC,KAAK,EACLC,UAAU,EAMX;IACC,uGAAuG;IACvG,IAAI,OAAOD,UAAU,aAAa;QAChC,MAAM,IAAIN,SAAS;IACrB;IACA,IAAI,CAACK,MAAMG,QAAQ,EAAE;QACnBH,MAAMG,QAAQ,GAAG;IACnB;IACA,MAAMC,OAAO;QACXJ;QACAE,YAAY,CAAC,EAAEA,cAAc,GAAG,EAAEA,aAAa,MAAM,GAAG,EAAEF,MAAMK,IAAI,CAAC,CAAC;IACxE;IACA,MAAMC,iBAAiBP,OAAOQ,WAAW,CAACC,IAAI,CAC5C,CAACC,aAAeA,WAAWC,IAAI,KAAKV,MAAMS,UAAU;IAEtD,IAAI,CAACH,gBAAgB;QACnB,MAAM,IAAIV,iBAAiBI;IAC7B;IACA,IAAIW;IAEJ,MAAMC,eAAeZ,MAAMa,EAAE,CAACC,KAAK,CAAC,KAAK,sCAAsC;;IAC/E,IAAIC,sBAAsB;IAE1B,qDAAqD;IACrDlB,eAAe;QACbmB,UAAU,CAAC,EAAEhB,KAAK,EAAEiB,IAAI,EAAE;YACxB,MAAMC,iBAAiBN,YAAY,CAACG,oBAAoB;YACxD,+BAA+B;YAC/B,IAAI,UAAUf,SAASA,MAAMK,IAAI,KAAKa,gBAAgB;gBACpD,gDAAgD;gBAChD,IACEH,wBAAwBH,aAAaO,MAAM,GAAG,KAC9C,UAAUnB,SACVA,MAAMoB,IAAI,KAAK,gBACf;oBACAT,mBAAmBX,MAAM,2BAA2B;;oBACpDiB;oBACA,OAAO;gBACT,OAAO;oBACL,uDAAuD;oBACvDF;gBACF;YACF,OAAO;gBACL,4CAA4C;gBAC5CE;gBACA;YACF;QACF;QACAI,QAAQf,eAAee,MAAM;IAC/B;IAEA,IAAI,CAACV,kBAAkB;QACrB,MAAM,IAAIf,iBAAiBQ,KAAKJ,KAAK;IACvC;IAEA,IAAIW,iBAAiBW,OAAO,EAAE;QAC5B,MAAM,IAAI3B,SAAS;IACrB;IAEA,wFAAwF;IACxFK,MAAMuB,SAAS,GAAGZ,iBAAiBY,SAAS;IAE5C,IAAI,CAACtB,KAAK,CAACD,MAAMS,UAAU,CAAC,EAAE;QAC5BR,KAAK,CAACD,MAAMS,UAAU,CAAC,GAAG;YAACL;SAAK;IAClC,OAAO;QACLH,KAAK,CAACD,MAAMS,UAAU,CAAC,CAACe,IAAI,CAACpB;IAC/B;AACF,EAAC"}