payload 4.0.0-internal.5f0cd13 → 4.0.0-internal.63f8536

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 (541) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +11 -0
  3. package/dist/admin/RichText.d.ts +2 -2
  4. package/dist/admin/RichText.d.ts.map +1 -1
  5. package/dist/admin/RichText.js.map +1 -1
  6. package/dist/admin/adapters/devReload.d.ts +9 -0
  7. package/dist/admin/adapters/devReload.d.ts.map +1 -0
  8. package/dist/admin/adapters/devReload.js +6 -0
  9. package/dist/admin/adapters/devReload.js.map +1 -0
  10. package/dist/admin/adapters/index.d.ts +3 -0
  11. package/dist/admin/adapters/index.d.ts.map +1 -1
  12. package/dist/admin/adapters/index.js.map +1 -1
  13. package/dist/admin/adapters/render.d.ts +16 -0
  14. package/dist/admin/adapters/render.d.ts.map +1 -0
  15. package/dist/admin/adapters/render.js +7 -0
  16. package/dist/admin/adapters/render.js.map +1 -0
  17. package/dist/admin/adapters/views.d.ts +36 -0
  18. package/dist/admin/adapters/views.d.ts.map +1 -0
  19. package/dist/admin/adapters/views.js +7 -0
  20. package/dist/admin/adapters/views.js.map +1 -0
  21. package/dist/admin/fields/Row.d.ts +2 -2
  22. package/dist/admin/fields/Row.d.ts.map +1 -1
  23. package/dist/admin/fields/Row.js.map +1 -1
  24. package/dist/admin/forms/Description.d.ts +2 -2
  25. package/dist/admin/forms/Description.d.ts.map +1 -1
  26. package/dist/admin/forms/Description.js.map +1 -1
  27. package/dist/admin/forms/Field.d.ts +10 -5
  28. package/dist/admin/forms/Field.d.ts.map +1 -1
  29. package/dist/admin/forms/Field.js.map +1 -1
  30. package/dist/admin/functions/index.d.ts +10 -1
  31. package/dist/admin/functions/index.d.ts.map +1 -1
  32. package/dist/admin/functions/index.js.map +1 -1
  33. package/dist/admin/types.d.ts +3 -2
  34. package/dist/admin/types.d.ts.map +1 -1
  35. package/dist/admin/types.js.map +1 -1
  36. package/dist/admin/views/dashboard.d.ts +7 -0
  37. package/dist/admin/views/dashboard.d.ts.map +1 -1
  38. package/dist/admin/views/dashboard.js.map +1 -1
  39. package/dist/admin/views/document.d.ts +5 -3
  40. package/dist/admin/views/document.d.ts.map +1 -1
  41. package/dist/admin/views/document.js.map +1 -1
  42. package/dist/admin/views/list.d.ts +5 -0
  43. package/dist/admin/views/list.d.ts.map +1 -1
  44. package/dist/admin/views/list.js.map +1 -1
  45. package/dist/auth/baseFields/apiKey.d.ts +10 -2
  46. package/dist/auth/baseFields/apiKey.d.ts.map +1 -1
  47. package/dist/auth/baseFields/apiKey.js +35 -24
  48. package/dist/auth/baseFields/apiKey.js.map +1 -1
  49. package/dist/auth/defaultAccess.d.ts +1 -1
  50. package/dist/auth/defaultAccess.d.ts.map +1 -1
  51. package/dist/auth/defaultAccess.js +1 -1
  52. package/dist/auth/defaultAccess.js.map +1 -1
  53. package/dist/auth/defaultUser.d.ts.map +1 -1
  54. package/dist/auth/defaultUser.js +2 -1
  55. package/dist/auth/defaultUser.js.map +1 -1
  56. package/dist/auth/getAuthFields.js +2 -2
  57. package/dist/auth/getAuthFields.js.map +1 -1
  58. package/dist/auth/operations/auth.d.ts +2 -2
  59. package/dist/auth/operations/auth.d.ts.map +1 -1
  60. package/dist/auth/operations/auth.js.map +1 -1
  61. package/dist/auth/operations/login.d.ts +2 -1
  62. package/dist/auth/operations/login.d.ts.map +1 -1
  63. package/dist/auth/operations/login.js.map +1 -1
  64. package/dist/auth/operations/me.js.map +1 -1
  65. package/dist/auth/operations/refresh.d.ts.map +1 -1
  66. package/dist/auth/operations/refresh.js +9 -3
  67. package/dist/auth/operations/refresh.js.map +1 -1
  68. package/dist/auth/operations/resetPassword.d.ts.map +1 -1
  69. package/dist/auth/operations/resetPassword.js.map +1 -1
  70. package/dist/auth/sendVerificationEmail.d.ts +2 -2
  71. package/dist/auth/sendVerificationEmail.d.ts.map +1 -1
  72. package/dist/auth/sendVerificationEmail.js +1 -1
  73. package/dist/auth/sendVerificationEmail.js.map +1 -1
  74. package/dist/auth/sessions.d.ts +4 -5
  75. package/dist/auth/sessions.d.ts.map +1 -1
  76. package/dist/auth/sessions.js +5 -3
  77. package/dist/auth/sessions.js.map +1 -1
  78. package/dist/auth/strategies/apiKey.js.map +1 -1
  79. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts +2 -2
  80. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts.map +1 -1
  81. package/dist/auth/strategies/local/incrementLoginAttempts.js +1 -1
  82. package/dist/auth/strategies/local/incrementLoginAttempts.js.map +1 -1
  83. package/dist/auth/types.d.ts +28 -21
  84. package/dist/auth/types.d.ts.map +1 -1
  85. package/dist/auth/types.js.map +1 -1
  86. package/dist/bin/build.d.ts +25 -0
  87. package/dist/bin/build.d.ts.map +1 -0
  88. package/dist/bin/build.js +80 -0
  89. package/dist/bin/build.js.map +1 -0
  90. package/dist/bin/build.spec.js +170 -0
  91. package/dist/bin/build.spec.js.map +1 -0
  92. package/dist/bin/generateImportMap/index.d.ts.map +1 -1
  93. package/dist/bin/generateImportMap/index.js +8 -5
  94. package/dist/bin/generateImportMap/index.js.map +1 -1
  95. package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
  96. package/dist/bin/generateImportMap/iterateCollections.js +11 -0
  97. package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
  98. package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
  99. package/dist/bin/generateImportMap/iterateConfig.js +12 -0
  100. package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
  101. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.d.ts +5 -1
  102. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.d.ts.map +1 -1
  103. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js +32 -18
  104. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js.map +1 -1
  105. package/dist/bin/generateTypes.d.ts +3 -2
  106. package/dist/bin/generateTypes.d.ts.map +1 -1
  107. package/dist/bin/generateTypes.js +4 -0
  108. package/dist/bin/generateTypes.js.map +1 -1
  109. package/dist/bin/index.d.ts.map +1 -1
  110. package/dist/bin/index.js +9 -0
  111. package/dist/bin/index.js.map +1 -1
  112. package/dist/bin/loadEnv.d.ts +3 -1
  113. package/dist/bin/loadEnv.d.ts.map +1 -1
  114. package/dist/bin/loadEnv.js +40 -10
  115. package/dist/bin/loadEnv.js.map +1 -1
  116. package/dist/collections/config/client.d.ts +1 -1
  117. package/dist/collections/config/client.d.ts.map +1 -1
  118. package/dist/collections/config/client.js +1 -0
  119. package/dist/collections/config/client.js.map +1 -1
  120. package/dist/collections/config/defaults.d.ts +0 -4
  121. package/dist/collections/config/defaults.d.ts.map +1 -1
  122. package/dist/collections/config/defaults.js +2 -17
  123. package/dist/collections/config/defaults.js.map +1 -1
  124. package/dist/collections/config/defaults.spec.js +47 -0
  125. package/dist/collections/config/defaults.spec.js.map +1 -0
  126. package/dist/collections/config/sanitize.d.ts.map +1 -1
  127. package/dist/collections/config/sanitize.js +1 -11
  128. package/dist/collections/config/sanitize.js.map +1 -1
  129. package/dist/collections/config/types.d.ts +11 -7
  130. package/dist/collections/config/types.d.ts.map +1 -1
  131. package/dist/collections/config/types.js.map +1 -1
  132. package/dist/collections/endpoints/create.d.ts.map +1 -1
  133. package/dist/collections/endpoints/create.js +0 -2
  134. package/dist/collections/endpoints/create.js.map +1 -1
  135. package/dist/collections/endpoints/updateByID.d.ts.map +1 -1
  136. package/dist/collections/endpoints/updateByID.js +1 -2
  137. package/dist/collections/endpoints/updateByID.js.map +1 -1
  138. package/dist/collections/operations/count.d.ts.map +1 -1
  139. package/dist/collections/operations/count.js +1 -0
  140. package/dist/collections/operations/count.js.map +1 -1
  141. package/dist/collections/operations/create.d.ts +0 -1
  142. package/dist/collections/operations/create.d.ts.map +1 -1
  143. package/dist/collections/operations/create.js +15 -6
  144. package/dist/collections/operations/create.js.map +1 -1
  145. package/dist/collections/operations/delete.d.ts.map +1 -1
  146. package/dist/collections/operations/delete.js +3 -0
  147. package/dist/collections/operations/delete.js.map +1 -1
  148. package/dist/collections/operations/findDistinct.d.ts.map +1 -1
  149. package/dist/collections/operations/findDistinct.js +1 -0
  150. package/dist/collections/operations/findDistinct.js.map +1 -1
  151. package/dist/collections/operations/local/count.d.ts +3 -3
  152. package/dist/collections/operations/local/count.d.ts.map +1 -1
  153. package/dist/collections/operations/local/count.js.map +1 -1
  154. package/dist/collections/operations/local/countVersions.d.ts +3 -3
  155. package/dist/collections/operations/local/countVersions.d.ts.map +1 -1
  156. package/dist/collections/operations/local/countVersions.js.map +1 -1
  157. package/dist/collections/operations/local/create.d.ts +3 -3
  158. package/dist/collections/operations/local/create.d.ts.map +1 -1
  159. package/dist/collections/operations/local/create.js.map +1 -1
  160. package/dist/collections/operations/local/delete.d.ts +3 -3
  161. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  162. package/dist/collections/operations/local/delete.js.map +1 -1
  163. package/dist/collections/operations/local/duplicate.d.ts +3 -3
  164. package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
  165. package/dist/collections/operations/local/duplicate.js.map +1 -1
  166. package/dist/collections/operations/local/find.d.ts +3 -3
  167. package/dist/collections/operations/local/find.d.ts.map +1 -1
  168. package/dist/collections/operations/local/find.js.map +1 -1
  169. package/dist/collections/operations/local/findByID.d.ts +3 -3
  170. package/dist/collections/operations/local/findByID.d.ts.map +1 -1
  171. package/dist/collections/operations/local/findByID.js.map +1 -1
  172. package/dist/collections/operations/local/findDistinct.d.ts +2 -2
  173. package/dist/collections/operations/local/findDistinct.d.ts.map +1 -1
  174. package/dist/collections/operations/local/findDistinct.js.map +1 -1
  175. package/dist/collections/operations/local/findVersionByID.d.ts +3 -3
  176. package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
  177. package/dist/collections/operations/local/findVersionByID.js.map +1 -1
  178. package/dist/collections/operations/local/findVersions.d.ts +3 -3
  179. package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
  180. package/dist/collections/operations/local/findVersions.js.map +1 -1
  181. package/dist/collections/operations/local/restoreVersion.d.ts +3 -3
  182. package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
  183. package/dist/collections/operations/local/restoreVersion.js.map +1 -1
  184. package/dist/collections/operations/local/update.d.ts +7 -11
  185. package/dist/collections/operations/local/update.d.ts.map +1 -1
  186. package/dist/collections/operations/local/update.js +1 -2
  187. package/dist/collections/operations/local/update.js.map +1 -1
  188. package/dist/collections/operations/update.d.ts +0 -1
  189. package/dist/collections/operations/update.d.ts.map +1 -1
  190. package/dist/collections/operations/update.js +8 -4
  191. package/dist/collections/operations/update.js.map +1 -1
  192. package/dist/collections/operations/updateByID.d.ts +0 -1
  193. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  194. package/dist/collections/operations/updateByID.js +1 -5
  195. package/dist/collections/operations/updateByID.js.map +1 -1
  196. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts +9 -0
  197. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts.map +1 -0
  198. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js +170 -0
  199. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js.map +1 -0
  200. package/dist/collections/operations/utilities/types.d.ts +0 -9
  201. package/dist/collections/operations/utilities/types.d.ts.map +1 -1
  202. package/dist/collections/operations/utilities/types.js.map +1 -1
  203. package/dist/collections/operations/utilities/update.d.ts +1 -2
  204. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  205. package/dist/collections/operations/utilities/update.js +64 -65
  206. package/dist/collections/operations/utilities/update.js.map +1 -1
  207. package/dist/config/client.d.ts +2 -2
  208. package/dist/config/client.d.ts.map +1 -1
  209. package/dist/config/client.js.map +1 -1
  210. package/dist/config/defaults.d.ts +0 -4
  211. package/dist/config/defaults.d.ts.map +1 -1
  212. package/dist/config/defaults.js +0 -78
  213. package/dist/config/defaults.js.map +1 -1
  214. package/dist/config/definePlugin.d.ts +10 -10
  215. package/dist/config/definePlugin.d.ts.map +1 -1
  216. package/dist/config/definePlugin.js +7 -11
  217. package/dist/config/definePlugin.js.map +1 -1
  218. package/dist/config/orderable/index.d.ts.map +1 -1
  219. package/dist/config/orderable/index.js +23 -0
  220. package/dist/config/orderable/index.js.map +1 -1
  221. package/dist/config/sanitize.d.ts.map +1 -1
  222. package/dist/config/sanitize.js +137 -13
  223. package/dist/config/sanitize.js.map +1 -1
  224. package/dist/config/types.d.ts +57 -19
  225. package/dist/config/types.d.ts.map +1 -1
  226. package/dist/config/types.js +2 -0
  227. package/dist/config/types.js.map +1 -1
  228. package/dist/database/getLocalizedPaths.d.ts.map +1 -1
  229. package/dist/database/getLocalizedPaths.js +1 -1
  230. package/dist/database/getLocalizedPaths.js.map +1 -1
  231. package/dist/database/migrations/migrationsCollection.d.ts.map +1 -1
  232. package/dist/database/migrations/migrationsCollection.js +2 -1
  233. package/dist/database/migrations/migrationsCollection.js.map +1 -1
  234. package/dist/errors/ValidationError.d.ts +1 -0
  235. package/dist/errors/ValidationError.d.ts.map +1 -1
  236. package/dist/errors/ValidationError.js.map +1 -1
  237. package/dist/exports/internal.d.ts +1 -0
  238. package/dist/exports/internal.d.ts.map +1 -1
  239. package/dist/exports/internal.js +1 -0
  240. package/dist/exports/internal.js.map +1 -1
  241. package/dist/exports/migrations.d.ts +5 -13
  242. package/dist/exports/migrations.d.ts.map +1 -1
  243. package/dist/exports/migrations.js +5 -13
  244. package/dist/exports/migrations.js.map +1 -1
  245. package/dist/exports/shared.d.ts +23 -2
  246. package/dist/exports/shared.d.ts.map +1 -1
  247. package/dist/exports/shared.js +22 -1
  248. package/dist/exports/shared.js.map +1 -1
  249. package/dist/fields/baseFields/slug/countVersions.d.ts.map +1 -1
  250. package/dist/fields/baseFields/slug/countVersions.js +6 -8
  251. package/dist/fields/baseFields/slug/countVersions.js.map +1 -1
  252. package/dist/fields/baseFields/slug/generateSlug.d.ts +14 -7
  253. package/dist/fields/baseFields/slug/generateSlug.d.ts.map +1 -1
  254. package/dist/fields/baseFields/slug/generateSlug.js +53 -73
  255. package/dist/fields/baseFields/slug/generateSlug.js.map +1 -1
  256. package/dist/fields/baseFields/slug/types.d.ts +14 -0
  257. package/dist/fields/baseFields/slug/types.d.ts.map +1 -0
  258. package/dist/fields/baseFields/slug/types.js +6 -0
  259. package/dist/fields/baseFields/slug/types.js.map +1 -0
  260. package/dist/fields/config/client.d.ts +3 -3
  261. package/dist/fields/config/client.d.ts.map +1 -1
  262. package/dist/fields/config/client.js +13 -13
  263. package/dist/fields/config/client.js.map +1 -1
  264. package/dist/fields/config/sanitize.d.ts.map +1 -1
  265. package/dist/fields/config/sanitize.js +40 -4
  266. package/dist/fields/config/sanitize.js.map +1 -1
  267. package/dist/fields/config/types.d.ts +49 -28
  268. package/dist/fields/config/types.d.ts.map +1 -1
  269. package/dist/fields/config/types.js.map +1 -1
  270. package/dist/fields/hooks/afterChange/promise.js +1 -1
  271. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  272. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  273. package/dist/fields/hooks/afterRead/promise.js +13 -3
  274. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  275. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  276. package/dist/fields/hooks/beforeChange/promise.js +3 -3
  277. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  278. package/dist/fields/hooks/beforeDuplicate/promise.js +2 -2
  279. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  280. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  281. package/dist/fields/hooks/beforeValidate/promise.js +11 -2
  282. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  283. package/dist/fields/setDefaultBeforeDuplicate.js +1 -0
  284. package/dist/fields/setDefaultBeforeDuplicate.js.map +1 -1
  285. package/dist/fields/sortableFieldTypes.d.ts.map +1 -1
  286. package/dist/fields/sortableFieldTypes.js +1 -0
  287. package/dist/fields/sortableFieldTypes.js.map +1 -1
  288. package/dist/fields/validations.d.ts +4 -1
  289. package/dist/fields/validations.d.ts.map +1 -1
  290. package/dist/fields/validations.js +12 -4
  291. package/dist/fields/validations.js.map +1 -1
  292. package/dist/globals/config/sanitize.d.ts.map +1 -1
  293. package/dist/globals/config/sanitize.js +2 -6
  294. package/dist/globals/config/sanitize.js.map +1 -1
  295. package/dist/globals/config/sanitize.spec.js +43 -0
  296. package/dist/globals/config/sanitize.spec.js.map +1 -0
  297. package/dist/globals/endpoints/update.d.ts.map +1 -1
  298. package/dist/globals/endpoints/update.js +0 -2
  299. package/dist/globals/endpoints/update.js.map +1 -1
  300. package/dist/globals/operations/local/countVersions.d.ts +3 -3
  301. package/dist/globals/operations/local/countVersions.d.ts.map +1 -1
  302. package/dist/globals/operations/local/countVersions.js.map +1 -1
  303. package/dist/globals/operations/local/findOne.d.ts +3 -3
  304. package/dist/globals/operations/local/findOne.d.ts.map +1 -1
  305. package/dist/globals/operations/local/findOne.js.map +1 -1
  306. package/dist/globals/operations/local/findVersionByID.d.ts +3 -3
  307. package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
  308. package/dist/globals/operations/local/findVersionByID.js.map +1 -1
  309. package/dist/globals/operations/local/findVersions.d.ts +3 -3
  310. package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
  311. package/dist/globals/operations/local/findVersions.js.map +1 -1
  312. package/dist/globals/operations/local/restoreVersion.d.ts +3 -3
  313. package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
  314. package/dist/globals/operations/local/restoreVersion.js.map +1 -1
  315. package/dist/globals/operations/local/update.d.ts +7 -9
  316. package/dist/globals/operations/local/update.d.ts.map +1 -1
  317. package/dist/globals/operations/local/update.js +1 -2
  318. package/dist/globals/operations/local/update.js.map +1 -1
  319. package/dist/globals/operations/update.d.ts +0 -1
  320. package/dist/globals/operations/update.d.ts.map +1 -1
  321. package/dist/globals/operations/update.js +52 -58
  322. package/dist/globals/operations/update.js.map +1 -1
  323. package/dist/index.bundled.d.ts +595 -368
  324. package/dist/index.d.ts +71 -26
  325. package/dist/index.d.ts.map +1 -1
  326. package/dist/index.js +54 -37
  327. package/dist/index.js.map +1 -1
  328. package/dist/kv/adapters/DatabaseKVAdapter.d.ts.map +1 -1
  329. package/dist/kv/adapters/DatabaseKVAdapter.js +1 -0
  330. package/dist/kv/adapters/DatabaseKVAdapter.js.map +1 -1
  331. package/dist/locked-documents/config.d.ts.map +1 -1
  332. package/dist/locked-documents/config.js +2 -1
  333. package/dist/locked-documents/config.js.map +1 -1
  334. package/dist/preferences/config.d.ts.map +1 -1
  335. package/dist/preferences/config.js +2 -1
  336. package/dist/preferences/config.js.map +1 -1
  337. package/dist/preferences/keys.d.ts +4 -0
  338. package/dist/preferences/keys.d.ts.map +1 -1
  339. package/dist/preferences/keys.js +4 -1
  340. package/dist/preferences/keys.js.map +1 -1
  341. package/dist/preferences/types.d.ts +15 -0
  342. package/dist/preferences/types.d.ts.map +1 -1
  343. package/dist/preferences/types.js +3 -1
  344. package/dist/preferences/types.js.map +1 -1
  345. package/dist/query-presets/config.d.ts.map +1 -1
  346. package/dist/query-presets/config.js +75 -35
  347. package/dist/query-presets/config.js.map +1 -1
  348. package/dist/query-presets/constraints.d.ts.map +1 -1
  349. package/dist/query-presets/constraints.js +2 -1
  350. package/dist/query-presets/constraints.js.map +1 -1
  351. package/dist/queues/config/collection.d.ts.map +1 -1
  352. package/dist/queues/config/collection.js +2 -1
  353. package/dist/queues/config/collection.js.map +1 -1
  354. package/dist/queues/config/generateJobsJSONSchemas.js +2 -2
  355. package/dist/queues/config/generateJobsJSONSchemas.js.map +1 -1
  356. package/dist/queues/config/global.d.ts.map +1 -1
  357. package/dist/queues/config/global.js +2 -1
  358. package/dist/queues/config/global.js.map +1 -1
  359. package/dist/types/index.d.ts +8 -3
  360. package/dist/types/index.d.ts.map +1 -1
  361. package/dist/types/index.js.map +1 -1
  362. package/dist/uploads/generateFileData.d.ts +2 -1
  363. package/dist/uploads/generateFileData.d.ts.map +1 -1
  364. package/dist/uploads/generateFileData.js +5 -2
  365. package/dist/uploads/generateFileData.js.map +1 -1
  366. package/dist/uploads/matchMimeType.d.ts +8 -0
  367. package/dist/uploads/matchMimeType.d.ts.map +1 -0
  368. package/dist/uploads/matchMimeType.js +19 -0
  369. package/dist/uploads/matchMimeType.js.map +1 -0
  370. package/dist/uploads/matchMimeType.spec.js +66 -0
  371. package/dist/uploads/matchMimeType.spec.js.map +1 -0
  372. package/dist/uploads/safeFetch.d.ts.map +1 -1
  373. package/dist/uploads/safeFetch.js +11 -5
  374. package/dist/uploads/safeFetch.js.map +1 -1
  375. package/dist/uploads/types.d.ts +21 -0
  376. package/dist/uploads/types.d.ts.map +1 -1
  377. package/dist/uploads/types.js.map +1 -1
  378. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  379. package/dist/utilities/addDataAndFileToRequest.js +6 -0
  380. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  381. package/dist/utilities/appendDateTimezoneSelectFields.js +2 -2
  382. package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
  383. package/dist/utilities/configToJSONSchema.d.ts +36 -2
  384. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  385. package/dist/utilities/configToJSONSchema.js +204 -84
  386. package/dist/utilities/configToJSONSchema.js.map +1 -1
  387. package/dist/utilities/configToJSONSchema.spec.js +534 -29
  388. package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
  389. package/dist/utilities/createLocalReq.d.ts +2 -2
  390. package/dist/utilities/createLocalReq.d.ts.map +1 -1
  391. package/dist/utilities/createLocalReq.js.map +1 -1
  392. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  393. package/dist/utilities/createPayloadRequest.js +1 -0
  394. package/dist/utilities/createPayloadRequest.js.map +1 -1
  395. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  396. package/dist/utilities/deepCopyObject.js +8 -0
  397. package/dist/utilities/deepCopyObject.js.map +1 -1
  398. package/dist/utilities/dependencies/dependencyChecker.js +1 -1
  399. package/dist/utilities/dependencies/dependencyChecker.js.map +1 -1
  400. package/dist/utilities/dependencies/getDependencies.d.ts.map +1 -1
  401. package/dist/utilities/dependencies/getDependencies.js +5 -5
  402. package/dist/utilities/dependencies/getDependencies.js.map +1 -1
  403. package/dist/utilities/dynamicImport.js +1 -1
  404. package/dist/utilities/dynamicImport.js.map +1 -1
  405. package/dist/utilities/filterDataToSelectedLocales.d.ts.map +1 -1
  406. package/dist/utilities/filterDataToSelectedLocales.js +5 -12
  407. package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
  408. package/dist/utilities/filterDataToSelectedLocales.spec.js +1 -2
  409. package/dist/utilities/filterDataToSelectedLocales.spec.js.map +1 -1
  410. package/dist/utilities/flattenAllFields.d.ts.map +1 -1
  411. package/dist/utilities/flattenAllFields.js +7 -22
  412. package/dist/utilities/flattenAllFields.js.map +1 -1
  413. package/dist/utilities/formatErrors.d.ts.map +1 -1
  414. package/dist/utilities/formatErrors.js +3 -1
  415. package/dist/utilities/formatErrors.js.map +1 -1
  416. package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
  417. package/dist/utilities/getEntityPermissions/getEntityPermissions.js +2 -0
  418. package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
  419. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts +7 -1
  420. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts.map +1 -1
  421. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js +24 -7
  422. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
  423. package/dist/utilities/getFieldByPath.d.ts.map +1 -1
  424. package/dist/utilities/getFieldByPath.js +1 -1
  425. package/dist/utilities/getFieldByPath.js.map +1 -1
  426. package/dist/utilities/getRequestLanguage.d.ts +2 -2
  427. package/dist/utilities/getRequestLanguage.d.ts.map +1 -1
  428. package/dist/utilities/getRequestLanguage.js.map +1 -1
  429. package/dist/utilities/getVersionsConfig.js.map +1 -1
  430. package/dist/utilities/handleEndpoints.d.ts.map +1 -1
  431. package/dist/utilities/handleEndpoints.js +7 -3
  432. package/dist/utilities/handleEndpoints.js.map +1 -1
  433. package/dist/utilities/isURLAllowed.d.ts.map +1 -1
  434. package/dist/utilities/isURLAllowed.js +9 -3
  435. package/dist/utilities/isURLAllowed.js.map +1 -1
  436. package/dist/utilities/isURLAllowed.spec.js +78 -0
  437. package/dist/utilities/isURLAllowed.spec.js.map +1 -0
  438. package/dist/utilities/mergeLocalizedData.d.ts +14 -4
  439. package/dist/utilities/mergeLocalizedData.d.ts.map +1 -1
  440. package/dist/utilities/mergeLocalizedData.js +54 -46
  441. package/dist/utilities/mergeLocalizedData.js.map +1 -1
  442. package/dist/utilities/mergeLocalizedData.spec.js +23 -23
  443. package/dist/utilities/mergeLocalizedData.spec.js.map +1 -1
  444. package/dist/utilities/parseParams/index.d.ts +2 -5
  445. package/dist/utilities/parseParams/index.d.ts.map +1 -1
  446. package/dist/utilities/parseParams/index.js.map +1 -1
  447. package/dist/utilities/parseParams/index.spec.js +0 -9
  448. package/dist/utilities/parseParams/index.spec.js.map +1 -1
  449. package/dist/utilities/telemetry/events/adminInit.d.ts.map +1 -1
  450. package/dist/utilities/telemetry/events/adminInit.js +2 -3
  451. package/dist/utilities/telemetry/events/adminInit.js.map +1 -1
  452. package/dist/utilities/telemetry/events/serverInit.d.ts.map +1 -1
  453. package/dist/utilities/telemetry/events/serverInit.js +2 -3
  454. package/dist/utilities/telemetry/events/serverInit.js.map +1 -1
  455. package/dist/utilities/telemetry/index.d.ts +14 -3
  456. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  457. package/dist/utilities/telemetry/index.js +6 -1
  458. package/dist/utilities/telemetry/index.js.map +1 -1
  459. package/dist/utilities/telemetry/index.spec.js +43 -0
  460. package/dist/utilities/telemetry/index.spec.js.map +1 -0
  461. package/dist/utilities/transformColumnPreferences.js +4 -2
  462. package/dist/utilities/transformColumnPreferences.js.map +1 -1
  463. package/dist/utilities/traverseFields.d.ts.map +1 -1
  464. package/dist/utilities/traverseFields.js +2 -4
  465. package/dist/utilities/traverseFields.js.map +1 -1
  466. package/dist/utilities/traverseForLocalizedFields.d.ts.map +1 -1
  467. package/dist/utilities/traverseForLocalizedFields.js +3 -0
  468. package/dist/utilities/traverseForLocalizedFields.js.map +1 -1
  469. package/dist/versions/baseFields.d.ts +1 -2
  470. package/dist/versions/baseFields.d.ts.map +1 -1
  471. package/dist/versions/baseFields.js +0 -13
  472. package/dist/versions/baseFields.js.map +1 -1
  473. package/dist/versions/buildCollectionFields.d.ts.map +1 -1
  474. package/dist/versions/buildCollectionFields.js +0 -2
  475. package/dist/versions/buildCollectionFields.js.map +1 -1
  476. package/dist/versions/buildGlobalFields.d.ts.map +1 -1
  477. package/dist/versions/buildGlobalFields.js +0 -2
  478. package/dist/versions/buildGlobalFields.js.map +1 -1
  479. package/dist/versions/buildSingleLocalePublishData.d.ts +32 -0
  480. package/dist/versions/buildSingleLocalePublishData.d.ts.map +1 -0
  481. package/dist/versions/buildSingleLocalePublishData.js +37 -0
  482. package/dist/versions/buildSingleLocalePublishData.js.map +1 -0
  483. package/dist/versions/saveVersion.d.ts +0 -2
  484. package/dist/versions/saveVersion.d.ts.map +1 -1
  485. package/dist/versions/saveVersion.js +12 -17
  486. package/dist/versions/saveVersion.js.map +1 -1
  487. package/dist/versions/schedule/job.d.ts.map +1 -1
  488. package/dist/versions/schedule/job.js +6 -10
  489. package/dist/versions/schedule/job.js.map +1 -1
  490. package/dist/versions/types.d.ts +2 -15
  491. package/dist/versions/types.d.ts.map +1 -1
  492. package/dist/versions/types.js.map +1 -1
  493. package/package.json +9 -6
  494. package/dist/database/migrations/templates/localizeStatus.d.ts +0 -10
  495. package/dist/database/migrations/templates/localizeStatus.d.ts.map +0 -1
  496. package/dist/database/migrations/templates/localizeStatus.js +0 -54
  497. package/dist/database/migrations/templates/localizeStatus.js.map +0 -1
  498. package/dist/fields/baseFields/slug/index.d.ts +0 -89
  499. package/dist/fields/baseFields/slug/index.d.ts.map +0 -1
  500. package/dist/fields/baseFields/slug/index.js +0 -81
  501. package/dist/fields/baseFields/slug/index.js.map +0 -1
  502. package/dist/versions/migrations/localizeStatus/index.d.ts +0 -12
  503. package/dist/versions/migrations/localizeStatus/index.d.ts.map +0 -1
  504. package/dist/versions/migrations/localizeStatus/index.js +0 -33
  505. package/dist/versions/migrations/localizeStatus/index.js.map +0 -1
  506. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts +0 -9
  507. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts.map +0 -1
  508. package/dist/versions/migrations/localizeStatus/mongo/down.js +0 -112
  509. package/dist/versions/migrations/localizeStatus/mongo/down.js.map +0 -1
  510. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts +0 -8
  511. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts.map +0 -1
  512. package/dist/versions/migrations/localizeStatus/mongo/index.js +0 -8
  513. package/dist/versions/migrations/localizeStatus/mongo/index.js.map +0 -1
  514. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts +0 -9
  515. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts.map +0 -1
  516. package/dist/versions/migrations/localizeStatus/mongo/up.js +0 -220
  517. package/dist/versions/migrations/localizeStatus/mongo/up.js.map +0 -1
  518. package/dist/versions/migrations/localizeStatus/sql/down.d.ts +0 -11
  519. package/dist/versions/migrations/localizeStatus/sql/down.d.ts.map +0 -1
  520. package/dist/versions/migrations/localizeStatus/sql/down.js +0 -213
  521. package/dist/versions/migrations/localizeStatus/sql/down.js.map +0 -1
  522. package/dist/versions/migrations/localizeStatus/sql/index.d.ts +0 -8
  523. package/dist/versions/migrations/localizeStatus/sql/index.d.ts.map +0 -1
  524. package/dist/versions/migrations/localizeStatus/sql/index.js +0 -8
  525. package/dist/versions/migrations/localizeStatus/sql/index.js.map +0 -1
  526. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts +0 -13
  527. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts.map +0 -1
  528. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js +0 -51
  529. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js.map +0 -1
  530. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts +0 -13
  531. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts.map +0 -1
  532. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js +0 -54
  533. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js.map +0 -1
  534. package/dist/versions/migrations/localizeStatus/sql/up.d.ts +0 -11
  535. package/dist/versions/migrations/localizeStatus/sql/up.d.ts.map +0 -1
  536. package/dist/versions/migrations/localizeStatus/sql/up.js +0 -277
  537. package/dist/versions/migrations/localizeStatus/sql/up.js.map +0 -1
  538. package/dist/versions/saveSnapshot.d.ts +0 -18
  539. package/dist/versions/saveSnapshot.d.ts.map +0 -1
  540. package/dist/versions/saveSnapshot.js +0 -38
  541. package/dist/versions/saveSnapshot.js.map +0 -1
@@ -3,7 +3,7 @@
3
3
  import { getFromImportMap } from '../../bin/generateImportMap/utilities/getFromImportMap.js';
4
4
  import { MissingEditorProp } from '../../errors/MissingEditorProp.js';
5
5
  import { fieldAffectsData } from '../../fields/config/types.js';
6
- import { flattenTopLevelFields } from '../../index.js';
6
+ import { flattenTopLevelFields } from '../../utilities/flattenTopLevelFields.js';
7
7
  const serverOnlyFieldProperties = [
8
8
  'hooks',
9
9
  'access',
@@ -15,7 +15,8 @@ const serverOnlyFieldProperties = [
15
15
  'jsonSchema',
16
16
  'dbName',
17
17
  'enumName',
18
- 'graphQL'
18
+ 'graphQL',
19
+ 'slugify'
19
20
  ];
20
21
  const serverOnlyFieldAdminProperties = [
21
22
  'condition',
@@ -224,14 +225,6 @@ export const createClientField = ({ defaultIDType, field: incomingField, i18n, i
224
225
  }
225
226
  }
226
227
  }
227
- if (incomingField.blockReferences?.length) {
228
- field.blockReferences = createClientBlocks({
229
- blocks: incomingField.blockReferences,
230
- defaultIDType,
231
- i18n,
232
- importMap
233
- });
234
- }
235
228
  if (incomingField.blocks?.length) {
236
229
  field.blocks = createClientBlocks({
237
230
  blocks: incomingField.blocks,
@@ -321,9 +314,16 @@ export const createClientField = ({ defaultIDType, field: incomingField, i18n, i
321
314
  i18n,
322
315
  importMap
323
316
  });
324
- } else if ((key === 'label' || key === 'description') && typeof tabProp === 'function') {
325
- // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve
326
- clientTab[key] = tabProp({
317
+ } else if (key === 'label' && typeof tabProp === 'function') {
318
+ const label = tabProp;
319
+ clientTab.label = label({
320
+ i18n,
321
+ t: i18n.t
322
+ });
323
+ } else if (key === 'description' && typeof tabProp === 'function') {
324
+ const description = tabProp;
325
+ clientTab.description = description({
326
+ i18n,
327
327
  t: i18n.t
328
328
  });
329
329
  } else if (key === 'admin') {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/client.ts"],"sourcesContent":["// @ts-strict-ignore\n/* eslint-disable perfectionist/sort-switch-case */\n// Keep perfectionist/sort-switch-case disabled - it incorrectly messes up the ordering of the switch cases, causing it to break\nimport type { I18nClient, TFunction } from '@payloadcms/translations'\n\nimport type {\n AdminClient,\n ArrayFieldClient,\n Block,\n BlockJSX,\n BlocksFieldClient,\n ClientBlock,\n ClientField,\n DateFieldClient,\n Field,\n FieldBase,\n JoinFieldClient,\n LabelsClient,\n RadioFieldClient,\n RowFieldClient,\n SelectFieldClient,\n TabsFieldClient,\n} from '../../fields/config/types.js'\nimport type { Payload } from '../../types/index.js'\n\nimport { getFromImportMap } from '../../bin/generateImportMap/utilities/getFromImportMap.js'\nimport { MissingEditorProp } from '../../errors/MissingEditorProp.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { flattenTopLevelFields, type ImportMap } from '../../index.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`, `upload`, and `select` only property\n | 'graphQL'\n | 'jsonSchema'\n | 'label'\n | 'validate'\n | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>\n\nexport type ServerOnlyFieldAdminProperties = keyof Pick<\n FieldBase['admin'],\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n 'components' | 'condition'\n>\n\nconst serverOnlyFieldProperties: Partial<ServerOnlyFieldProperties>[] = [\n 'hooks',\n 'access',\n 'validate',\n 'defaultValue',\n 'filterOptions', // This is a `relationship`, `upload`, and `select` only property\n 'editor', // This is a `richText` only property\n 'custom',\n 'jsonSchema',\n 'dbName', // can be a function\n 'enumName', // can be a function\n 'graphQL', // client does not need graphQL\n // the following props are handled separately (see below):\n // `label`\n // `fields`\n // `blocks`\n // `tabs`\n // `admin`\n]\n\nconst serverOnlyFieldAdminProperties: Partial<ServerOnlyFieldAdminProperties>[] = [\n 'condition',\n 'components',\n]\n\ntype FieldWithDescription = {\n admin: AdminClient\n} & ClientField\n\nexport const createClientBlocks = ({\n blocks,\n defaultIDType,\n i18n,\n importMap,\n}: {\n blocks: (Block | string)[]\n defaultIDType: Payload['config']['db']['defaultIDType']\n i18n: I18nClient\n importMap: ImportMap\n}): (ClientBlock | string)[] | ClientBlock[] => {\n const clientBlocks: (ClientBlock | string)[] = []\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]!\n\n if (typeof block === 'string') {\n // Do not process blocks that are just strings - they are processed once in the client config\n clientBlocks.push(block)\n continue\n }\n\n const clientBlock: ClientBlock = {\n slug: block.slug,\n fields: [],\n }\n if (block.imageAltText) {\n clientBlock.imageAltText = block.imageAltText\n }\n if (block.imageURL) {\n clientBlock.imageURL = block.imageURL\n }\n\n if (block.admin?.custom || block.admin?.group || block.admin?.images) {\n clientBlock.admin = {}\n if (block.admin.custom) {\n clientBlock.admin.custom = block.admin.custom\n }\n if (block.admin.group) {\n clientBlock.admin.group = block.admin.group\n }\n if (block.admin.images) {\n clientBlock.admin.images = block.admin.images\n }\n }\n\n if (block?.admin?.jsx) {\n const jsxResolved = getFromImportMap<BlockJSX>({\n importMap,\n PayloadComponent: block.admin.jsx,\n schemaPath: '',\n })\n clientBlock.jsx = jsxResolved\n }\n\n if (block?.admin?.disableBlockName) {\n // Check for existing admin object, this way we don't have to spread it in\n if (clientBlock.admin) {\n clientBlock.admin.disableBlockName = block.admin.disableBlockName\n } else {\n clientBlock.admin = { disableBlockName: block.admin.disableBlockName }\n }\n }\n\n if (block.labels) {\n clientBlock.labels = {} as unknown as LabelsClient\n\n if (block.labels.singular) {\n if (typeof block.labels.singular === 'function') {\n clientBlock.labels.singular = block.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n clientBlock.labels.singular = block.labels.singular\n }\n if (typeof block.labels.plural === 'function') {\n clientBlock.labels.plural = block.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n clientBlock.labels.plural = block.labels.plural\n }\n }\n }\n\n clientBlock.fields = createClientFields({\n defaultIDType,\n fields: block.fields,\n i18n,\n importMap,\n })\n\n clientBlocks.push(clientBlock)\n }\n\n return clientBlocks\n}\n\nexport const createClientField = ({\n defaultIDType,\n field: incomingField,\n i18n,\n importMap,\n}: {\n defaultIDType: Payload['config']['db']['defaultIDType']\n field: Field\n i18n: I18nClient\n importMap: ImportMap\n}): ClientField => {\n const clientField: ClientField = {} as ClientField\n\n for (const key in incomingField) {\n if (serverOnlyFieldProperties.includes(key as any)) {\n continue\n }\n\n switch (key) {\n case 'admin':\n if (!incomingField.admin) {\n break\n }\n\n clientField.admin = {} as AdminClient\n\n for (const adminKey in incomingField.admin) {\n if (serverOnlyFieldAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if ('description' in incomingField.admin) {\n if (typeof incomingField.admin?.description !== 'function') {\n ;(clientField as FieldWithDescription).admin.description =\n incomingField.admin.description\n }\n }\n\n break\n\n default:\n ;(clientField.admin as any)[adminKey] =\n incomingField.admin[adminKey as keyof typeof incomingField.admin]\n }\n }\n\n break\n\n case 'blocks':\n case 'fields':\n case 'tabs':\n // Skip - we handle sub-fields in the switch below\n break\n\n case 'options':\n // Skip - we handle options in the radio/select switch below to avoid mutating the global config\n break\n\n case 'label':\n //@ts-expect-error - would need to type narrow\n if (typeof incomingField.label === 'function') {\n //@ts-expect-error - would need to type narrow\n clientField.label = incomingField.label({ i18n, t: i18n.t })\n } else {\n //@ts-expect-error - would need to type narrow\n clientField.label = incomingField.label\n }\n\n break\n\n default:\n ;(clientField as any)[key] = incomingField[key as keyof Field]\n }\n }\n\n switch (incomingField.type) {\n case 'array': {\n if (incomingField.labels) {\n const field = clientField as unknown as ArrayFieldClient\n\n field.labels = {} as unknown as LabelsClient\n\n if (incomingField.labels.singular) {\n if (typeof incomingField.labels.singular === 'function') {\n field.labels.singular = incomingField.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.singular = incomingField.labels.singular\n }\n if (typeof incomingField.labels.plural === 'function') {\n field.labels.plural = incomingField.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.plural = incomingField.labels.plural\n }\n }\n }\n }\n // falls through\n case 'collapsible':\n case 'group':\n case 'row': {\n const field = clientField as unknown as RowFieldClient\n\n if (!field.fields) {\n field.fields = []\n }\n\n field.fields = createClientFields({\n defaultIDType,\n disableAddingID: incomingField.type !== 'array',\n fields: incomingField.fields,\n i18n,\n importMap,\n })\n\n break\n }\n\n case 'blocks': {\n const field = clientField as unknown as BlocksFieldClient\n\n if (incomingField.labels) {\n field.labels = {} as unknown as LabelsClient\n\n if (incomingField.labels.singular) {\n if (typeof incomingField.labels.singular === 'function') {\n field.labels.singular = incomingField.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.singular = incomingField.labels.singular\n }\n if (typeof incomingField.labels.plural === 'function') {\n field.labels.plural = incomingField.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.plural = incomingField.labels.plural\n }\n }\n }\n\n if (incomingField.blockReferences?.length) {\n field.blockReferences = createClientBlocks({\n blocks: incomingField.blockReferences,\n defaultIDType,\n i18n,\n importMap,\n })\n }\n\n if (incomingField.blocks?.length) {\n field.blocks = createClientBlocks({\n blocks: incomingField.blocks,\n defaultIDType,\n i18n,\n importMap,\n }) as ClientBlock[]\n }\n\n break\n }\n\n case 'date': {\n // Strip the `override` function from timezone config as it cannot be serialized\n if (\n incomingField.timezone &&\n typeof incomingField.timezone === 'object' &&\n 'override' in incomingField.timezone\n ) {\n const field = clientField as DateFieldClient\n const { override: _, ...timezoneConfigWithoutOverride } = incomingField.timezone\n field.timezone = timezoneConfigWithoutOverride\n }\n\n break\n }\n\n case 'join': {\n const field = clientField as JoinFieldClient\n\n field.targetField = {\n relationTo: field.targetField?.relationTo,\n }\n\n break\n }\n\n case 'radio':\n // falls through\n case 'select': {\n const field = clientField as RadioFieldClient | SelectFieldClient\n\n if (incomingField.options?.length) {\n field.options = [] // Create new array to avoid mutating global config\n\n for (let i = 0; i < incomingField.options.length; i++) {\n const option = incomingField.options[i]\n\n if (typeof option === 'object' && typeof option.label === 'function') {\n field.options[i] = {\n label: option.label({ i18n, t: i18n.t as TFunction }),\n value: option.value,\n }\n } else if (typeof option === 'object') {\n field.options[i] = {\n label: option.label,\n value: option.value,\n }\n } else if (typeof option === 'string') {\n field.options[i] = option\n }\n }\n }\n\n break\n }\n\n case 'richText': {\n if (!incomingField?.editor) {\n throw new MissingEditorProp(incomingField) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof incomingField?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n break\n }\n\n case 'tabs': {\n const field = clientField as unknown as TabsFieldClient\n\n if (incomingField.tabs?.length) {\n field.tabs = []\n\n for (let i = 0; i < incomingField.tabs.length; i++) {\n const tab = incomingField.tabs[i]\n const clientTab = {} as unknown as TabsFieldClient['tabs'][0]\n\n for (const key in tab) {\n if (serverOnlyFieldProperties.includes(key as any)) {\n continue\n }\n\n const tabProp = tab[key as keyof typeof tab]\n\n if (key === 'fields') {\n clientTab.fields = createClientFields({\n defaultIDType,\n disableAddingID: true,\n fields: tab.fields,\n i18n,\n importMap,\n })\n } else if (\n (key === 'label' || key === 'description') &&\n typeof tabProp === 'function'\n ) {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n clientTab[key] = tabProp({ t: i18n.t })\n } else if (key === 'admin') {\n clientTab.admin = {} as AdminClient\n\n for (const adminKey in tab.admin) {\n if (serverOnlyFieldAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if ('description' in tab.admin) {\n if (typeof tab.admin?.description === 'function') {\n clientTab.admin.description = tab.admin.description({\n i18n,\n t: i18n.t as TFunction,\n })\n } else {\n clientTab.admin.description = tab.admin.description\n }\n }\n\n break\n\n default:\n ;(clientTab.admin as any)[adminKey] =\n tab.admin[adminKey as keyof typeof tab.admin]\n }\n }\n } else {\n ;(clientTab as any)[key] = tabProp\n }\n }\n field.tabs[i] = clientTab\n }\n }\n\n break\n }\n\n default:\n break\n }\n\n return clientField\n}\n\nexport const createClientFields = ({\n defaultIDType,\n disableAddingID,\n fields,\n i18n,\n importMap,\n}: {\n defaultIDType: Payload['config']['db']['defaultIDType']\n disableAddingID?: boolean\n fields: Field[]\n i18n: I18nClient\n importMap: ImportMap\n}): ClientField[] => {\n const clientFields: ClientField[] = []\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n\n const clientField = createClientField({\n defaultIDType,\n field,\n i18n,\n importMap,\n })\n\n clientFields.push(clientField)\n }\n\n const hasID = flattenTopLevelFields(fields).some((f) => fieldAffectsData(f) && f.name === 'id')\n\n if (!disableAddingID && !hasID) {\n clientFields.push({\n name: 'id',\n type: defaultIDType,\n admin: {\n description: 'The unique identifier for this document',\n disabled: { bulkEdit: true },\n hidden: true,\n },\n hidden: true,\n label: 'ID',\n } as ClientField)\n }\n\n return clientFields\n}\n"],"names":["getFromImportMap","MissingEditorProp","fieldAffectsData","flattenTopLevelFields","serverOnlyFieldProperties","serverOnlyFieldAdminProperties","createClientBlocks","blocks","defaultIDType","i18n","importMap","clientBlocks","i","length","block","push","clientBlock","slug","fields","imageAltText","imageURL","admin","custom","group","images","jsx","jsxResolved","PayloadComponent","schemaPath","disableBlockName","labels","singular","t","plural","createClientFields","createClientField","field","incomingField","clientField","key","includes","adminKey","description","label","type","disableAddingID","blockReferences","timezone","override","_","timezoneConfigWithoutOverride","targetField","relationTo","options","option","value","editor","Error","tabs","tab","clientTab","tabProp","clientFields","hasID","some","f","name","disabled","bulkEdit","hidden"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/fields/config/client.ts"],"sourcesContent":["// @ts-strict-ignore\n/* eslint-disable perfectionist/sort-switch-case */\n// Keep perfectionist/sort-switch-case disabled - it incorrectly messes up the ordering of the switch cases, causing it to break\nimport type { ClientTranslationKeys, I18nClient, TFunction } from '@payloadcms/translations'\n\nimport type { ImportMap } from '../../bin/generateImportMap/index.js'\nimport type { LabelFunction } from '../../config/types.js'\nimport type {\n AdminClient,\n ArrayFieldClient,\n Block,\n BlockJSX,\n BlocksFieldClient,\n ClientBlock,\n ClientField,\n DateFieldClient,\n Field,\n FieldBase,\n JoinFieldClient,\n LabelsClient,\n RadioFieldClient,\n RowFieldClient,\n SelectFieldClient,\n TabsFieldClient,\n} from '../../fields/config/types.js'\nimport type { Payload } from '../../types/index.js'\n\nimport { getFromImportMap } from '../../bin/generateImportMap/utilities/getFromImportMap.js'\nimport { MissingEditorProp } from '../../errors/MissingEditorProp.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { flattenTopLevelFields } from '../../utilities/flattenTopLevelFields.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`, `upload`, and `select` only property\n | 'graphQL'\n | 'jsonSchema'\n | 'label'\n | 'slugify' // This is a `slug` only property — a function, cannot cross the RSC boundary\n | 'validate'\n | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>\n\nexport type ServerOnlyFieldAdminProperties = keyof Pick<\n FieldBase['admin'],\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n 'components' | 'condition'\n>\n\nconst serverOnlyFieldProperties: Partial<ServerOnlyFieldProperties>[] = [\n 'hooks',\n 'access',\n 'validate',\n 'defaultValue',\n 'filterOptions', // This is a `relationship`, `upload`, and `select` only property\n 'editor', // This is a `richText` only property\n 'custom',\n 'jsonSchema',\n 'dbName', // can be a function\n 'enumName', // can be a function\n 'graphQL', // client does not need graphQL\n 'slugify', // `slug` field — a function, cannot cross the RSC boundary (server resolves it via `custom.slugify`)\n // the following props are handled separately (see below):\n // `label`\n // `fields`\n // `blocks`\n // `tabs`\n // `admin`\n]\n\nconst serverOnlyFieldAdminProperties: Partial<ServerOnlyFieldAdminProperties>[] = [\n 'condition',\n 'components',\n]\n\ntype FieldWithDescription = {\n admin: AdminClient\n} & ClientField\n\nexport const createClientBlocks = ({\n blocks,\n defaultIDType,\n i18n,\n importMap,\n}: {\n blocks: (Block | string)[]\n defaultIDType: Payload['config']['db']['defaultIDType']\n i18n: I18nClient\n importMap: ImportMap\n}): (ClientBlock | string)[] => {\n const clientBlocks: (ClientBlock | string)[] = []\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]!\n\n if (typeof block === 'string') {\n // Do not process blocks that are just strings - they are processed once in the client config\n clientBlocks.push(block)\n continue\n }\n\n const clientBlock: ClientBlock = {\n slug: block.slug,\n fields: [],\n }\n if (block.imageAltText) {\n clientBlock.imageAltText = block.imageAltText\n }\n if (block.imageURL) {\n clientBlock.imageURL = block.imageURL\n }\n\n if (block.admin?.custom || block.admin?.group || block.admin?.images) {\n clientBlock.admin = {}\n if (block.admin.custom) {\n clientBlock.admin.custom = block.admin.custom\n }\n if (block.admin.group) {\n clientBlock.admin.group = block.admin.group\n }\n if (block.admin.images) {\n clientBlock.admin.images = block.admin.images\n }\n }\n\n if (block?.admin?.jsx) {\n const jsxResolved = getFromImportMap<BlockJSX>({\n importMap,\n PayloadComponent: block.admin.jsx,\n schemaPath: '',\n })\n clientBlock.jsx = jsxResolved\n }\n\n if (block?.admin?.disableBlockName) {\n // Check for existing admin object, this way we don't have to spread it in\n if (clientBlock.admin) {\n clientBlock.admin.disableBlockName = block.admin.disableBlockName\n } else {\n clientBlock.admin = { disableBlockName: block.admin.disableBlockName }\n }\n }\n\n if (block.labels) {\n clientBlock.labels = {} as unknown as LabelsClient\n\n if (block.labels.singular) {\n if (typeof block.labels.singular === 'function') {\n clientBlock.labels.singular = block.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n clientBlock.labels.singular = block.labels.singular\n }\n if (typeof block.labels.plural === 'function') {\n clientBlock.labels.plural = block.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n clientBlock.labels.plural = block.labels.plural\n }\n }\n }\n\n clientBlock.fields = createClientFields({\n defaultIDType,\n fields: block.fields,\n i18n,\n importMap,\n })\n\n clientBlocks.push(clientBlock)\n }\n\n return clientBlocks\n}\n\nexport const createClientField = ({\n defaultIDType,\n field: incomingField,\n i18n,\n importMap,\n}: {\n defaultIDType: Payload['config']['db']['defaultIDType']\n field: Field\n i18n: I18nClient\n importMap: ImportMap\n}): ClientField => {\n const clientField: ClientField = {} as ClientField\n\n for (const key in incomingField) {\n if (serverOnlyFieldProperties.includes(key as any)) {\n continue\n }\n\n switch (key) {\n case 'admin':\n if (!incomingField.admin) {\n break\n }\n\n clientField.admin = {} as AdminClient\n\n for (const adminKey in incomingField.admin) {\n if (serverOnlyFieldAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if ('description' in incomingField.admin) {\n if (typeof incomingField.admin?.description !== 'function') {\n ;(clientField as FieldWithDescription).admin.description =\n incomingField.admin.description\n }\n }\n\n break\n\n default:\n ;(clientField.admin as any)[adminKey] =\n incomingField.admin[adminKey as keyof typeof incomingField.admin]\n }\n }\n\n break\n\n case 'blocks':\n case 'fields':\n case 'tabs':\n // Skip - we handle sub-fields in the switch below\n break\n\n case 'options':\n // Skip - we handle options in the radio/select switch below to avoid mutating the global config\n break\n\n case 'label':\n //@ts-expect-error - would need to type narrow\n if (typeof incomingField.label === 'function') {\n //@ts-expect-error - would need to type narrow\n clientField.label = incomingField.label({ i18n, t: i18n.t })\n } else {\n //@ts-expect-error - would need to type narrow\n clientField.label = incomingField.label\n }\n\n break\n\n default:\n ;(clientField as any)[key] = incomingField[key as keyof Field]\n }\n }\n\n switch (incomingField.type) {\n case 'array': {\n if (incomingField.labels) {\n const field = clientField as unknown as ArrayFieldClient\n\n field.labels = {} as unknown as LabelsClient\n\n if (incomingField.labels.singular) {\n if (typeof incomingField.labels.singular === 'function') {\n field.labels.singular = incomingField.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.singular = incomingField.labels.singular\n }\n if (typeof incomingField.labels.plural === 'function') {\n field.labels.plural = incomingField.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.plural = incomingField.labels.plural\n }\n }\n }\n }\n // falls through\n case 'collapsible':\n case 'group':\n case 'row': {\n const field = clientField as unknown as RowFieldClient\n\n if (!field.fields) {\n field.fields = []\n }\n\n field.fields = createClientFields({\n defaultIDType,\n disableAddingID: incomingField.type !== 'array',\n fields: incomingField.fields,\n i18n,\n importMap,\n })\n\n break\n }\n\n case 'blocks': {\n const field = clientField as unknown as BlocksFieldClient\n\n if (incomingField.labels) {\n field.labels = {} as unknown as LabelsClient\n\n if (incomingField.labels.singular) {\n if (typeof incomingField.labels.singular === 'function') {\n field.labels.singular = incomingField.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.singular = incomingField.labels.singular\n }\n if (typeof incomingField.labels.plural === 'function') {\n field.labels.plural = incomingField.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.plural = incomingField.labels.plural\n }\n }\n }\n\n if (incomingField.blocks?.length) {\n field.blocks = createClientBlocks({\n blocks: incomingField.blocks,\n defaultIDType,\n i18n,\n importMap,\n })\n }\n\n break\n }\n\n case 'date': {\n // Strip the `override` function from timezone config as it cannot be serialized\n if (\n incomingField.timezone &&\n typeof incomingField.timezone === 'object' &&\n 'override' in incomingField.timezone\n ) {\n const field = clientField as DateFieldClient\n const { override: _, ...timezoneConfigWithoutOverride } = incomingField.timezone\n field.timezone = timezoneConfigWithoutOverride\n }\n\n break\n }\n\n case 'join': {\n const field = clientField as JoinFieldClient\n\n field.targetField = {\n relationTo: field.targetField?.relationTo,\n }\n\n break\n }\n\n case 'radio':\n // falls through\n case 'select': {\n const field = clientField as RadioFieldClient | SelectFieldClient\n\n if (incomingField.options?.length) {\n field.options = [] // Create new array to avoid mutating global config\n\n for (let i = 0; i < incomingField.options.length; i++) {\n const option = incomingField.options[i]\n\n if (typeof option === 'object' && typeof option.label === 'function') {\n field.options[i] = {\n label: option.label({ i18n, t: i18n.t as TFunction }),\n value: option.value,\n }\n } else if (typeof option === 'object') {\n field.options[i] = {\n label: option.label,\n value: option.value,\n }\n } else if (typeof option === 'string') {\n field.options[i] = option\n }\n }\n }\n\n break\n }\n\n case 'richText': {\n if (!incomingField?.editor) {\n throw new MissingEditorProp(incomingField) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof incomingField?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n break\n }\n\n case 'tabs': {\n const field = clientField as unknown as TabsFieldClient\n\n if (incomingField.tabs?.length) {\n field.tabs = []\n\n for (let i = 0; i < incomingField.tabs.length; i++) {\n const tab = incomingField.tabs[i]\n const clientTab = {} as unknown as TabsFieldClient['tabs'][0]\n\n for (const key in tab) {\n if (serverOnlyFieldProperties.includes(key as any)) {\n continue\n }\n\n const tabProp = tab[key as keyof typeof tab]\n\n if (key === 'fields') {\n clientTab.fields = createClientFields({\n defaultIDType,\n disableAddingID: true,\n fields: tab.fields,\n i18n,\n importMap,\n })\n } else if (key === 'label' && typeof tabProp === 'function') {\n const label = tabProp as LabelFunction\n\n clientTab.label = label({\n i18n,\n t: i18n.t,\n })\n } else if (key === 'description' && typeof tabProp === 'function') {\n const description = tabProp as LabelFunction\n\n clientTab.description = description({\n i18n,\n t: i18n.t,\n })\n } else if (key === 'admin') {\n clientTab.admin = {} as AdminClient\n\n for (const adminKey in tab.admin) {\n if (serverOnlyFieldAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if ('description' in tab.admin) {\n if (typeof tab.admin?.description === 'function') {\n clientTab.admin.description = tab.admin.description({\n i18n,\n t: i18n.t,\n })\n } else {\n clientTab.admin.description = tab.admin.description\n }\n }\n\n break\n\n default:\n ;(clientTab.admin as any)[adminKey] =\n tab.admin[adminKey as keyof typeof tab.admin]\n }\n }\n } else {\n ;(clientTab as any)[key] = tabProp\n }\n }\n field.tabs[i] = clientTab\n }\n }\n\n break\n }\n\n default:\n break\n }\n\n return clientField\n}\n\nexport const createClientFields = ({\n defaultIDType,\n disableAddingID,\n fields,\n i18n,\n importMap,\n}: {\n defaultIDType: Payload['config']['db']['defaultIDType']\n disableAddingID?: boolean\n fields: Field[]\n i18n: I18nClient\n importMap: ImportMap\n}): ClientField[] => {\n const clientFields: ClientField[] = []\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n\n const clientField = createClientField({\n defaultIDType,\n field,\n i18n,\n importMap,\n })\n\n clientFields.push(clientField)\n }\n\n const hasID = flattenTopLevelFields(fields).some((f) => fieldAffectsData(f) && f.name === 'id')\n\n if (!disableAddingID && !hasID) {\n clientFields.push({\n name: 'id',\n type: defaultIDType,\n admin: {\n description: 'The unique identifier for this document',\n disabled: { bulkEdit: true },\n hidden: true,\n },\n hidden: true,\n label: 'ID',\n } as ClientField)\n }\n\n return clientFields\n}\n"],"names":["getFromImportMap","MissingEditorProp","fieldAffectsData","flattenTopLevelFields","serverOnlyFieldProperties","serverOnlyFieldAdminProperties","createClientBlocks","blocks","defaultIDType","i18n","importMap","clientBlocks","i","length","block","push","clientBlock","slug","fields","imageAltText","imageURL","admin","custom","group","images","jsx","jsxResolved","PayloadComponent","schemaPath","disableBlockName","labels","singular","t","plural","createClientFields","createClientField","field","incomingField","clientField","key","includes","adminKey","description","label","type","disableAddingID","timezone","override","_","timezoneConfigWithoutOverride","targetField","relationTo","options","option","value","editor","Error","tabs","tab","clientTab","tabProp","clientFields","hasID","some","f","name","disabled","bulkEdit","hidden"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACf,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AA8BvC,KAAK,kBAAkB,GAAG;IACxB,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,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAA;IACzC;;;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,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC,+BAA+B,EAAE,OAAO,CAAA;IACxC,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,EAAE,CAAA;CACzB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAU,4RAkBjC,iBAAiB,KAAG,OAAO,CAAC,mBAAmB,CAwbjD,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,sRAiBlC,kBAAkB,KAAG,OAAO,CAAC,KAAK,EAAE,CAqCtC,CAAA"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACf,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AA+BvC,KAAK,kBAAkB,GAAG;IACxB,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,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAA;IACzC;;;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,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC,+BAA+B,EAAE,OAAO,CAAA;IACxC,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,EAAE,CAAA;CACzB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAU,4RAkBjC,iBAAiB,KAAG,OAAO,CAAC,mBAAmB,CA8djD,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,sRAiBlC,kBAAkB,KAAG,OAAO,CAAC,KAAK,EAAE,CAqCtC,CAAA"}
@@ -5,6 +5,7 @@ import { formatLabels, toWords } from '../../utilities/formatLabels.js';
5
5
  import { validateTimezones } from '../../utilities/validateTimezones.js';
6
6
  import { baseBlockFields } from '../baseFields/baseBlockFields.js';
7
7
  import { baseIDField } from '../baseFields/baseIDField.js';
8
+ import { generateSlug } from '../baseFields/slug/generateSlug.js';
8
9
  import { baseTimezoneField } from '../baseFields/timezone/baseField.js';
9
10
  import { defaultTimezones } from '../baseFields/timezone/defaultTimezones.js';
10
11
  import { getFieldPaths } from '../getFieldPaths.js';
@@ -111,6 +112,44 @@ import { fieldAffectsData as _fieldAffectsData, fieldIsLocalized, tabHasName } f
111
112
  };
112
113
  }
113
114
  }
115
+ // Slug field: apply defaults, attach generation hook, expose slugify to the server fn.
116
+ if (field.type === 'slug') {
117
+ const useAsSlug = field.useAsSlug;
118
+ if (!useAsSlug) {
119
+ throw new InvalidConfiguration(`The slug field "${field.name}" is missing the required "useAsSlug" property, which must name the field to generate the slug from.`);
120
+ }
121
+ if (typeof field.required === 'undefined') {
122
+ field.required = true;
123
+ }
124
+ if (typeof field.unique === 'undefined') {
125
+ field.unique = true;
126
+ }
127
+ if (typeof field.index === 'undefined') {
128
+ field.index = true;
129
+ }
130
+ field.admin = {
131
+ position: 'sidebar',
132
+ ...field.admin
133
+ };
134
+ // The slugifyHandler server function resolves the custom slugify by field path.
135
+ if (field.slugify) {
136
+ field.custom = {
137
+ ...field.custom,
138
+ slugify: field.slugify
139
+ };
140
+ }
141
+ if (!field.hooks) {
142
+ field.hooks = {};
143
+ }
144
+ field.hooks.beforeChange = [
145
+ generateSlug({
146
+ name: field.name,
147
+ slugify: field.slugify,
148
+ useAsSlug
149
+ }),
150
+ ...field.hooks.beforeChange || []
151
+ ];
152
+ }
114
153
  // Array ID field
115
154
  if (field.type === 'array' && field.fields) {
116
155
  const hasCustomID = field.fields.some((f)=>'name' in f && f.name === 'id');
@@ -192,11 +231,8 @@ import { fieldAffectsData as _fieldAffectsData, fieldIsLocalized, tabHasName } f
192
231
  }
193
232
  }
194
233
  if (field.type === 'blocks' && field.blocks) {
195
- if (field.blockReferences && field.blocks?.length) {
196
- throw new Error('You cannot have both blockReferences and blocks in the same blocks field');
197
- }
198
234
  const blockSlugs = [];
199
- for (const block of field.blockReferences ?? field.blocks){
235
+ for (const block of field.blocks){
200
236
  const blockSlug = typeof block === 'string' ? block : block.slug;
201
237
  if (blockSlugs.includes(blockSlug)) {
202
238
  throw new DuplicateFieldName(blockSlug);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import type {\n CollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { GlobalConfig } from '../../globals/config/types.js'\nimport type { OrderableJoinInfo } from './sanitizeJoinField.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidConfiguration,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingEditorProp,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { ReservedFieldName } from '../../errors/ReservedFieldName.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { validateTimezones } from '../../utilities/validateTimezones.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { baseTimezoneField } from '../baseFields/timezone/baseField.js'\nimport { defaultTimezones } from '../baseFields/timezone/defaultTimezones.js'\nimport { getFieldPaths } from '../getFieldPaths.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport { validations } from '../validations.js'\nimport {\n reservedAPIKeyFieldNames,\n reservedBaseAuthFieldNames,\n reservedBaseUploadFieldNames,\n reservedVerifyFieldNames,\n} from './reservedFieldNames.js'\nimport { sanitizeJoinField } from './sanitizeJoinField.js'\nimport { fieldAffectsData as _fieldAffectsData, fieldIsLocalized, tabHasName } from './types.js'\n\ntype SanitizeFieldsArgs = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n globalConfig?: GlobalConfig\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField?: boolean\n joinPath?: string\n /**\n * When not passed in, assume that join are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[]\n /**\n * A string of '-' separated indexes representing where\n * to find this field in a given field schema array.\n */\n parentIndexPath?: string\n parentIsLocalized: boolean\n /**\n * Path for parent fields relative to their position in the schema.\n */\n parentSchemaPath?: string\n polymorphicJoins?: SanitizedJoin[]\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 * 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 type SanitizeFieldArgs = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames: Set<string>\n field: Field\n globalConfig?: GlobalConfig\n /**\n * The index of this field in the parent fields array\n */\n index: number\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField: boolean\n joinPath: string\n /**\n * When not passed in, assume that joins are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[]\n parentIndexPath: string\n parentIsLocalized: boolean\n parentSchemaPath: string\n polymorphicJoins?: SanitizedJoin[]\n requireFieldLevelRichTextEditor: boolean\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n validRelationships: null | string[]\n}\n\ntype SanitizeFieldResult = {\n /**\n * Fields to insert after this field (e.g., timezone field)\n */\n fieldsToInsert?: Field[]\n}\n\n/**\n * Sanitize a single field. Handles all per-field logic including:\n * - Validation setup\n * - Hooks/access/admin defaults\n * - Type-specific handling\n * - Recursive sanitization of nested fields\n *\n * @returns Result containing any fields to insert after this one\n */\nexport const sanitizeField = async ({\n collectionConfig,\n config,\n existingFieldNames,\n field,\n globalConfig,\n index,\n isTopLevelField,\n joinPath,\n joins,\n orderableJoins,\n parentIndexPath,\n parentIsLocalized,\n parentSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n}: SanitizeFieldArgs): Promise<SanitizeFieldResult> => {\n const result: SanitizeFieldResult = {}\n\n if ('_sanitized' in field && field._sanitized === true) {\n return result\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n const fieldAffectsData = _fieldAffectsData(field)\n\n const { indexPath, schemaPath } = getFieldPaths({\n field,\n index,\n parentIndexPath,\n parentSchemaPath,\n })\n\n // Reserved field name checks\n if (isTopLevelField && fieldAffectsData && field.name) {\n if (collectionConfig && collectionConfig.upload) {\n if (reservedBaseUploadFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n\n if (\n collectionConfig &&\n collectionConfig.auth &&\n typeof collectionConfig.auth === 'object' &&\n !collectionConfig.auth.disableLocalStrategy\n ) {\n if (reservedBaseAuthFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n if (collectionConfig.auth.verify) {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedAPIKeyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedVerifyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n }\n }\n\n // Invalid field name check\n if (fieldAffectsData && 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 // Checkbox default\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n // Join field sanitization\n if (field.type === 'join') {\n sanitizeJoinField({\n config,\n field,\n joinPath,\n joins,\n orderableJoins,\n parentIsLocalized,\n polymorphicJoins,\n })\n }\n\n // Relationship/upload validation\n if (field.type === 'relationship' || field.type === 'upload') {\n if (Array.isArray(field.relationTo) && field.relationTo.length === 0) {\n throw new Error(\n `Field \"${field.name}\" of type \"${field.type}\" has an empty relationTo array. At least one collection must be specified.`,\n )\n }\n\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]\n\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n }\n\n // Upload isSortable default\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 // Array ID field\n if (field.type === 'array' && field.fields) {\n const hasCustomID = field.fields.some((f) => 'name' in f && f.name === 'id')\n if (!hasCustomID) {\n field.fields.push(baseIDField)\n }\n }\n\n // Blocks/array labels\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData) {\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 if (!config.localization) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n if ('virtual' in field && field.virtual) {\n field.validate = (): true => true\n } else {\n const defaultValidate = validations[field.type as keyof typeof validations]\n if (defaultValidate) {\n field.validate = (val: any, options: any) =>\n defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = (): true => true\n }\n }\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field, parentIsLocalized)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n if ('virtual' in field && field.virtual && field.admin.readOnly !== false && fieldAffectsData) {\n field.admin.readOnly = true\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 (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 if (field.blockReferences && field.blocks?.length) {\n throw new Error('You cannot have both blockReferences and blocks in the same blocks field')\n }\n\n const blockSlugs: string[] = []\n\n for (const block of field.blockReferences ?? field.blocks) {\n const blockSlug = typeof block === 'string' ? block : block.slug\n\n if (blockSlugs.includes(blockSlug)) {\n throw new DuplicateFieldName(blockSlug)\n }\n\n blockSlugs.push(blockSlug)\n\n if (typeof block === 'string') {\n continue\n }\n\n if (block._sanitized === true) {\n continue\n }\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 collectionConfig,\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n isTopLevelField: false,\n parentIndexPath: '',\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n parentSchemaPath: schemaPath + '.' + block.slug,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n field.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: fieldAffectsData ? new Set() : existingFieldNames,\n fields: field.fields,\n isTopLevelField: isTopLevelField && !fieldAffectsData,\n joinPath: fieldAffectsData ? `${joinPath ? joinPath + '.' : ''}${field.name}` : joinPath,\n joins,\n orderableJoins,\n parentIndexPath: fieldAffectsData ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || fieldIsLocalized(field),\n parentSchemaPath: schemaPath,\n polymorphicJoins,\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\n const isNamedTab = tabHasName(tab)\n\n if (isNamedTab && typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n\n const { indexPath: tabIndexPath, schemaPath: tabSchemaPath } = getFieldPaths({\n field: tab,\n index: j,\n parentIndexPath: indexPath,\n parentSchemaPath: schemaPath,\n })\n\n if (\n 'admin' in tab &&\n tab.admin?.condition &&\n typeof tab.admin.condition === 'function' &&\n !tab.id\n ) {\n tab.id = tabSchemaPath\n }\n\n tab.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: isNamedTab ? new Set() : existingFieldNames,\n fields: tab.fields,\n isTopLevelField: isTopLevelField && !isNamedTab,\n joinPath: isNamedTab ? `${joinPath ? joinPath + '.' : ''}${tab.name}` : joinPath,\n joins,\n orderableJoins,\n parentIndexPath: isNamedTab ? '' : tabIndexPath,\n parentIsLocalized: parentIsLocalized || (isNamedTab && tab.localized)!,\n parentSchemaPath: tabSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n field.tabs[j] = tab\n }\n }\n\n if (field.type === 'ui') {\n const existing = field.admin.disabled\n if (existing === undefined) {\n field.admin.disabled = { bulkEdit: true }\n } else if (\n existing !== true &&\n typeof existing === 'object' &&\n existing.bulkEdit === undefined\n ) {\n field.admin.disabled = { ...existing, bulkEdit: true }\n }\n }\n\n // Timezone field insertion\n if (field.type === 'date' && field.timezone) {\n const name = field.name + '_tz'\n\n let defaultTimezone =\n field.timezone && typeof field.timezone === 'object'\n ? field.timezone.defaultTimezone\n : config.admin?.timezones?.defaultTimezone\n\n const required =\n field.required ||\n (field.timezone && typeof field.timezone === 'object' && field.timezone.required)\n\n const supportedTimezones =\n field.timezone && typeof field.timezone === 'object' && field.timezone.supportedTimezones\n ? field.timezone.supportedTimezones\n : config.admin?.timezones?.supportedTimezones\n\n const options =\n typeof supportedTimezones === 'function'\n ? supportedTimezones({ defaultTimezones })\n : supportedTimezones\n\n validateTimezones({\n source: `field \"${field.name}\" timezone.supportedTimezones`,\n timezones: options,\n })\n\n if (options && options.length === 1 && options[0]?.value) {\n defaultTimezone = options[0].value\n }\n\n // Generate label for timezone field\n const timezoneLabel = typeof field.label === 'string' ? `${field.label} Tz` : toWords(name)\n\n const baseField = baseTimezoneField({\n name,\n defaultValue: defaultTimezone,\n label: timezoneLabel,\n options,\n required,\n })\n\n // Apply override if provided\n const timezoneField =\n typeof field.timezone === 'object' && typeof field.timezone.override === 'function'\n ? field.timezone.override({ baseField })\n : baseField\n\n result.fieldsToInsert = [timezoneField]\n }\n\n // Virtual field handling\n if ('virtual' in field && typeof field.virtual === 'string') {\n const virtualField = field\n const configFields = (collectionConfig || globalConfig)?.fields\n if (configFields) {\n let flattenFields = flattenAllFields({ fields: configFields })\n const paths = field.virtual.split('.')\n let isHasMany = false\n\n for (const [idx, segment] of paths.entries()) {\n const foundField = flattenFields.find((e) => e.name === segment)\n if (!foundField) {\n break\n }\n\n if (\n foundField.type === 'group' ||\n foundField.type === 'tab' ||\n foundField.type === 'array'\n ) {\n flattenFields = foundField.flattenedFields\n } else if (\n (foundField.type === 'relationship' || foundField.type === 'upload') &&\n idx !== paths.length - 1 &&\n typeof foundField.relationTo === 'string'\n ) {\n if (\n foundField.hasMany &&\n (virtualField.type === 'text' ||\n virtualField.type === 'number' ||\n virtualField.type === 'select')\n ) {\n if (isHasMany) {\n throw new InvalidConfiguration(\n `Virtual field ${virtualField.name} in ${globalConfig ? `global ${globalConfig.slug}` : `collection ${collectionConfig?.slug}`} references 2 or more hasMany relationships on the path ${virtualField.virtual} which is not allowed.`,\n )\n }\n\n isHasMany = true\n virtualField.hasMany = true\n }\n const relatedCollection = config.collections?.find(\n (e) => e.slug === foundField.relationTo,\n )\n if (relatedCollection) {\n flattenFields = flattenAllFields({ fields: relatedCollection.fields })\n }\n }\n }\n }\n }\n\n return result\n}\n\nexport const sanitizeFields = async ({\n collectionConfig,\n config,\n existingFieldNames = new Set(),\n fields,\n globalConfig,\n isTopLevelField = true,\n joinPath = '',\n joins,\n orderableJoins,\n parentIndexPath = '',\n parentIsLocalized,\n parentSchemaPath = '',\n polymorphicJoins,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n validRelationships,\n}: SanitizeFieldsArgs): 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 const result = await sanitizeField({\n collectionConfig,\n config,\n existingFieldNames,\n field,\n globalConfig,\n index: i,\n isTopLevelField,\n joinPath,\n joins,\n orderableJoins,\n parentIndexPath,\n parentIsLocalized,\n parentSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n fields[i] = field\n\n if (result.fieldsToInsert?.length) {\n fields.splice(i + 1, 0, ...result.fieldsToInsert)\n i += result.fieldsToInsert.length\n }\n }\n\n return fields\n}\n"],"names":["DuplicateFieldName","InvalidConfiguration","InvalidFieldName","InvalidFieldRelationship","MissingEditorProp","MissingFieldType","ReservedFieldName","flattenAllFields","formatLabels","toWords","validateTimezones","baseBlockFields","baseIDField","baseTimezoneField","defaultTimezones","getFieldPaths","setDefaultBeforeDuplicate","validations","reservedAPIKeyFieldNames","reservedBaseAuthFieldNames","reservedBaseUploadFieldNames","reservedVerifyFieldNames","sanitizeJoinField","fieldAffectsData","_fieldAffectsData","fieldIsLocalized","tabHasName","sanitizeField","collectionConfig","config","existingFieldNames","field","globalConfig","index","isTopLevelField","joinPath","joins","orderableJoins","parentIndexPath","parentIsLocalized","parentSchemaPath","polymorphicJoins","requireFieldLevelRichTextEditor","richTextSanitizationPromises","validRelationships","result","_sanitized","type","indexPath","schemaPath","name","upload","includes","auth","disableLocalStrategy","verify","label","defaultValue","required","Array","isArray","relationTo","length","Error","relationships","forEach","relationship","admin","isSortable","fields","hasCustomID","some","f","push","labels","has","add","localized","localization","validate","virtual","defaultValidate","val","options","hooks","access","readOnly","sanitizeRichText","_config","editor","isRoot","blocks","blockReferences","blockSlugs","block","blockSlug","slug","concat","sanitizeFields","Set","j","tabs","tab","isNamedTab","tabIndexPath","tabSchemaPath","condition","id","existing","disabled","undefined","bulkEdit","timezone","defaultTimezone","timezones","supportedTimezones","source","value","timezoneLabel","baseField","timezoneField","override","fieldsToInsert","virtualField","configFields","flattenFields","paths","split","isHasMany","idx","segment","entries","foundField","find","e","flattenedFields","hasMany","relatedCollection","collections","i","splice"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import type {\n CollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { GlobalConfig } from '../../globals/config/types.js'\nimport type { OrderableJoinInfo } from './sanitizeJoinField.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidConfiguration,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingEditorProp,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { ReservedFieldName } from '../../errors/ReservedFieldName.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { validateTimezones } from '../../utilities/validateTimezones.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { generateSlug } from '../baseFields/slug/generateSlug.js'\nimport { baseTimezoneField } from '../baseFields/timezone/baseField.js'\nimport { defaultTimezones } from '../baseFields/timezone/defaultTimezones.js'\nimport { getFieldPaths } from '../getFieldPaths.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport { validations } from '../validations.js'\nimport {\n reservedAPIKeyFieldNames,\n reservedBaseAuthFieldNames,\n reservedBaseUploadFieldNames,\n reservedVerifyFieldNames,\n} from './reservedFieldNames.js'\nimport { sanitizeJoinField } from './sanitizeJoinField.js'\nimport { fieldAffectsData as _fieldAffectsData, fieldIsLocalized, tabHasName } from './types.js'\n\ntype SanitizeFieldsArgs = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n globalConfig?: GlobalConfig\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField?: boolean\n joinPath?: string\n /**\n * When not passed in, assume that join are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[]\n /**\n * A string of '-' separated indexes representing where\n * to find this field in a given field schema array.\n */\n parentIndexPath?: string\n parentIsLocalized: boolean\n /**\n * Path for parent fields relative to their position in the schema.\n */\n parentSchemaPath?: string\n polymorphicJoins?: SanitizedJoin[]\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 * 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 type SanitizeFieldArgs = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames: Set<string>\n field: Field\n globalConfig?: GlobalConfig\n /**\n * The index of this field in the parent fields array\n */\n index: number\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField: boolean\n joinPath: string\n /**\n * When not passed in, assume that joins are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[]\n parentIndexPath: string\n parentIsLocalized: boolean\n parentSchemaPath: string\n polymorphicJoins?: SanitizedJoin[]\n requireFieldLevelRichTextEditor: boolean\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n validRelationships: null | string[]\n}\n\ntype SanitizeFieldResult = {\n /**\n * Fields to insert after this field (e.g., timezone field)\n */\n fieldsToInsert?: Field[]\n}\n\n/**\n * Sanitize a single field. Handles all per-field logic including:\n * - Validation setup\n * - Hooks/access/admin defaults\n * - Type-specific handling\n * - Recursive sanitization of nested fields\n *\n * @returns Result containing any fields to insert after this one\n */\nexport const sanitizeField = async ({\n collectionConfig,\n config,\n existingFieldNames,\n field,\n globalConfig,\n index,\n isTopLevelField,\n joinPath,\n joins,\n orderableJoins,\n parentIndexPath,\n parentIsLocalized,\n parentSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n}: SanitizeFieldArgs): Promise<SanitizeFieldResult> => {\n const result: SanitizeFieldResult = {}\n\n if ('_sanitized' in field && field._sanitized === true) {\n return result\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n const fieldAffectsData = _fieldAffectsData(field)\n\n const { indexPath, schemaPath } = getFieldPaths({\n field,\n index,\n parentIndexPath,\n parentSchemaPath,\n })\n\n // Reserved field name checks\n if (isTopLevelField && fieldAffectsData && field.name) {\n if (collectionConfig && collectionConfig.upload) {\n if (reservedBaseUploadFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n\n if (\n collectionConfig &&\n collectionConfig.auth &&\n typeof collectionConfig.auth === 'object' &&\n !collectionConfig.auth.disableLocalStrategy\n ) {\n if (reservedBaseAuthFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n if (collectionConfig.auth.verify) {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedAPIKeyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedVerifyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n }\n }\n\n // Invalid field name check\n if (fieldAffectsData && 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 // Checkbox default\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n // Join field sanitization\n if (field.type === 'join') {\n sanitizeJoinField({\n config,\n field,\n joinPath,\n joins,\n orderableJoins,\n parentIsLocalized,\n polymorphicJoins,\n })\n }\n\n // Relationship/upload validation\n if (field.type === 'relationship' || field.type === 'upload') {\n if (Array.isArray(field.relationTo) && field.relationTo.length === 0) {\n throw new Error(\n `Field \"${field.name}\" of type \"${field.type}\" has an empty relationTo array. At least one collection must be specified.`,\n )\n }\n\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]\n\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n }\n\n // Upload isSortable default\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 // Slug field: apply defaults, attach generation hook, expose slugify to the server fn.\n if (field.type === 'slug') {\n const useAsSlug = field.useAsSlug\n\n if (!useAsSlug) {\n throw new InvalidConfiguration(\n `The slug field \"${field.name}\" is missing the required \"useAsSlug\" property, which must name the field to generate the slug from.`,\n )\n }\n\n if (typeof field.required === 'undefined') {\n field.required = true\n }\n if (typeof field.unique === 'undefined') {\n field.unique = true\n }\n if (typeof field.index === 'undefined') {\n field.index = true\n }\n\n field.admin = {\n position: 'sidebar',\n ...field.admin,\n }\n\n // The slugifyHandler server function resolves the custom slugify by field path.\n if (field.slugify) {\n field.custom = {\n ...field.custom,\n slugify: field.slugify,\n }\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n field.hooks.beforeChange = [\n generateSlug({ name: field.name, slugify: field.slugify, useAsSlug }),\n ...(field.hooks.beforeChange || []),\n ]\n }\n\n // Array ID field\n if (field.type === 'array' && field.fields) {\n const hasCustomID = field.fields.some((f) => 'name' in f && f.name === 'id')\n if (!hasCustomID) {\n field.fields.push(baseIDField)\n }\n }\n\n // Blocks/array labels\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData) {\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 if (!config.localization) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n if ('virtual' in field && field.virtual) {\n field.validate = (): true => true\n } else {\n const defaultValidate = validations[field.type as keyof typeof validations]\n if (defaultValidate) {\n field.validate = (val: any, options: any) =>\n defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = (): true => true\n }\n }\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field, parentIsLocalized)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n if ('virtual' in field && field.virtual && field.admin.readOnly !== false && fieldAffectsData) {\n field.admin.readOnly = true\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 (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 const blockSlugs: string[] = []\n\n for (const block of field.blocks) {\n const blockSlug = typeof block === 'string' ? block : block.slug\n\n if (blockSlugs.includes(blockSlug)) {\n throw new DuplicateFieldName(blockSlug)\n }\n\n blockSlugs.push(blockSlug)\n\n if (typeof block === 'string') {\n continue\n }\n\n if (block._sanitized === true) {\n continue\n }\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 collectionConfig,\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n isTopLevelField: false,\n parentIndexPath: '',\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n parentSchemaPath: schemaPath + '.' + block.slug,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n field.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: fieldAffectsData ? new Set() : existingFieldNames,\n fields: field.fields,\n isTopLevelField: isTopLevelField && !fieldAffectsData,\n joinPath: fieldAffectsData ? `${joinPath ? joinPath + '.' : ''}${field.name}` : joinPath,\n joins,\n orderableJoins,\n parentIndexPath: fieldAffectsData ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || fieldIsLocalized(field),\n parentSchemaPath: schemaPath,\n polymorphicJoins,\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\n const isNamedTab = tabHasName(tab)\n\n if (isNamedTab && typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n\n const { indexPath: tabIndexPath, schemaPath: tabSchemaPath } = getFieldPaths({\n field: tab,\n index: j,\n parentIndexPath: indexPath,\n parentSchemaPath: schemaPath,\n })\n\n if (\n 'admin' in tab &&\n tab.admin?.condition &&\n typeof tab.admin.condition === 'function' &&\n !tab.id\n ) {\n tab.id = tabSchemaPath\n }\n\n tab.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: isNamedTab ? new Set() : existingFieldNames,\n fields: tab.fields,\n isTopLevelField: isTopLevelField && !isNamedTab,\n joinPath: isNamedTab ? `${joinPath ? joinPath + '.' : ''}${tab.name}` : joinPath,\n joins,\n orderableJoins,\n parentIndexPath: isNamedTab ? '' : tabIndexPath,\n parentIsLocalized: parentIsLocalized || (isNamedTab && tab.localized)!,\n parentSchemaPath: tabSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n field.tabs[j] = tab\n }\n }\n\n if (field.type === 'ui') {\n const existing = field.admin.disabled\n if (existing === undefined) {\n field.admin.disabled = { bulkEdit: true }\n } else if (\n existing !== true &&\n typeof existing === 'object' &&\n existing.bulkEdit === undefined\n ) {\n field.admin.disabled = { ...existing, bulkEdit: true }\n }\n }\n\n // Timezone field insertion\n if (field.type === 'date' && field.timezone) {\n const name = field.name + '_tz'\n\n let defaultTimezone =\n field.timezone && typeof field.timezone === 'object'\n ? field.timezone.defaultTimezone\n : config.admin?.timezones?.defaultTimezone\n\n const required =\n field.required ||\n (field.timezone && typeof field.timezone === 'object' && field.timezone.required)\n\n const supportedTimezones =\n field.timezone && typeof field.timezone === 'object' && field.timezone.supportedTimezones\n ? field.timezone.supportedTimezones\n : config.admin?.timezones?.supportedTimezones\n\n const options =\n typeof supportedTimezones === 'function'\n ? supportedTimezones({ defaultTimezones })\n : supportedTimezones\n\n validateTimezones({\n source: `field \"${field.name}\" timezone.supportedTimezones`,\n timezones: options,\n })\n\n if (options && options.length === 1 && options[0]?.value) {\n defaultTimezone = options[0].value\n }\n\n // Generate label for timezone field\n const timezoneLabel = typeof field.label === 'string' ? `${field.label} Tz` : toWords(name)\n\n const baseField = baseTimezoneField({\n name,\n defaultValue: defaultTimezone,\n label: timezoneLabel,\n options,\n required,\n })\n\n // Apply override if provided\n const timezoneField =\n typeof field.timezone === 'object' && typeof field.timezone.override === 'function'\n ? field.timezone.override({ baseField })\n : baseField\n\n result.fieldsToInsert = [timezoneField]\n }\n\n // Virtual field handling\n if ('virtual' in field && typeof field.virtual === 'string') {\n const virtualField = field\n const configFields = (collectionConfig || globalConfig)?.fields\n if (configFields) {\n let flattenFields = flattenAllFields({ fields: configFields })\n const paths = field.virtual.split('.')\n let isHasMany = false\n\n for (const [idx, segment] of paths.entries()) {\n const foundField = flattenFields.find((e) => e.name === segment)\n if (!foundField) {\n break\n }\n\n if (\n foundField.type === 'group' ||\n foundField.type === 'tab' ||\n foundField.type === 'array'\n ) {\n flattenFields = foundField.flattenedFields\n } else if (\n (foundField.type === 'relationship' || foundField.type === 'upload') &&\n idx !== paths.length - 1 &&\n typeof foundField.relationTo === 'string'\n ) {\n if (\n foundField.hasMany &&\n (virtualField.type === 'text' ||\n virtualField.type === 'number' ||\n virtualField.type === 'select')\n ) {\n if (isHasMany) {\n throw new InvalidConfiguration(\n `Virtual field ${virtualField.name} in ${globalConfig ? `global ${globalConfig.slug}` : `collection ${collectionConfig?.slug}`} references 2 or more hasMany relationships on the path ${virtualField.virtual} which is not allowed.`,\n )\n }\n\n isHasMany = true\n virtualField.hasMany = true\n }\n const relatedCollection = config.collections?.find(\n (e) => e.slug === foundField.relationTo,\n )\n if (relatedCollection) {\n flattenFields = flattenAllFields({ fields: relatedCollection.fields })\n }\n }\n }\n }\n }\n\n return result\n}\n\nexport const sanitizeFields = async ({\n collectionConfig,\n config,\n existingFieldNames = new Set(),\n fields,\n globalConfig,\n isTopLevelField = true,\n joinPath = '',\n joins,\n orderableJoins,\n parentIndexPath = '',\n parentIsLocalized,\n parentSchemaPath = '',\n polymorphicJoins,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n validRelationships,\n}: SanitizeFieldsArgs): 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 const result = await sanitizeField({\n collectionConfig,\n config,\n existingFieldNames,\n field,\n globalConfig,\n index: i,\n isTopLevelField,\n joinPath,\n joins,\n orderableJoins,\n parentIndexPath,\n parentIsLocalized,\n parentSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n fields[i] = field\n\n if (result.fieldsToInsert?.length) {\n fields.splice(i + 1, 0, ...result.fieldsToInsert)\n i += result.fieldsToInsert.length\n }\n }\n\n return fields\n}\n"],"names":["DuplicateFieldName","InvalidConfiguration","InvalidFieldName","InvalidFieldRelationship","MissingEditorProp","MissingFieldType","ReservedFieldName","flattenAllFields","formatLabels","toWords","validateTimezones","baseBlockFields","baseIDField","generateSlug","baseTimezoneField","defaultTimezones","getFieldPaths","setDefaultBeforeDuplicate","validations","reservedAPIKeyFieldNames","reservedBaseAuthFieldNames","reservedBaseUploadFieldNames","reservedVerifyFieldNames","sanitizeJoinField","fieldAffectsData","_fieldAffectsData","fieldIsLocalized","tabHasName","sanitizeField","collectionConfig","config","existingFieldNames","field","globalConfig","index","isTopLevelField","joinPath","joins","orderableJoins","parentIndexPath","parentIsLocalized","parentSchemaPath","polymorphicJoins","requireFieldLevelRichTextEditor","richTextSanitizationPromises","validRelationships","result","_sanitized","type","indexPath","schemaPath","name","upload","includes","auth","disableLocalStrategy","verify","label","defaultValue","required","Array","isArray","relationTo","length","Error","relationships","forEach","relationship","admin","isSortable","useAsSlug","unique","position","slugify","custom","hooks","beforeChange","fields","hasCustomID","some","f","push","labels","has","add","localized","localization","validate","virtual","defaultValidate","val","options","access","readOnly","sanitizeRichText","_config","editor","isRoot","blocks","blockSlugs","block","blockSlug","slug","concat","sanitizeFields","Set","j","tabs","tab","isNamedTab","tabIndexPath","tabSchemaPath","condition","id","existing","disabled","undefined","bulkEdit","timezone","defaultTimezone","timezones","supportedTimezones","source","value","timezoneLabel","baseField","timezoneField","override","fieldsToInsert","virtualField","configFields","flattenFields","paths","split","isHasMany","idx","segment","entries","foundField","find","e","flattenedFields","hasMany","relatedCollection","collections","i","splice"],"mappings":"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"}
@@ -14,6 +14,8 @@ import type { SanitizedGlobalConfig } from '../../globals/config/types.js';
14
14
  import type { ArrayFieldValidation, BlocksFieldValidation, BlockSlug, CheckboxFieldValidation, CodeFieldValidation, CollectionSlug, DateFieldValidation, EmailFieldValidation, FieldCustom, JSONFieldValidation, PointFieldValidation, RadioFieldValidation, RequestContext, Sort, TextareaFieldValidation } from '../../index.js';
15
15
  import type { DocumentPreferences } from '../../preferences/types.js';
16
16
  import type { DefaultValue, JsonObject, Operation, PayloadRequest, PickPreserveOptional, Where } from '../../types/index.js';
17
+ import type { SchemaVariant } from '../../utilities/configToJSONSchema.js';
18
+ import type { Slugify } from '../baseFields/slug/types.js';
17
19
  import type { DisabledOptions } from '../isFieldDisabled.js';
18
20
  import type { NumberFieldManyValidation, NumberFieldSingleValidation, RelationshipFieldManyValidation, RelationshipFieldSingleValidation, RichTextFieldValidation, SelectFieldManyValidation, SelectFieldSingleValidation, TextFieldManyValidation, TextFieldSingleValidation, UploadFieldManyValidation, UploadFieldSingleValidation } from '../validations.js';
19
21
  export type FieldHookArgs<TData extends TypeWithID = any, TValue = any, TSiblingData = any> = {
@@ -84,7 +86,7 @@ export type FieldHookArgs<TData extends TypeWithID = any, TValue = any, TSibling
84
86
  value?: TValue;
85
87
  };
86
88
  export type FieldHook<TData extends TypeWithID = any, TValue = any, TSiblingData = any> = (args: FieldHookArgs<TData, TValue, TSiblingData>) => Promise<TValue> | TValue;
87
- export type FieldAccessArgs<TData extends TypeWithID = any, TSiblingData = any> = {
89
+ type SharedFieldAccessArgs<TData extends TypeWithID = any, TSiblingData = any> = {
88
90
  /**
89
91
  * The data of the nearest parent block. If the field is not within a block, `blockData` will be equal to `undefined`.
90
92
  */
@@ -108,6 +110,13 @@ export type FieldAccessArgs<TData extends TypeWithID = any, TSiblingData = any>
108
110
  */
109
111
  siblingData?: Partial<TSiblingData>;
110
112
  };
113
+ export type FieldAccessArgs<TData extends TypeWithID = any, TSiblingData = any> = ({
114
+ collection: SanitizedCollectionConfig;
115
+ global?: never;
116
+ } & SharedFieldAccessArgs<TData, TSiblingData>) | ({
117
+ collection?: never;
118
+ global: SanitizedGlobalConfig;
119
+ } & SharedFieldAccessArgs<TData, TSiblingData>);
111
120
  export type FieldAccess<TData extends TypeWithID = any, TSiblingData = any> = (args: FieldAccessArgs<TData, TSiblingData>) => boolean | Promise<boolean>;
112
121
  export type Condition<TData extends TypeWithID = any, TSiblingData = any> = (
113
122
  /**
@@ -306,9 +315,13 @@ export interface FieldBase {
306
315
  * Allows you to modify the base JSON schema that is generated for this field.
307
316
  * This JSON schema will be used to generate the TypeScript interface of this field, and to
308
317
  * validate the field's value in the MCP plugin.
318
+ *
319
+ * `variant` is `'input'` when generating the write shape (`create`/`update`) and `'output'` when
320
+ * generating the read shape, so a transform can differ between the two.
309
321
  */
310
322
  jsonSchema?: Array<(args: {
311
323
  jsonSchema: JSONSchema4;
324
+ variant: SchemaVariant;
312
325
  }) => JSONSchema4>;
313
326
  label?: false | LabelFunction | StaticLabel;
314
327
  localized?: boolean;
@@ -426,6 +439,29 @@ export type EmailField = {
426
439
  export type EmailFieldClient = {
427
440
  admin?: AdminClient & PickPreserveOptional<NonNullable<EmailField['admin']>, 'autoComplete' | 'placeholder'>;
428
441
  } & FieldBaseClient & Pick<EmailField, 'type'>;
442
+ export type SlugField = {
443
+ admin?: {
444
+ components?: {
445
+ afterInput?: CustomComponent[];
446
+ beforeInput?: CustomComponent[];
447
+ Error?: CustomComponent<TextFieldErrorClientComponent | TextFieldErrorServerComponent>;
448
+ Label?: CustomComponent<TextFieldLabelClientComponent | TextFieldLabelServerComponent>;
449
+ } & FieldAdmin['components'];
450
+ placeholder?: Record<string, string> | string;
451
+ } & FieldAdmin;
452
+ /** Provide a custom slugify function. Runs on the server. */
453
+ slugify?: Slugify;
454
+ type: 'slug';
455
+ /**
456
+ * Name of the sibling field whose value the slug is generated from, e.g. `'title'`.
457
+ * Required — there is no default, since a collection may not have a `title` field.
458
+ */
459
+ useAsSlug: string;
460
+ validate?: TextFieldSingleValidation;
461
+ } & Omit<FieldBase, 'validate'>;
462
+ export type SlugFieldClient = {
463
+ admin?: AdminClient & PickPreserveOptional<NonNullable<SlugField['admin']>, 'placeholder'>;
464
+ } & FieldBaseClient & Pick<SlugField, 'type' | 'useAsSlug'>;
429
465
  export type TextareaField = {
430
466
  admin?: {
431
467
  components?: {
@@ -1167,12 +1203,9 @@ export type BlocksField = {
1167
1203
  isSortable?: boolean;
1168
1204
  } & FieldAdmin;
1169
1205
  /**
1170
- * Like `blocks`, but allows you to also pass strings that are slugs of blocks defined in `config.blocks`.
1171
- *
1172
- * @todo `blockReferences` will be merged with `blocks` in 4.0
1206
+ * Blocks to use in this field. Inline block configs and string slugs of blocks defined in `config.blocks` are both supported.
1173
1207
  */
1174
- blockReferences?: (Block | BlockSlug)[];
1175
- blocks: Block[];
1208
+ blocks: (Block | BlockSlug)[];
1176
1209
  defaultValue?: DefaultValue;
1177
1210
  /**
1178
1211
  * Blocks can be conditionally enabled using the `filterOptions` property on the blocks field.
@@ -1212,13 +1245,7 @@ export type BlocksField = {
1212
1245
  } & Omit<FieldBase, 'validate'>;
1213
1246
  export type BlocksFieldClient = {
1214
1247
  admin?: AdminClient & Pick<BlocksField['admin'], 'initCollapsed' | 'isSortable'>;
1215
- /**
1216
- * Like `blocks`, but allows you to also pass strings that are slugs of blocks defined in `config.blocks`.
1217
- *
1218
- * @todo `blockReferences` will be merged with `blocks` in 4.0
1219
- */
1220
- blockReferences?: (ClientBlock | string)[];
1221
- blocks: ClientBlock[];
1248
+ blocks: (ClientBlock | string)[];
1222
1249
  labels?: LabelsClient;
1223
1250
  } & FieldBaseClient & Pick<BlocksField, 'maxRows' | 'minRows' | 'type'>;
1224
1251
  export type PointField = {
@@ -1314,14 +1341,8 @@ export type FlattenedBlock = {
1314
1341
  flattenedFields: FlattenedField[];
1315
1342
  } & Block;
1316
1343
  export type FlattenedBlocksField = {
1317
- /**
1318
- * Like `blocks`, but allows you to also pass strings that are slugs of blocks defined in `config.blocks`.
1319
- *
1320
- * @todo `blockReferences` will be merged with `blocks` in 4.0
1321
- */
1322
- blockReferences?: (FlattenedBlock | string)[];
1323
- blocks: FlattenedBlock[];
1324
- } & Omit<BlocksField, 'blockReferences' | 'blocks'>;
1344
+ blocks: (FlattenedBlock | string)[];
1345
+ } & Omit<BlocksField, 'blocks'>;
1325
1346
  export type FlattenedGroupField = {
1326
1347
  flattenedFields: FlattenedField[];
1327
1348
  name: string;
@@ -1335,18 +1356,18 @@ export type FlattenedTabAsField = {
1335
1356
  export type FlattenedJoinField = {
1336
1357
  targetField: RelationshipField | UploadField;
1337
1358
  } & JoinField;
1338
- export type FlattenedField = CheckboxField | CodeField | DateField | EmailField | FlattenedArrayField | FlattenedBlocksField | FlattenedGroupField | FlattenedJoinField | FlattenedTabAsField | JSONField | NumberField | PointField | RadioField | RelationshipField | RichTextField | SelectField | TextareaField | TextField | UploadField;
1339
- export type Field = ArrayField | BlocksField | CheckboxField | CodeField | CollapsibleField | DateField | EmailField | GroupField | JoinField | JSONField | NumberField | PointField | RadioField | RelationshipField | RichTextField | RowField | SelectField | TabsField | TextareaField | TextField | UIField | UploadField;
1340
- export type ClientField = ArrayFieldClient | BlocksFieldClient | CheckboxFieldClient | CodeFieldClient | CollapsibleFieldClient | DateFieldClient | EmailFieldClient | GroupFieldClient | JoinFieldClient | JSONFieldClient | NumberFieldClient | PointFieldClient | RadioFieldClient | RelationshipFieldClient | RichTextFieldClient | RowFieldClient | SelectFieldClient | TabsFieldClient | TextareaFieldClient | TextFieldClient | UIFieldClient | UploadFieldClient;
1359
+ export type FlattenedField = CheckboxField | CodeField | DateField | EmailField | FlattenedArrayField | FlattenedBlocksField | FlattenedGroupField | FlattenedJoinField | FlattenedTabAsField | JSONField | NumberField | PointField | RadioField | RelationshipField | RichTextField | SelectField | SlugField | TextareaField | TextField | UploadField;
1360
+ export type Field = ArrayField | BlocksField | CheckboxField | CodeField | CollapsibleField | DateField | EmailField | GroupField | JoinField | JSONField | NumberField | PointField | RadioField | RelationshipField | RichTextField | RowField | SelectField | SlugField | TabsField | TextareaField | TextField | UIField | UploadField;
1361
+ export type ClientField = ArrayFieldClient | BlocksFieldClient | CheckboxFieldClient | CodeFieldClient | CollapsibleFieldClient | DateFieldClient | EmailFieldClient | GroupFieldClient | JoinFieldClient | JSONFieldClient | NumberFieldClient | PointFieldClient | RadioFieldClient | RelationshipFieldClient | RichTextFieldClient | RowFieldClient | SelectFieldClient | SlugFieldClient | TabsFieldClient | TextareaFieldClient | TextFieldClient | UIFieldClient | UploadFieldClient;
1341
1362
  export type ClientFieldProps = ArrayFieldClientProps | BlocksFieldClientProps | CheckboxFieldClientProps | CodeFieldClientProps | CollapsibleFieldClientProps | DateFieldClientProps | EmailFieldClientProps | GroupFieldClientProps | HiddenFieldProps | JoinFieldClientProps | JSONFieldClientProps | NumberFieldClientProps | PointFieldClientProps | RadioFieldClientProps | RelationshipFieldClientProps | RichTextFieldClientProps | RowFieldClientProps | SelectFieldClientProps | TabsFieldClientProps | TextareaFieldClientProps | TextFieldClientProps | UploadFieldClientProps;
1342
1363
  type ExtractFieldTypes<T> = T extends {
1343
1364
  type: infer U;
1344
1365
  } ? U : never;
1345
1366
  export type FieldTypes = ExtractFieldTypes<Field>;
1346
- export type FieldAffectingData = ArrayField | BlocksField | CheckboxField | CodeField | DateField | EmailField | JoinField | JSONField | NamedGroupField | NumberField | PointField | RadioField | RelationshipField | RichTextField | SelectField | TabAsField | TextareaField | TextField | UploadField;
1347
- export type FieldAffectingDataClient = ArrayFieldClient | BlocksFieldClient | CheckboxFieldClient | CodeFieldClient | DateFieldClient | EmailFieldClient | JoinFieldClient | JSONFieldClient | NamedGroupFieldClient | NumberFieldClient | PointFieldClient | RadioFieldClient | RelationshipFieldClient | RichTextFieldClient | SelectFieldClient | TabAsFieldClient | TextareaFieldClient | TextFieldClient | UploadFieldClient;
1348
- export type NonPresentationalField = ArrayField | BlocksField | CheckboxField | CodeField | CollapsibleField | DateField | EmailField | JSONField | NamedGroupField | NumberField | PointField | RadioField | RelationshipField | RichTextField | RowField | SelectField | TabsField | TextareaField | TextField | UploadField;
1349
- export type NonPresentationalFieldClient = ArrayFieldClient | BlocksFieldClient | CheckboxFieldClient | CodeFieldClient | CollapsibleFieldClient | DateFieldClient | EmailFieldClient | JSONFieldClient | NamedGroupFieldClient | NumberFieldClient | PointFieldClient | RadioFieldClient | RelationshipFieldClient | RichTextFieldClient | RowFieldClient | SelectFieldClient | TabsFieldClient | TextareaFieldClient | TextFieldClient | UploadFieldClient;
1367
+ export type FieldAffectingData = ArrayField | BlocksField | CheckboxField | CodeField | DateField | EmailField | JoinField | JSONField | NamedGroupField | NumberField | PointField | RadioField | RelationshipField | RichTextField | SelectField | SlugField | TabAsField | TextareaField | TextField | UploadField;
1368
+ export type FieldAffectingDataClient = ArrayFieldClient | BlocksFieldClient | CheckboxFieldClient | CodeFieldClient | DateFieldClient | EmailFieldClient | JoinFieldClient | JSONFieldClient | NamedGroupFieldClient | NumberFieldClient | PointFieldClient | RadioFieldClient | RelationshipFieldClient | RichTextFieldClient | SelectFieldClient | SlugFieldClient | TabAsFieldClient | TextareaFieldClient | TextFieldClient | UploadFieldClient;
1369
+ export type NonPresentationalField = ArrayField | BlocksField | CheckboxField | CodeField | CollapsibleField | DateField | EmailField | JSONField | NamedGroupField | NumberField | PointField | RadioField | RelationshipField | RichTextField | RowField | SelectField | SlugField | TabsField | TextareaField | TextField | UploadField;
1370
+ export type NonPresentationalFieldClient = ArrayFieldClient | BlocksFieldClient | CheckboxFieldClient | CodeFieldClient | CollapsibleFieldClient | DateFieldClient | EmailFieldClient | JSONFieldClient | NamedGroupFieldClient | NumberFieldClient | PointFieldClient | RadioFieldClient | RelationshipFieldClient | RichTextFieldClient | RowFieldClient | SelectFieldClient | SlugFieldClient | TabsFieldClient | TextareaFieldClient | TextFieldClient | UploadFieldClient;
1350
1371
  export type FieldWithPath = {
1351
1372
  path?: string;
1352
1373
  } & Field;