payload 4.0.0-internal.5f0cd13 → 4.0.0-internal.656159a

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 (813) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +11 -0
  3. package/dist/__testing__/predefinedMigration.d.ts +4 -3
  4. package/dist/__testing__/predefinedMigration.d.ts.map +1 -1
  5. package/dist/admin/RichText.d.ts +2 -2
  6. package/dist/admin/RichText.d.ts.map +1 -1
  7. package/dist/admin/RichText.js.map +1 -1
  8. package/dist/admin/adapters/devReload.d.ts +9 -0
  9. package/dist/admin/adapters/devReload.d.ts.map +1 -0
  10. package/dist/admin/adapters/devReload.js +6 -0
  11. package/dist/admin/adapters/devReload.js.map +1 -0
  12. package/dist/admin/adapters/index.d.ts +3 -0
  13. package/dist/admin/adapters/index.d.ts.map +1 -1
  14. package/dist/admin/adapters/index.js.map +1 -1
  15. package/dist/admin/adapters/render.d.ts +16 -0
  16. package/dist/admin/adapters/render.d.ts.map +1 -0
  17. package/dist/admin/adapters/render.js +7 -0
  18. package/dist/admin/adapters/render.js.map +1 -0
  19. package/dist/admin/adapters/router.d.ts +8 -0
  20. package/dist/admin/adapters/router.d.ts.map +1 -1
  21. package/dist/admin/adapters/router.js.map +1 -1
  22. package/dist/admin/adapters/views.d.ts +36 -0
  23. package/dist/admin/adapters/views.d.ts.map +1 -0
  24. package/dist/admin/adapters/views.js +7 -0
  25. package/dist/admin/adapters/views.js.map +1 -0
  26. package/dist/admin/fields/Row.d.ts +2 -2
  27. package/dist/admin/fields/Row.d.ts.map +1 -1
  28. package/dist/admin/fields/Row.js.map +1 -1
  29. package/dist/admin/forms/Description.d.ts +2 -2
  30. package/dist/admin/forms/Description.d.ts.map +1 -1
  31. package/dist/admin/forms/Description.js.map +1 -1
  32. package/dist/admin/forms/Field.d.ts +10 -5
  33. package/dist/admin/forms/Field.d.ts.map +1 -1
  34. package/dist/admin/forms/Field.js.map +1 -1
  35. package/dist/admin/functions/index.d.ts +10 -1
  36. package/dist/admin/functions/index.d.ts.map +1 -1
  37. package/dist/admin/functions/index.js.map +1 -1
  38. package/dist/admin/types.d.ts +3 -2
  39. package/dist/admin/types.d.ts.map +1 -1
  40. package/dist/admin/types.js.map +1 -1
  41. package/dist/admin/views/dashboard.d.ts +7 -0
  42. package/dist/admin/views/dashboard.d.ts.map +1 -1
  43. package/dist/admin/views/dashboard.js.map +1 -1
  44. package/dist/admin/views/document.d.ts +5 -3
  45. package/dist/admin/views/document.d.ts.map +1 -1
  46. package/dist/admin/views/document.js.map +1 -1
  47. package/dist/admin/views/list.d.ts +5 -0
  48. package/dist/admin/views/list.d.ts.map +1 -1
  49. package/dist/admin/views/list.js.map +1 -1
  50. package/dist/auth/baseFields/apiKey.d.ts +10 -2
  51. package/dist/auth/baseFields/apiKey.d.ts.map +1 -1
  52. package/dist/auth/baseFields/apiKey.js +35 -24
  53. package/dist/auth/baseFields/apiKey.js.map +1 -1
  54. package/dist/auth/cookies.d.ts +2 -2
  55. package/dist/auth/cookies.d.ts.map +1 -1
  56. package/dist/auth/defaultAccess.d.ts +1 -1
  57. package/dist/auth/defaultAccess.d.ts.map +1 -1
  58. package/dist/auth/defaultAccess.js +1 -1
  59. package/dist/auth/defaultAccess.js.map +1 -1
  60. package/dist/auth/defaultUser.d.ts.map +1 -1
  61. package/dist/auth/defaultUser.js +2 -1
  62. package/dist/auth/defaultUser.js.map +1 -1
  63. package/dist/auth/ensureUsernameOrEmail.d.ts.map +1 -1
  64. package/dist/auth/executeAccess.d.ts.map +1 -1
  65. package/dist/auth/executeAuthStrategies.d.ts.map +1 -1
  66. package/dist/auth/extractAccessFromPermission.d.ts.map +1 -1
  67. package/dist/auth/extractJWT.d.ts +1 -1
  68. package/dist/auth/extractJWT.d.ts.map +1 -1
  69. package/dist/auth/getAuthFields.d.ts.map +1 -1
  70. package/dist/auth/getAuthFields.js +2 -2
  71. package/dist/auth/getAuthFields.js.map +1 -1
  72. package/dist/auth/getFieldsToSign.d.ts +1 -1
  73. package/dist/auth/getFieldsToSign.d.ts.map +1 -1
  74. package/dist/auth/getLoginOptions.d.ts +1 -1
  75. package/dist/auth/getLoginOptions.d.ts.map +1 -1
  76. package/dist/auth/isUserLocked.d.ts.map +1 -1
  77. package/dist/auth/jwt.d.ts.map +1 -1
  78. package/dist/auth/operations/access.d.ts.map +1 -1
  79. package/dist/auth/operations/auth.d.ts +2 -2
  80. package/dist/auth/operations/auth.d.ts.map +1 -1
  81. package/dist/auth/operations/auth.js.map +1 -1
  82. package/dist/auth/operations/forgotPassword.d.ts.map +1 -1
  83. package/dist/auth/operations/init.d.ts.map +1 -1
  84. package/dist/auth/operations/local/auth.d.ts.map +1 -1
  85. package/dist/auth/operations/login.d.ts +2 -1
  86. package/dist/auth/operations/login.d.ts.map +1 -1
  87. package/dist/auth/operations/login.js.map +1 -1
  88. package/dist/auth/operations/logout.d.ts.map +1 -1
  89. package/dist/auth/operations/me.d.ts +2 -2
  90. package/dist/auth/operations/me.d.ts.map +1 -1
  91. package/dist/auth/operations/me.js.map +1 -1
  92. package/dist/auth/operations/refresh.d.ts.map +1 -1
  93. package/dist/auth/operations/refresh.js +9 -3
  94. package/dist/auth/operations/refresh.js.map +1 -1
  95. package/dist/auth/operations/registerFirstUser.d.ts.map +1 -1
  96. package/dist/auth/operations/resetPassword.d.ts.map +1 -1
  97. package/dist/auth/operations/resetPassword.js.map +1 -1
  98. package/dist/auth/operations/unlock.d.ts.map +1 -1
  99. package/dist/auth/operations/verifyEmail.d.ts.map +1 -1
  100. package/dist/auth/sendVerificationEmail.d.ts +2 -2
  101. package/dist/auth/sendVerificationEmail.d.ts.map +1 -1
  102. package/dist/auth/sendVerificationEmail.js +1 -1
  103. package/dist/auth/sendVerificationEmail.js.map +1 -1
  104. package/dist/auth/sessions.d.ts +4 -5
  105. package/dist/auth/sessions.d.ts.map +1 -1
  106. package/dist/auth/sessions.js +5 -3
  107. package/dist/auth/sessions.js.map +1 -1
  108. package/dist/auth/strategies/apiKey.d.ts.map +1 -1
  109. package/dist/auth/strategies/apiKey.js.map +1 -1
  110. package/dist/auth/strategies/local/authenticate.d.ts.map +1 -1
  111. package/dist/auth/strategies/local/generatePasswordSaltHash.d.ts.map +1 -1
  112. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts +2 -2
  113. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts.map +1 -1
  114. package/dist/auth/strategies/local/incrementLoginAttempts.js +1 -1
  115. package/dist/auth/strategies/local/incrementLoginAttempts.js.map +1 -1
  116. package/dist/auth/strategies/local/register.d.ts.map +1 -1
  117. package/dist/auth/strategies/local/resetLoginAttempts.d.ts.map +1 -1
  118. package/dist/auth/types.d.ts +25 -21
  119. package/dist/auth/types.d.ts.map +1 -1
  120. package/dist/auth/types.js.map +1 -1
  121. package/dist/bin/build.d.ts +49 -0
  122. package/dist/bin/build.d.ts.map +1 -0
  123. package/dist/bin/build.js +226 -0
  124. package/dist/bin/build.js.map +1 -0
  125. package/dist/bin/build.spec.js +594 -0
  126. package/dist/bin/build.spec.js.map +1 -0
  127. package/dist/bin/frameworkConventions.d.ts +8 -0
  128. package/dist/bin/frameworkConventions.d.ts.map +1 -0
  129. package/dist/bin/frameworkConventions.js +8 -0
  130. package/dist/bin/frameworkConventions.js.map +1 -0
  131. package/dist/bin/generateImportMap/index.d.ts.map +1 -1
  132. package/dist/bin/generateImportMap/index.js +8 -5
  133. package/dist/bin/generateImportMap/index.js.map +1 -1
  134. package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
  135. package/dist/bin/generateImportMap/iterateCollections.js +11 -0
  136. package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
  137. package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
  138. package/dist/bin/generateImportMap/iterateConfig.js +12 -0
  139. package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
  140. package/dist/bin/generateImportMap/utilities/getFromImportMap.d.ts.map +1 -1
  141. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.d.ts +5 -1
  142. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.d.ts.map +1 -1
  143. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js +33 -18
  144. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js.map +1 -1
  145. package/dist/bin/generateTypes.d.ts +3 -2
  146. package/dist/bin/generateTypes.d.ts.map +1 -1
  147. package/dist/bin/generateTypes.js +4 -0
  148. package/dist/bin/generateTypes.js.map +1 -1
  149. package/dist/bin/index.d.ts.map +1 -1
  150. package/dist/bin/index.js +9 -0
  151. package/dist/bin/index.js.map +1 -1
  152. package/dist/bin/loadEnv.d.ts +3 -1
  153. package/dist/bin/loadEnv.d.ts.map +1 -1
  154. package/dist/bin/loadEnv.js +40 -10
  155. package/dist/bin/loadEnv.js.map +1 -1
  156. package/dist/bin/migrate.d.ts.map +1 -1
  157. package/dist/collections/config/client.d.ts +3 -3
  158. package/dist/collections/config/client.d.ts.map +1 -1
  159. package/dist/collections/config/client.js +1 -0
  160. package/dist/collections/config/client.js.map +1 -1
  161. package/dist/collections/config/defaults.d.ts +0 -4
  162. package/dist/collections/config/defaults.d.ts.map +1 -1
  163. package/dist/collections/config/defaults.js +2 -17
  164. package/dist/collections/config/defaults.js.map +1 -1
  165. package/dist/collections/config/defaults.spec.js +47 -0
  166. package/dist/collections/config/defaults.spec.js.map +1 -0
  167. package/dist/collections/config/sanitize.d.ts.map +1 -1
  168. package/dist/collections/config/sanitize.js +1 -11
  169. package/dist/collections/config/sanitize.js.map +1 -1
  170. package/dist/collections/config/sanitizeCompoundIndexes.d.ts.map +1 -1
  171. package/dist/collections/config/types.d.ts +13 -9
  172. package/dist/collections/config/types.d.ts.map +1 -1
  173. package/dist/collections/config/types.js.map +1 -1
  174. package/dist/collections/config/useAsTitle.d.ts.map +1 -1
  175. package/dist/collections/dataloader.d.ts +1 -1
  176. package/dist/collections/dataloader.d.ts.map +1 -1
  177. package/dist/collections/endpoints/create.d.ts.map +1 -1
  178. package/dist/collections/endpoints/create.js +0 -2
  179. package/dist/collections/endpoints/create.js.map +1 -1
  180. package/dist/collections/endpoints/updateByID.d.ts.map +1 -1
  181. package/dist/collections/endpoints/updateByID.js +1 -2
  182. package/dist/collections/endpoints/updateByID.js.map +1 -1
  183. package/dist/collections/operations/count.d.ts.map +1 -1
  184. package/dist/collections/operations/count.js +1 -0
  185. package/dist/collections/operations/count.js.map +1 -1
  186. package/dist/collections/operations/countVersions.d.ts.map +1 -1
  187. package/dist/collections/operations/create.d.ts +0 -1
  188. package/dist/collections/operations/create.d.ts.map +1 -1
  189. package/dist/collections/operations/create.js +15 -6
  190. package/dist/collections/operations/create.js.map +1 -1
  191. package/dist/collections/operations/delete.d.ts.map +1 -1
  192. package/dist/collections/operations/delete.js +3 -0
  193. package/dist/collections/operations/delete.js.map +1 -1
  194. package/dist/collections/operations/deleteByID.d.ts.map +1 -1
  195. package/dist/collections/operations/duplicate.d.ts.map +1 -1
  196. package/dist/collections/operations/find.d.ts.map +1 -1
  197. package/dist/collections/operations/findByID.d.ts.map +1 -1
  198. package/dist/collections/operations/findDistinct.d.ts.map +1 -1
  199. package/dist/collections/operations/findDistinct.js +1 -0
  200. package/dist/collections/operations/findDistinct.js.map +1 -1
  201. package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
  202. package/dist/collections/operations/findVersions.d.ts.map +1 -1
  203. package/dist/collections/operations/local/count.d.ts +3 -3
  204. package/dist/collections/operations/local/count.d.ts.map +1 -1
  205. package/dist/collections/operations/local/count.js.map +1 -1
  206. package/dist/collections/operations/local/countVersions.d.ts +3 -3
  207. package/dist/collections/operations/local/countVersions.d.ts.map +1 -1
  208. package/dist/collections/operations/local/countVersions.js.map +1 -1
  209. package/dist/collections/operations/local/create.d.ts +3 -3
  210. package/dist/collections/operations/local/create.d.ts.map +1 -1
  211. package/dist/collections/operations/local/create.js.map +1 -1
  212. package/dist/collections/operations/local/delete.d.ts +3 -3
  213. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  214. package/dist/collections/operations/local/delete.js.map +1 -1
  215. package/dist/collections/operations/local/duplicate.d.ts +3 -3
  216. package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
  217. package/dist/collections/operations/local/duplicate.js.map +1 -1
  218. package/dist/collections/operations/local/find.d.ts +3 -3
  219. package/dist/collections/operations/local/find.d.ts.map +1 -1
  220. package/dist/collections/operations/local/find.js.map +1 -1
  221. package/dist/collections/operations/local/findByID.d.ts +3 -3
  222. package/dist/collections/operations/local/findByID.d.ts.map +1 -1
  223. package/dist/collections/operations/local/findByID.js.map +1 -1
  224. package/dist/collections/operations/local/findDistinct.d.ts +2 -2
  225. package/dist/collections/operations/local/findDistinct.d.ts.map +1 -1
  226. package/dist/collections/operations/local/findDistinct.js.map +1 -1
  227. package/dist/collections/operations/local/findVersionByID.d.ts +3 -3
  228. package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
  229. package/dist/collections/operations/local/findVersionByID.js.map +1 -1
  230. package/dist/collections/operations/local/findVersions.d.ts +3 -3
  231. package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
  232. package/dist/collections/operations/local/findVersions.js.map +1 -1
  233. package/dist/collections/operations/local/restoreVersion.d.ts +3 -3
  234. package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
  235. package/dist/collections/operations/local/restoreVersion.js.map +1 -1
  236. package/dist/collections/operations/local/update.d.ts +7 -11
  237. package/dist/collections/operations/local/update.d.ts.map +1 -1
  238. package/dist/collections/operations/local/update.js +1 -2
  239. package/dist/collections/operations/local/update.js.map +1 -1
  240. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  241. package/dist/collections/operations/update.d.ts +0 -1
  242. package/dist/collections/operations/update.d.ts.map +1 -1
  243. package/dist/collections/operations/update.js +8 -4
  244. package/dist/collections/operations/update.js.map +1 -1
  245. package/dist/collections/operations/updateByID.d.ts +0 -1
  246. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  247. package/dist/collections/operations/updateByID.js +1 -5
  248. package/dist/collections/operations/updateByID.js.map +1 -1
  249. package/dist/collections/operations/utilities/buildAfterOperation.d.ts +1 -1
  250. package/dist/collections/operations/utilities/buildAfterOperation.d.ts.map +1 -1
  251. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts +9 -0
  252. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts.map +1 -0
  253. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js +170 -0
  254. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js.map +1 -0
  255. package/dist/collections/operations/utilities/sanitizeSortQuery.d.ts.map +1 -1
  256. package/dist/collections/operations/utilities/types.d.ts +20 -29
  257. package/dist/collections/operations/utilities/types.d.ts.map +1 -1
  258. package/dist/collections/operations/utilities/types.js.map +1 -1
  259. package/dist/collections/operations/utilities/update.d.ts +1 -2
  260. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  261. package/dist/collections/operations/utilities/update.js +64 -65
  262. package/dist/collections/operations/utilities/update.js.map +1 -1
  263. package/dist/config/client.d.ts +2 -2
  264. package/dist/config/client.d.ts.map +1 -1
  265. package/dist/config/client.js.map +1 -1
  266. package/dist/config/defaults.d.ts +0 -4
  267. package/dist/config/defaults.d.ts.map +1 -1
  268. package/dist/config/defaults.js +0 -78
  269. package/dist/config/defaults.js.map +1 -1
  270. package/dist/config/definePlugin.d.ts +10 -10
  271. package/dist/config/definePlugin.d.ts.map +1 -1
  272. package/dist/config/definePlugin.js +7 -11
  273. package/dist/config/definePlugin.js.map +1 -1
  274. package/dist/config/orderable/fractional-indexing.d.ts +23 -23
  275. package/dist/config/orderable/fractional-indexing.d.ts.map +1 -1
  276. package/dist/config/orderable/index.d.ts.map +1 -1
  277. package/dist/config/orderable/index.js +23 -0
  278. package/dist/config/orderable/index.js.map +1 -1
  279. package/dist/config/sanitize.d.ts.map +1 -1
  280. package/dist/config/sanitize.js +137 -13
  281. package/dist/config/sanitize.js.map +1 -1
  282. package/dist/config/types.d.ts +58 -19
  283. package/dist/config/types.d.ts.map +1 -1
  284. package/dist/config/types.js +2 -0
  285. package/dist/config/types.js.map +1 -1
  286. package/dist/database/combineQueries.d.ts.map +1 -1
  287. package/dist/database/getLocalizedPaths.d.ts.map +1 -1
  288. package/dist/database/getLocalizedPaths.js +1 -1
  289. package/dist/database/getLocalizedPaths.js.map +1 -1
  290. package/dist/database/migrations/findMigrationDir.d.ts.map +1 -1
  291. package/dist/database/migrations/getPredefinedMigration.d.ts.map +1 -1
  292. package/dist/database/migrations/migrationsCollection.d.ts.map +1 -1
  293. package/dist/database/migrations/migrationsCollection.js +2 -1
  294. package/dist/database/migrations/migrationsCollection.js.map +1 -1
  295. package/dist/database/migrations/readMigrationFiles.d.ts.map +1 -1
  296. package/dist/database/migrations/writeMigrationIndex.d.ts.map +1 -1
  297. package/dist/database/sanitizeJoinQuery.d.ts.map +1 -1
  298. package/dist/database/sanitizeWhereQuery.d.ts.map +1 -1
  299. package/dist/database/types.d.ts +1 -5
  300. package/dist/database/types.d.ts.map +1 -1
  301. package/dist/database/types.js.map +1 -1
  302. package/dist/duplicateDocument/index.d.ts.map +1 -1
  303. package/dist/email/getStringifiedToAddress.d.ts.map +1 -1
  304. package/dist/errors/APIError.d.ts.map +1 -1
  305. package/dist/errors/AuthenticationError.d.ts.map +1 -1
  306. package/dist/errors/DuplicateCollection.d.ts.map +1 -1
  307. package/dist/errors/DuplicateFieldName.d.ts.map +1 -1
  308. package/dist/errors/DuplicateGlobal.d.ts.map +1 -1
  309. package/dist/errors/ErrorDeletingFile.d.ts.map +1 -1
  310. package/dist/errors/FileRetrievalError.d.ts.map +1 -1
  311. package/dist/errors/FileUploadError.d.ts.map +1 -1
  312. package/dist/errors/Forbidden.d.ts.map +1 -1
  313. package/dist/errors/InvalidConfiguration.d.ts.map +1 -1
  314. package/dist/errors/InvalidFieldJoin.d.ts.map +1 -1
  315. package/dist/errors/InvalidFieldName.d.ts.map +1 -1
  316. package/dist/errors/InvalidFieldRelationship.d.ts.map +1 -1
  317. package/dist/errors/InvalidSchema.d.ts.map +1 -1
  318. package/dist/errors/Locked.d.ts.map +1 -1
  319. package/dist/errors/LockedAuth.d.ts.map +1 -1
  320. package/dist/errors/MissingCollectionLabel.d.ts.map +1 -1
  321. package/dist/errors/MissingEditorProp.d.ts.map +1 -1
  322. package/dist/errors/MissingFieldInputOptions.d.ts.map +1 -1
  323. package/dist/errors/MissingFieldType.d.ts.map +1 -1
  324. package/dist/errors/MissingFile.d.ts.map +1 -1
  325. package/dist/errors/NotFound.d.ts.map +1 -1
  326. package/dist/errors/QueryError.d.ts.map +1 -1
  327. package/dist/errors/ReservedFieldName.d.ts.map +1 -1
  328. package/dist/errors/TimestampsRequired.d.ts.map +1 -1
  329. package/dist/errors/UnauthorizedError.d.ts.map +1 -1
  330. package/dist/errors/UnverifiedEmail.d.ts.map +1 -1
  331. package/dist/errors/ValidationError.d.ts +1 -0
  332. package/dist/errors/ValidationError.d.ts.map +1 -1
  333. package/dist/errors/ValidationError.js.map +1 -1
  334. package/dist/exports/internal.d.ts +2 -0
  335. package/dist/exports/internal.d.ts.map +1 -1
  336. package/dist/exports/internal.js +2 -0
  337. package/dist/exports/internal.js.map +1 -1
  338. package/dist/exports/migrations.d.ts +5 -13
  339. package/dist/exports/migrations.d.ts.map +1 -1
  340. package/dist/exports/migrations.js +5 -13
  341. package/dist/exports/migrations.js.map +1 -1
  342. package/dist/exports/shared.d.ts +23 -2
  343. package/dist/exports/shared.d.ts.map +1 -1
  344. package/dist/exports/shared.js +22 -1
  345. package/dist/exports/shared.js.map +1 -1
  346. package/dist/fields/baseFields/slug/countVersions.d.ts.map +1 -1
  347. package/dist/fields/baseFields/slug/countVersions.js +6 -8
  348. package/dist/fields/baseFields/slug/countVersions.js.map +1 -1
  349. package/dist/fields/baseFields/slug/generateSlug.d.ts +14 -7
  350. package/dist/fields/baseFields/slug/generateSlug.d.ts.map +1 -1
  351. package/dist/fields/baseFields/slug/generateSlug.js +53 -73
  352. package/dist/fields/baseFields/slug/generateSlug.js.map +1 -1
  353. package/dist/fields/baseFields/slug/types.d.ts +14 -0
  354. package/dist/fields/baseFields/slug/types.d.ts.map +1 -0
  355. package/dist/fields/baseFields/slug/types.js +6 -0
  356. package/dist/fields/baseFields/slug/types.js.map +1 -0
  357. package/dist/fields/config/client.d.ts +6 -6
  358. package/dist/fields/config/client.d.ts.map +1 -1
  359. package/dist/fields/config/client.js +13 -13
  360. package/dist/fields/config/client.js.map +1 -1
  361. package/dist/fields/config/sanitize.d.ts.map +1 -1
  362. package/dist/fields/config/sanitize.js +40 -4
  363. package/dist/fields/config/sanitize.js.map +1 -1
  364. package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
  365. package/dist/fields/config/types.d.ts +53 -31
  366. package/dist/fields/config/types.d.ts.map +1 -1
  367. package/dist/fields/config/types.js.map +1 -1
  368. package/dist/fields/getDefaultValue.d.ts.map +1 -1
  369. package/dist/fields/hooks/afterChange/index.d.ts.map +1 -1
  370. package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
  371. package/dist/fields/hooks/afterChange/promise.js +1 -1
  372. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  373. package/dist/fields/hooks/afterChange/traverseFields.d.ts.map +1 -1
  374. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  375. package/dist/fields/hooks/afterRead/promise.js +13 -3
  376. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  377. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
  378. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  379. package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.d.ts.map +1 -1
  380. package/dist/fields/hooks/beforeChange/cloneDataFromOriginalDoc.d.ts.map +1 -1
  381. package/dist/fields/hooks/beforeChange/getExistingRowDoc.d.ts.map +1 -1
  382. package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
  383. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  384. package/dist/fields/hooks/beforeChange/promise.js +3 -3
  385. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  386. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  387. package/dist/fields/hooks/beforeDuplicate/index.d.ts.map +1 -1
  388. package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
  389. package/dist/fields/hooks/beforeDuplicate/promise.js +2 -2
  390. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  391. package/dist/fields/hooks/beforeDuplicate/traverseFields.d.ts.map +1 -1
  392. package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
  393. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  394. package/dist/fields/hooks/beforeValidate/promise.js +16 -5
  395. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  396. package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts +10 -0
  397. package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts.map +1 -0
  398. package/dist/fields/hooks/beforeValidate/stripNullRows.js +18 -0
  399. package/dist/fields/hooks/beforeValidate/stripNullRows.js.map +1 -0
  400. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  401. package/dist/fields/isFieldDisabled.d.ts.map +1 -1
  402. package/dist/fields/mergeBaseFields.d.ts.map +1 -1
  403. package/dist/fields/setDefaultBeforeDuplicate.d.ts.map +1 -1
  404. package/dist/fields/setDefaultBeforeDuplicate.js +1 -0
  405. package/dist/fields/setDefaultBeforeDuplicate.js.map +1 -1
  406. package/dist/fields/sortableFieldTypes.d.ts.map +1 -1
  407. package/dist/fields/sortableFieldTypes.js +1 -0
  408. package/dist/fields/sortableFieldTypes.js.map +1 -1
  409. package/dist/fields/validations.d.ts +4 -1
  410. package/dist/fields/validations.d.ts.map +1 -1
  411. package/dist/fields/validations.js +12 -4
  412. package/dist/fields/validations.js.map +1 -1
  413. package/dist/globals/config/client.d.ts +4 -4
  414. package/dist/globals/config/client.d.ts.map +1 -1
  415. package/dist/globals/config/sanitize.d.ts.map +1 -1
  416. package/dist/globals/config/sanitize.js +2 -6
  417. package/dist/globals/config/sanitize.js.map +1 -1
  418. package/dist/globals/config/sanitize.spec.js +43 -0
  419. package/dist/globals/config/sanitize.spec.js.map +1 -0
  420. package/dist/globals/endpoints/update.d.ts.map +1 -1
  421. package/dist/globals/endpoints/update.js +0 -2
  422. package/dist/globals/endpoints/update.js.map +1 -1
  423. package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -1
  424. package/dist/globals/operations/docAccess.d.ts.map +1 -1
  425. package/dist/globals/operations/findOne.d.ts.map +1 -1
  426. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  427. package/dist/globals/operations/findVersions.d.ts.map +1 -1
  428. package/dist/globals/operations/local/countVersions.d.ts +3 -3
  429. package/dist/globals/operations/local/countVersions.d.ts.map +1 -1
  430. package/dist/globals/operations/local/countVersions.js.map +1 -1
  431. package/dist/globals/operations/local/findOne.d.ts +3 -3
  432. package/dist/globals/operations/local/findOne.d.ts.map +1 -1
  433. package/dist/globals/operations/local/findOne.js.map +1 -1
  434. package/dist/globals/operations/local/findVersionByID.d.ts +3 -3
  435. package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
  436. package/dist/globals/operations/local/findVersionByID.js.map +1 -1
  437. package/dist/globals/operations/local/findVersions.d.ts +3 -3
  438. package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
  439. package/dist/globals/operations/local/findVersions.js.map +1 -1
  440. package/dist/globals/operations/local/restoreVersion.d.ts +3 -3
  441. package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
  442. package/dist/globals/operations/local/restoreVersion.js.map +1 -1
  443. package/dist/globals/operations/local/update.d.ts +7 -9
  444. package/dist/globals/operations/local/update.d.ts.map +1 -1
  445. package/dist/globals/operations/local/update.js +1 -2
  446. package/dist/globals/operations/local/update.js.map +1 -1
  447. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  448. package/dist/globals/operations/update.d.ts +0 -1
  449. package/dist/globals/operations/update.d.ts.map +1 -1
  450. package/dist/globals/operations/update.js +52 -58
  451. package/dist/globals/operations/update.js.map +1 -1
  452. package/dist/hierarchy/addHierarchyToCollection.d.ts.map +1 -1
  453. package/dist/hierarchy/buildParentField.d.ts.map +1 -1
  454. package/dist/hierarchy/constants.d.ts.map +1 -1
  455. package/dist/hierarchy/getInitialTreeData.d.ts.map +1 -1
  456. package/dist/hierarchy/hooks/collectionAfterDelete.d.ts.map +1 -1
  457. package/dist/hierarchy/hooks/collectionAfterRead.d.ts.map +1 -1
  458. package/dist/hierarchy/hooks/collectionBeforeChange.d.ts.map +1 -1
  459. package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts.map +1 -1
  460. package/dist/hierarchy/hooks/collectionBeforeOperation.d.ts.map +1 -1
  461. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts.map +1 -1
  462. package/dist/hierarchy/injectHierarchyButton.d.ts.map +1 -1
  463. package/dist/hierarchy/resolveHierarchyCollections.d.ts.map +1 -1
  464. package/dist/hierarchy/sanitizeHierarchyCollection.d.ts.map +1 -1
  465. package/dist/index.bundled.d.ts +608 -378
  466. package/dist/index.d.ts +79 -34
  467. package/dist/index.d.ts.map +1 -1
  468. package/dist/index.js +54 -37
  469. package/dist/index.js.map +1 -1
  470. package/dist/kv/adapters/DatabaseKVAdapter.d.ts.map +1 -1
  471. package/dist/kv/adapters/DatabaseKVAdapter.js +1 -0
  472. package/dist/kv/adapters/DatabaseKVAdapter.js.map +1 -1
  473. package/dist/kv/adapters/InMemoryKVAdapter.d.ts.map +1 -1
  474. package/dist/locked-documents/config.d.ts.map +1 -1
  475. package/dist/locked-documents/config.js +2 -1
  476. package/dist/locked-documents/config.js.map +1 -1
  477. package/dist/preferences/config.d.ts.map +1 -1
  478. package/dist/preferences/config.js +2 -1
  479. package/dist/preferences/config.js.map +1 -1
  480. package/dist/preferences/deleteUserPreferences.d.ts.map +1 -1
  481. package/dist/preferences/keys.d.ts +8 -4
  482. package/dist/preferences/keys.d.ts.map +1 -1
  483. package/dist/preferences/keys.js +4 -1
  484. package/dist/preferences/keys.js.map +1 -1
  485. package/dist/preferences/types.d.ts +15 -0
  486. package/dist/preferences/types.d.ts.map +1 -1
  487. package/dist/preferences/types.js +3 -1
  488. package/dist/preferences/types.js.map +1 -1
  489. package/dist/query-presets/access.d.ts.map +1 -1
  490. package/dist/query-presets/config.d.ts.map +1 -1
  491. package/dist/query-presets/config.js +75 -35
  492. package/dist/query-presets/config.js.map +1 -1
  493. package/dist/query-presets/constraints.d.ts.map +1 -1
  494. package/dist/query-presets/constraints.js +2 -1
  495. package/dist/query-presets/constraints.js.map +1 -1
  496. package/dist/query-presets/types.d.ts +1 -1
  497. package/dist/query-presets/types.d.ts.map +1 -1
  498. package/dist/queues/config/collection.d.ts.map +1 -1
  499. package/dist/queues/config/collection.js +2 -1
  500. package/dist/queues/config/collection.js.map +1 -1
  501. package/dist/queues/config/generateJobsJSONSchemas.js +2 -2
  502. package/dist/queues/config/generateJobsJSONSchemas.js.map +1 -1
  503. package/dist/queues/config/global.d.ts.map +1 -1
  504. package/dist/queues/config/global.js +2 -1
  505. package/dist/queues/config/global.js.map +1 -1
  506. package/dist/queues/endpoints/run.d.ts.map +1 -1
  507. package/dist/queues/errors/index.d.ts.map +1 -1
  508. package/dist/queues/localAPI.d.ts +8 -8
  509. package/dist/queues/localAPI.d.ts.map +1 -1
  510. package/dist/queues/operations/handleSchedules/getQueuesWithSchedules.d.ts.map +1 -1
  511. package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
  512. package/dist/queues/operations/runJobs/runJSONJob/index.d.ts.map +1 -1
  513. package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.d.ts.map +1 -1
  514. package/dist/queues/operations/runJobs/runJob/importHandlerPath.d.ts +1 -1
  515. package/dist/queues/operations/runJobs/runJob/importHandlerPath.d.ts.map +1 -1
  516. package/dist/queues/operations/runJobs/runJob/index.d.ts.map +1 -1
  517. package/dist/queues/utilities/getCurrentDate.d.ts.map +1 -1
  518. package/dist/queues/utilities/getJobTaskStatus.d.ts.map +1 -1
  519. package/dist/translations/getLocalI18n.d.ts.map +1 -1
  520. package/dist/types/constants.d.ts +2 -2
  521. package/dist/types/constants.d.ts.map +1 -1
  522. package/dist/types/index.d.ts +8 -3
  523. package/dist/types/index.d.ts.map +1 -1
  524. package/dist/types/index.js.map +1 -1
  525. package/dist/uploads/checkFileAccess.d.ts.map +1 -1
  526. package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
  527. package/dist/uploads/cropImage.d.ts.map +1 -1
  528. package/dist/uploads/docWithFilenameExists.d.ts.map +1 -1
  529. package/dist/uploads/fetchAPI-multipart/isEligibleRequest.d.ts.map +1 -1
  530. package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
  531. package/dist/uploads/fetchAPI-multipart/processMultipart.js +4 -0
  532. package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
  533. package/dist/uploads/fetchAPI-multipart/processNested.d.ts.map +1 -1
  534. package/dist/uploads/fetchAPI-multipart/utilities.d.ts.map +1 -1
  535. package/dist/uploads/fileExists.d.ts.map +1 -1
  536. package/dist/uploads/generateFileData.d.ts +2 -1
  537. package/dist/uploads/generateFileData.d.ts.map +1 -1
  538. package/dist/uploads/generateFileData.js +5 -2
  539. package/dist/uploads/generateFileData.js.map +1 -1
  540. package/dist/uploads/getBaseFields.d.ts.map +1 -1
  541. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  542. package/dist/uploads/getFileByPath.d.ts +1 -1
  543. package/dist/uploads/getFileByPath.d.ts.map +1 -1
  544. package/dist/uploads/getFileTypeFallback.d.ts.map +1 -1
  545. package/dist/uploads/getSafeFilename.d.ts.map +1 -1
  546. package/dist/uploads/image-resizing/createImageSize.d.ts.map +1 -1
  547. package/dist/uploads/image-resizing/generateImageSizeFilename.d.ts.map +1 -1
  548. package/dist/uploads/image-resizing/getImageResizeAction.d.ts +1 -1
  549. package/dist/uploads/image-resizing/getImageResizeAction.d.ts.map +1 -1
  550. package/dist/uploads/image-resizing/parseFilename.d.ts.map +1 -1
  551. package/dist/uploads/image-resizing/sanitizeResizeConfig.d.ts.map +1 -1
  552. package/dist/uploads/matchMimeType.d.ts +8 -0
  553. package/dist/uploads/matchMimeType.d.ts.map +1 -0
  554. package/dist/uploads/matchMimeType.js +19 -0
  555. package/dist/uploads/matchMimeType.js.map +1 -0
  556. package/dist/uploads/matchMimeType.spec.js +66 -0
  557. package/dist/uploads/matchMimeType.spec.js.map +1 -0
  558. package/dist/uploads/mimeTypeValidator.d.ts.map +1 -1
  559. package/dist/uploads/safeFetch.d.ts.map +1 -1
  560. package/dist/uploads/safeFetch.js +11 -5
  561. package/dist/uploads/safeFetch.js.map +1 -1
  562. package/dist/uploads/saveBufferToFile.d.ts.map +1 -1
  563. package/dist/uploads/tempFile.d.ts.map +1 -1
  564. package/dist/uploads/types.d.ts +21 -0
  565. package/dist/uploads/types.d.ts.map +1 -1
  566. package/dist/uploads/types.js.map +1 -1
  567. package/dist/uploads/uploadFiles.d.ts.map +1 -1
  568. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  569. package/dist/utilities/addDataAndFileToRequest.js +6 -0
  570. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  571. package/dist/utilities/addLocalesToRequest.d.ts.map +1 -1
  572. package/dist/utilities/addSelectGenericsToGeneretedTypes.d.ts.map +1 -1
  573. package/dist/utilities/appendDateTimezoneSelectFields.d.ts.map +1 -1
  574. package/dist/utilities/appendDateTimezoneSelectFields.js +2 -2
  575. package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
  576. package/dist/utilities/appendNonTrashedFilter.d.ts.map +1 -1
  577. package/dist/utilities/appendUploadSelectFields.d.ts.map +1 -1
  578. package/dist/utilities/canAccessAdmin.d.ts.map +1 -1
  579. package/dist/utilities/checkDocumentLockStatus.d.ts.map +1 -1
  580. package/dist/utilities/configToJSONSchema.d.ts +36 -2
  581. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  582. package/dist/utilities/configToJSONSchema.js +204 -84
  583. package/dist/utilities/configToJSONSchema.js.map +1 -1
  584. package/dist/utilities/configToJSONSchema.spec.js +571 -29
  585. package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
  586. package/dist/utilities/createLocalReq.d.ts +2 -2
  587. package/dist/utilities/createLocalReq.d.ts.map +1 -1
  588. package/dist/utilities/createLocalReq.js.map +1 -1
  589. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  590. package/dist/utilities/createPayloadRequest.js +1 -0
  591. package/dist/utilities/createPayloadRequest.js.map +1 -1
  592. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  593. package/dist/utilities/deepCopyObject.js +8 -0
  594. package/dist/utilities/deepCopyObject.js.map +1 -1
  595. package/dist/utilities/dependencies/dependencyChecker.js +1 -1
  596. package/dist/utilities/dependencies/dependencyChecker.js.map +1 -1
  597. package/dist/utilities/dependencies/getDependencies.d.ts.map +1 -1
  598. package/dist/utilities/dependencies/getDependencies.js +5 -5
  599. package/dist/utilities/dependencies/getDependencies.js.map +1 -1
  600. package/dist/utilities/dependencies/resolveFrom.d.ts.map +1 -1
  601. package/dist/utilities/dynamicImport.js +1 -1
  602. package/dist/utilities/dynamicImport.js.map +1 -1
  603. package/dist/utilities/escapeRegExp.d.ts.map +1 -1
  604. package/dist/utilities/extractID.d.ts.map +1 -1
  605. package/dist/utilities/filterDataToSelectedLocales.d.ts.map +1 -1
  606. package/dist/utilities/filterDataToSelectedLocales.js +5 -12
  607. package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
  608. package/dist/utilities/filterDataToSelectedLocales.spec.js +1 -2
  609. package/dist/utilities/filterDataToSelectedLocales.spec.js.map +1 -1
  610. package/dist/utilities/flattenAllFields.d.ts.map +1 -1
  611. package/dist/utilities/flattenAllFields.js +7 -22
  612. package/dist/utilities/flattenAllFields.js.map +1 -1
  613. package/dist/utilities/formatAdminURL.d.ts.map +1 -1
  614. package/dist/utilities/formatErrors.d.ts.map +1 -1
  615. package/dist/utilities/formatErrors.js +3 -1
  616. package/dist/utilities/formatErrors.js.map +1 -1
  617. package/dist/utilities/formatLabels.d.ts.map +1 -1
  618. package/dist/utilities/getBestFitFromSizes.d.ts.map +1 -1
  619. package/dist/utilities/getBlockSelect.d.ts.map +1 -1
  620. package/dist/utilities/getDataByPath.d.ts.map +1 -1
  621. package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
  622. package/dist/utilities/getEntityPermissions/getEntityPermissions.js +2 -0
  623. package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
  624. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts +7 -1
  625. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts.map +1 -1
  626. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js +24 -7
  627. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
  628. package/dist/utilities/getFieldByPath.d.ts.map +1 -1
  629. package/dist/utilities/getFieldByPath.js +1 -1
  630. package/dist/utilities/getFieldByPath.js.map +1 -1
  631. package/dist/utilities/getFieldPermissions.d.ts.map +1 -1
  632. package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
  633. package/dist/utilities/getRequestEntity.d.ts.map +1 -1
  634. package/dist/utilities/getRequestLanguage.d.ts +2 -2
  635. package/dist/utilities/getRequestLanguage.d.ts.map +1 -1
  636. package/dist/utilities/getRequestLanguage.js.map +1 -1
  637. package/dist/utilities/getRequestOrigin.d.ts +2 -2
  638. package/dist/utilities/getRequestOrigin.d.ts.map +1 -1
  639. package/dist/utilities/getSafeRedirect.d.ts.map +1 -1
  640. package/dist/utilities/getSelectMode.d.ts.map +1 -1
  641. package/dist/utilities/getSiblingData.d.ts.map +1 -1
  642. package/dist/utilities/getTranslatedLabel.d.ts.map +1 -1
  643. package/dist/utilities/getVersionsConfig.d.ts +1 -1
  644. package/dist/utilities/getVersionsConfig.d.ts.map +1 -1
  645. package/dist/utilities/getVersionsConfig.js.map +1 -1
  646. package/dist/utilities/handleEndpoints.d.ts.map +1 -1
  647. package/dist/utilities/handleEndpoints.js +7 -3
  648. package/dist/utilities/handleEndpoints.js.map +1 -1
  649. package/dist/utilities/headersWithCors.d.ts.map +1 -1
  650. package/dist/utilities/isEntityHidden.d.ts +2 -2
  651. package/dist/utilities/isEntityHidden.d.ts.map +1 -1
  652. package/dist/utilities/isURLAllowed.d.ts.map +1 -1
  653. package/dist/utilities/isURLAllowed.js +9 -3
  654. package/dist/utilities/isURLAllowed.js.map +1 -1
  655. package/dist/utilities/isURLAllowed.spec.js +78 -0
  656. package/dist/utilities/isURLAllowed.spec.js.map +1 -0
  657. package/dist/utilities/isValidID.d.ts +1 -1
  658. package/dist/utilities/isValidID.d.ts.map +1 -1
  659. package/dist/utilities/logError.d.ts.map +1 -1
  660. package/dist/utilities/logger.d.ts +1 -1
  661. package/dist/utilities/logger.d.ts.map +1 -1
  662. package/dist/utilities/mergeHeaders.d.ts.map +1 -1
  663. package/dist/utilities/mergeListSearchAndWhere.d.ts.map +1 -1
  664. package/dist/utilities/mergeLocalizedData.d.ts +14 -4
  665. package/dist/utilities/mergeLocalizedData.d.ts.map +1 -1
  666. package/dist/utilities/mergeLocalizedData.js +54 -46
  667. package/dist/utilities/mergeLocalizedData.js.map +1 -1
  668. package/dist/utilities/mergeLocalizedData.spec.js +23 -23
  669. package/dist/utilities/mergeLocalizedData.spec.js.map +1 -1
  670. package/dist/utilities/miniChalk.d.ts.map +1 -1
  671. package/dist/utilities/optionsAreEqual.d.ts.map +1 -1
  672. package/dist/utilities/parseBooleanString.d.ts.map +1 -1
  673. package/dist/utilities/parseCookies.d.ts +1 -1
  674. package/dist/utilities/parseCookies.d.ts.map +1 -1
  675. package/dist/utilities/parseParams/index.d.ts +2 -5
  676. package/dist/utilities/parseParams/index.d.ts.map +1 -1
  677. package/dist/utilities/parseParams/index.js.map +1 -1
  678. package/dist/utilities/parseParams/index.spec.js +0 -9
  679. package/dist/utilities/parseParams/index.spec.js.map +1 -1
  680. package/dist/utilities/profiling.d.ts.map +1 -1
  681. package/dist/utilities/reduceFieldsToValues.d.ts.map +1 -1
  682. package/dist/utilities/resolveSelect.d.ts.map +1 -1
  683. package/dist/utilities/routeError.d.ts.map +1 -1
  684. package/dist/utilities/sanitizeFallbackLocale.d.ts.map +1 -1
  685. package/dist/utilities/sanitizeInternalFields.d.ts.map +1 -1
  686. package/dist/utilities/sanitizeJoinParams.d.ts.map +1 -1
  687. package/dist/utilities/sanitizePopulateParam.d.ts.map +1 -1
  688. package/dist/utilities/sanitizeSelect.d.ts.map +1 -1
  689. package/dist/utilities/sanitizeSelectParam.d.ts.map +1 -1
  690. package/dist/utilities/sanitizeSortParams.d.ts.map +1 -1
  691. package/dist/utilities/setsAreEqual.d.ts.map +1 -1
  692. package/dist/utilities/slugify.d.ts.map +1 -1
  693. package/dist/utilities/stripUnselectedFields.d.ts.map +1 -1
  694. package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
  695. package/dist/utilities/telemetry/events/adminInit.d.ts.map +1 -1
  696. package/dist/utilities/telemetry/events/adminInit.js +2 -3
  697. package/dist/utilities/telemetry/events/adminInit.js.map +1 -1
  698. package/dist/utilities/telemetry/events/serverInit.d.ts.map +1 -1
  699. package/dist/utilities/telemetry/events/serverInit.js +2 -3
  700. package/dist/utilities/telemetry/events/serverInit.js.map +1 -1
  701. package/dist/utilities/telemetry/index.d.ts +15 -4
  702. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  703. package/dist/utilities/telemetry/index.js +6 -1
  704. package/dist/utilities/telemetry/index.js.map +1 -1
  705. package/dist/utilities/telemetry/index.spec.js +43 -0
  706. package/dist/utilities/telemetry/index.spec.js.map +1 -0
  707. package/dist/utilities/telemetry/oneWayHash.d.ts.map +1 -1
  708. package/dist/utilities/timestamp.d.ts.map +1 -1
  709. package/dist/utilities/toKebabCase.d.ts.map +1 -1
  710. package/dist/utilities/transformColumnPreferences.d.ts.map +1 -1
  711. package/dist/utilities/transformColumnPreferences.js +4 -2
  712. package/dist/utilities/transformColumnPreferences.js.map +1 -1
  713. package/dist/utilities/transformWhereQuery.d.ts.map +1 -1
  714. package/dist/utilities/traverseFields.d.ts.map +1 -1
  715. package/dist/utilities/traverseFields.js +2 -4
  716. package/dist/utilities/traverseFields.js.map +1 -1
  717. package/dist/utilities/traverseForLocalizedFields.d.ts.map +1 -1
  718. package/dist/utilities/traverseForLocalizedFields.js +3 -0
  719. package/dist/utilities/traverseForLocalizedFields.js.map +1 -1
  720. package/dist/utilities/unflatten.d.ts.map +1 -1
  721. package/dist/utilities/validateMimeType.d.ts.map +1 -1
  722. package/dist/utilities/validateTimezones.d.ts.map +1 -1
  723. package/dist/utilities/validateWhereQuery.d.ts.map +1 -1
  724. package/dist/utilities/wordBoundariesRegex.d.ts.map +1 -1
  725. package/dist/utilities/wrapInternalEndpoints.d.ts.map +1 -1
  726. package/dist/versions/baseFields.d.ts +1 -2
  727. package/dist/versions/baseFields.d.ts.map +1 -1
  728. package/dist/versions/baseFields.js +0 -13
  729. package/dist/versions/baseFields.js.map +1 -1
  730. package/dist/versions/buildCollectionFields.d.ts.map +1 -1
  731. package/dist/versions/buildCollectionFields.js +0 -2
  732. package/dist/versions/buildCollectionFields.js.map +1 -1
  733. package/dist/versions/buildGlobalFields.d.ts.map +1 -1
  734. package/dist/versions/buildGlobalFields.js +0 -2
  735. package/dist/versions/buildGlobalFields.js.map +1 -1
  736. package/dist/versions/buildSingleLocalePublishData.d.ts +32 -0
  737. package/dist/versions/buildSingleLocalePublishData.d.ts.map +1 -0
  738. package/dist/versions/buildSingleLocalePublishData.js +37 -0
  739. package/dist/versions/buildSingleLocalePublishData.js.map +1 -0
  740. package/dist/versions/buildVersionCompoundIndexes.d.ts.map +1 -1
  741. package/dist/versions/defaults.d.ts.map +1 -1
  742. package/dist/versions/deleteCollectionVersions.d.ts.map +1 -1
  743. package/dist/versions/deleteScheduledPublishJobs.d.ts.map +1 -1
  744. package/dist/versions/drafts/appendVersionToQueryKey.d.ts.map +1 -1
  745. package/dist/versions/drafts/getQueryDraftsSelect.d.ts.map +1 -1
  746. package/dist/versions/drafts/getQueryDraftsSort.d.ts.map +1 -1
  747. package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
  748. package/dist/versions/enforceMaxVersions.d.ts.map +1 -1
  749. package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
  750. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  751. package/dist/versions/migrations/localizeStatus/shared.d.ts.map +1 -1
  752. package/dist/versions/payloadPackageList.d.ts.map +1 -1
  753. package/dist/versions/payloadPackageList.js +0 -1
  754. package/dist/versions/payloadPackageList.js.map +1 -1
  755. package/dist/versions/saveVersion.d.ts +0 -2
  756. package/dist/versions/saveVersion.d.ts.map +1 -1
  757. package/dist/versions/saveVersion.js +12 -17
  758. package/dist/versions/saveVersion.js.map +1 -1
  759. package/dist/versions/schedule/job.d.ts.map +1 -1
  760. package/dist/versions/schedule/job.js +6 -10
  761. package/dist/versions/schedule/job.js.map +1 -1
  762. package/dist/versions/types.d.ts +2 -15
  763. package/dist/versions/types.d.ts.map +1 -1
  764. package/dist/versions/types.js.map +1 -1
  765. package/package.json +9 -6
  766. package/dist/database/migrations/templates/localizeStatus.d.ts +0 -10
  767. package/dist/database/migrations/templates/localizeStatus.d.ts.map +0 -1
  768. package/dist/database/migrations/templates/localizeStatus.js +0 -54
  769. package/dist/database/migrations/templates/localizeStatus.js.map +0 -1
  770. package/dist/fields/baseFields/slug/index.d.ts +0 -89
  771. package/dist/fields/baseFields/slug/index.d.ts.map +0 -1
  772. package/dist/fields/baseFields/slug/index.js +0 -81
  773. package/dist/fields/baseFields/slug/index.js.map +0 -1
  774. package/dist/versions/migrations/localizeStatus/index.d.ts +0 -12
  775. package/dist/versions/migrations/localizeStatus/index.d.ts.map +0 -1
  776. package/dist/versions/migrations/localizeStatus/index.js +0 -33
  777. package/dist/versions/migrations/localizeStatus/index.js.map +0 -1
  778. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts +0 -9
  779. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts.map +0 -1
  780. package/dist/versions/migrations/localizeStatus/mongo/down.js +0 -112
  781. package/dist/versions/migrations/localizeStatus/mongo/down.js.map +0 -1
  782. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts +0 -8
  783. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts.map +0 -1
  784. package/dist/versions/migrations/localizeStatus/mongo/index.js +0 -8
  785. package/dist/versions/migrations/localizeStatus/mongo/index.js.map +0 -1
  786. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts +0 -9
  787. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts.map +0 -1
  788. package/dist/versions/migrations/localizeStatus/mongo/up.js +0 -220
  789. package/dist/versions/migrations/localizeStatus/mongo/up.js.map +0 -1
  790. package/dist/versions/migrations/localizeStatus/sql/down.d.ts +0 -11
  791. package/dist/versions/migrations/localizeStatus/sql/down.d.ts.map +0 -1
  792. package/dist/versions/migrations/localizeStatus/sql/down.js +0 -213
  793. package/dist/versions/migrations/localizeStatus/sql/down.js.map +0 -1
  794. package/dist/versions/migrations/localizeStatus/sql/index.d.ts +0 -8
  795. package/dist/versions/migrations/localizeStatus/sql/index.d.ts.map +0 -1
  796. package/dist/versions/migrations/localizeStatus/sql/index.js +0 -8
  797. package/dist/versions/migrations/localizeStatus/sql/index.js.map +0 -1
  798. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts +0 -13
  799. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts.map +0 -1
  800. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js +0 -51
  801. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js.map +0 -1
  802. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts +0 -13
  803. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts.map +0 -1
  804. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js +0 -54
  805. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js.map +0 -1
  806. package/dist/versions/migrations/localizeStatus/sql/up.d.ts +0 -11
  807. package/dist/versions/migrations/localizeStatus/sql/up.d.ts.map +0 -1
  808. package/dist/versions/migrations/localizeStatus/sql/up.js +0 -277
  809. package/dist/versions/migrations/localizeStatus/sql/up.js.map +0 -1
  810. package/dist/versions/saveSnapshot.d.ts +0 -18
  811. package/dist/versions/saveSnapshot.d.ts.map +0 -1
  812. package/dist/versions/saveSnapshot.js +0 -38
  813. package/dist/versions/saveSnapshot.js.map +0 -1
@@ -4,8 +4,10 @@ import { APIError } from '../../errors/index.js';
4
4
  import { sanitizeField } from '../../fields/config/sanitize.js';
5
5
  import { combineWhereConstraints } from '../../utilities/combineWhereConstraints.js';
6
6
  import { commitTransaction } from '../../utilities/commitTransaction.js';
7
+ import { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js';
7
8
  import { initTransaction } from '../../utilities/initTransaction.js';
8
9
  import { killTransaction } from '../../utilities/killTransaction.js';
10
+ import { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion.js';
9
11
  import { generateKeyBetween, generateNKeysBetween } from './fractional-indexing.js';
10
12
  import { getJoinScopeContext } from './utils/getJoinScopeContext.js';
11
13
  import { getJoinScopeWhereFromDocData } from './utils/getJoinScopeWhereFromDocData.js';
@@ -255,8 +257,28 @@ export const addOrderableEndpoint = (config, joinFieldPathsByCollection)=>{
255
257
  // Currently N (= docsToMove.length) is always 1. Maybe in the future we will
256
258
  // allow dragging and reordering multiple documents at once via the UI.
257
259
  const orderValues = newKeyWillBe === 'greater' ? generateNKeysBetween(targetKey, adjacentDocKey, docsToMove.length) : generateNKeysBetween(adjacentDocKey, targetKey, docsToMove.length);
260
+ const draftsEnabled = hasDraftsEnabled(collection);
258
261
  // Update each document with its new order value
259
262
  for (const [index, id] of docsToMove.entries()){
263
+ let draft;
264
+ if (draftsEnabled) {
265
+ const latestVersion = await getLatestCollectionVersion({
266
+ id,
267
+ config: collection,
268
+ payload: req.payload,
269
+ query: {
270
+ collection: collection.slug,
271
+ req,
272
+ where: {
273
+ id: {
274
+ equals: id
275
+ }
276
+ }
277
+ },
278
+ req
279
+ });
280
+ draft = latestVersion?._status === 'draft';
281
+ }
260
282
  await req.payload.update({
261
283
  id,
262
284
  collection: collection.slug,
@@ -264,6 +286,7 @@ export const addOrderableEndpoint = (config, joinFieldPathsByCollection)=>{
264
286
  [orderableFieldName]: orderValues[index]
265
287
  },
266
288
  depth: 0,
289
+ draft,
267
290
  req
268
291
  });
269
292
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/config/orderable/index.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { BeforeChangeHook, CollectionConfig } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { Field, TextField } from '../../fields/config/types.js'\nimport type { Endpoint, PayloadHandler, SanitizedConfig } from '../types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { APIError } from '../../errors/index.js'\nimport { sanitizeField } from '../../fields/config/sanitize.js'\nimport { combineWhereConstraints } from '../../utilities/combineWhereConstraints.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { generateKeyBetween, generateNKeysBetween } from './fractional-indexing.js'\nimport { getJoinScopeContext } from './utils/getJoinScopeContext.js'\nimport { getJoinScopeWhereFromDocData } from './utils/getJoinScopeWhereFromDocData.js'\nimport { resolvePendingTargetKey } from './utils/resolvePendingTargetKey.js'\n\nexport const addOrderableFieldsAndHook = async (\n collection: CollectionConfig,\n config: Config,\n orderableFieldNames: string[],\n joinFieldPathsByCollection?: Map<string, Map<string, string>>,\n) => {\n // 1. Add fields\n for (const orderableFieldName of orderableFieldNames) {\n const orderField: TextField = {\n name: orderableFieldName,\n type: 'text',\n admin: {\n disabled: true,\n hidden: true,\n readOnly: true,\n },\n hooks: {\n beforeDuplicate: [\n ({ siblingData }) => {\n delete siblingData[orderableFieldName]\n },\n ],\n },\n index: true,\n }\n\n // Sanitize the field using the standard sanitization logic\n await sanitizeField({\n collectionConfig: collection,\n config,\n existingFieldNames: new Set(),\n field: orderField,\n index: 0,\n isTopLevelField: true,\n joinPath: '',\n parentIndexPath: '',\n parentIsLocalized: false,\n parentSchemaPath: '',\n requireFieldLevelRichTextEditor: false,\n validRelationships: null,\n })\n\n collection.fields.unshift(orderField)\n }\n\n // 2. Add hook\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks.beforeChange) {\n collection.hooks.beforeChange = []\n }\n\n const orderBeforeChangeHook: BeforeChangeHook = async ({ data, originalDoc, req }) => {\n for (const orderableFieldName of orderableFieldNames) {\n if (!data[orderableFieldName] && !originalDoc?.[orderableFieldName]) {\n const joinScopeWhere = getJoinScopeWhereFromDocData({\n collectionSlug: collection.slug,\n data,\n joinFieldPathsByCollection,\n orderableFieldName,\n originalDoc,\n })\n\n const lastDoc = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 1,\n pagination: false,\n req,\n select: { [orderableFieldName]: true },\n sort: `-${orderableFieldName}`,\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n exists: true,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n\n const lastOrderValue = lastDoc.docs[0]?.[orderableFieldName] || null\n data[orderableFieldName] = generateKeyBetween(lastOrderValue, null)\n }\n }\n\n return data\n }\n\n collection.hooks.beforeChange.push(orderBeforeChangeHook)\n}\n\n/**\n * The body of the reorder endpoint.\n * @internal\n */\nexport type OrderableEndpointBody = {\n collectionSlug: string\n docsToMove: string[]\n newKeyWillBe: 'greater' | 'less'\n orderableFieldName: string\n target: {\n id: string\n key: string\n }\n}\n\nexport const addOrderableEndpoint = (\n config: SanitizedConfig,\n joinFieldPathsByCollection: Map<string, Map<string, string>>,\n) => {\n // 3. Add endpoint\n const reorderHandler: PayloadHandler = async (req) => {\n const body = (await req.json?.()) as OrderableEndpointBody\n\n const { collectionSlug, docsToMove, newKeyWillBe, orderableFieldName, target } = body\n\n if (!Array.isArray(docsToMove) || docsToMove.length === 0) {\n return new Response(JSON.stringify({ error: 'docsToMove must be a non-empty array' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n if (newKeyWillBe !== 'greater' && newKeyWillBe !== 'less') {\n return new Response(JSON.stringify({ error: 'newKeyWillBe must be \"greater\" or \"less\"' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n const collection = config.collections.find((c) => c.slug === collectionSlug)\n if (!collection) {\n return new Response(JSON.stringify({ error: `Collection ${collectionSlug} not found` }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n if (typeof orderableFieldName !== 'string') {\n return new Response(JSON.stringify({ error: 'orderableFieldName must be a string' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n\n const { joinScopeWhere, targetDoc } = await getJoinScopeContext({\n collectionSlug: collection.slug,\n joinFieldPathsByCollection,\n orderableFieldName,\n req,\n target,\n })\n\n // Prevent reordering if user doesn't have editing permissions\n if (collection.access?.update) {\n await executeAccess(\n {\n // Currently only one doc can be moved at a time. We should review this if we want to allow\n // multiple docs to be moved at once in the future.\n id: docsToMove[0],\n data: {},\n req,\n },\n collection.access.update,\n )\n }\n /**\n * If there is no target.key, we can assume the user enabled `orderable`\n * on a collection with existing documents, and that this is the first\n * time they tried to reorder them. Therefore, we perform a one-time\n * migration by setting the key value for all documents. We do this\n * instead of enforcing `required` and `unique` at the database schema\n * level, so that users don't have to run a migration when they enable\n * `orderable` on a collection with existing documents.\n */\n if (!target.key) {\n const { docs } = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 0,\n req,\n select: { [orderableFieldName]: true },\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n exists: false,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n await initTransaction(req)\n // We cannot update all documents in a single operation with `payload.update`,\n // because they would all end up with the same order key (`a0`).\n try {\n for (const doc of docs) {\n await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: {\n // no data needed since the order hooks will handle this\n },\n depth: 0,\n req,\n })\n await commitTransaction(req)\n }\n } catch (e) {\n await killTransaction(req)\n if (e instanceof Error) {\n throw new APIError(e.message, httpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n return new Response(JSON.stringify({ message: 'initial migration', success: true }), {\n headers: { 'Content-Type': 'application/json' },\n status: 200,\n })\n }\n\n if (\n typeof target !== 'object' ||\n typeof target.id === 'undefined' ||\n typeof target.key !== 'string'\n ) {\n return new Response(JSON.stringify({ error: 'target must be an object with id' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n\n const targetId = target.id\n const targetKey = await resolvePendingTargetKey({\n collectionSlug: collection.slug,\n orderableFieldName,\n req,\n targetDoc,\n targetID: targetId,\n targetKey: target.key,\n })\n\n // The reason the endpoint does not receive this docId as an argument is that there\n // are situations where the user may not see or know what the next or previous one is. For\n // example, access control restrictions, if docBefore is the last one on the page, etc.\n const adjacentDoc = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 1,\n pagination: false,\n select: { [orderableFieldName]: true },\n sort: newKeyWillBe === 'greater' ? orderableFieldName : `-${orderableFieldName}`,\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n [newKeyWillBe === 'greater' ? 'greater_than' : 'less_than']: targetKey,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n const adjacentDocKey = adjacentDoc.docs?.[0]?.[orderableFieldName] || null\n\n // Currently N (= docsToMove.length) is always 1. Maybe in the future we will\n // allow dragging and reordering multiple documents at once via the UI.\n const orderValues =\n newKeyWillBe === 'greater'\n ? generateNKeysBetween(targetKey, adjacentDocKey, docsToMove.length)\n : generateNKeysBetween(adjacentDocKey, targetKey, docsToMove.length)\n\n // Update each document with its new order value\n for (const [index, id] of docsToMove.entries()) {\n await req.payload.update({\n id,\n collection: collection.slug,\n data: {\n [orderableFieldName]: orderValues[index],\n },\n depth: 0,\n req,\n })\n }\n\n return new Response(JSON.stringify({ orderValues, success: true }), {\n headers: { 'Content-Type': 'application/json' },\n status: 200,\n })\n }\n\n const reorderEndpoint: Endpoint = {\n handler: reorderHandler,\n method: 'post',\n path: '/reorder',\n }\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n config.endpoints.push(reorderEndpoint)\n}\n"],"names":["status","httpStatus","executeAccess","APIError","sanitizeField","combineWhereConstraints","commitTransaction","initTransaction","killTransaction","generateKeyBetween","generateNKeysBetween","getJoinScopeContext","getJoinScopeWhereFromDocData","resolvePendingTargetKey","addOrderableFieldsAndHook","collection","config","orderableFieldNames","joinFieldPathsByCollection","orderableFieldName","orderField","name","type","admin","disabled","hidden","readOnly","hooks","beforeDuplicate","siblingData","index","collectionConfig","existingFieldNames","Set","field","isTopLevelField","joinPath","parentIndexPath","parentIsLocalized","parentSchemaPath","requireFieldLevelRichTextEditor","validRelationships","fields","unshift","beforeChange","orderBeforeChangeHook","data","originalDoc","req","joinScopeWhere","collectionSlug","slug","lastDoc","payload","find","depth","limit","pagination","select","sort","where","exists","undefined","lastOrderValue","docs","push","addOrderableEndpoint","reorderHandler","body","json","docsToMove","newKeyWillBe","target","Array","isArray","length","Response","JSON","stringify","error","headers","collections","c","targetDoc","access","update","id","key","doc","e","Error","message","INTERNAL_SERVER_ERROR","success","targetId","targetKey","targetID","adjacentDoc","adjacentDocKey","orderValues","entries","reorderEndpoint","handler","method","path","endpoints"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/config/orderable/index.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { BeforeChangeHook, CollectionConfig } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { Field, TextField } from '../../fields/config/types.js'\nimport type { Endpoint, PayloadHandler, SanitizedConfig } from '../types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { APIError } from '../../errors/index.js'\nimport { sanitizeField } from '../../fields/config/sanitize.js'\nimport { combineWhereConstraints } from '../../utilities/combineWhereConstraints.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion.js'\nimport { generateKeyBetween, generateNKeysBetween } from './fractional-indexing.js'\nimport { getJoinScopeContext } from './utils/getJoinScopeContext.js'\nimport { getJoinScopeWhereFromDocData } from './utils/getJoinScopeWhereFromDocData.js'\nimport { resolvePendingTargetKey } from './utils/resolvePendingTargetKey.js'\n\nexport const addOrderableFieldsAndHook = async (\n collection: CollectionConfig,\n config: Config,\n orderableFieldNames: string[],\n joinFieldPathsByCollection?: Map<string, Map<string, string>>,\n) => {\n // 1. Add fields\n for (const orderableFieldName of orderableFieldNames) {\n const orderField: TextField = {\n name: orderableFieldName,\n type: 'text',\n admin: {\n disabled: true,\n hidden: true,\n readOnly: true,\n },\n hooks: {\n beforeDuplicate: [\n ({ siblingData }) => {\n delete siblingData[orderableFieldName]\n },\n ],\n },\n index: true,\n }\n\n // Sanitize the field using the standard sanitization logic\n await sanitizeField({\n collectionConfig: collection,\n config,\n existingFieldNames: new Set(),\n field: orderField,\n index: 0,\n isTopLevelField: true,\n joinPath: '',\n parentIndexPath: '',\n parentIsLocalized: false,\n parentSchemaPath: '',\n requireFieldLevelRichTextEditor: false,\n validRelationships: null,\n })\n\n collection.fields.unshift(orderField)\n }\n\n // 2. Add hook\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks.beforeChange) {\n collection.hooks.beforeChange = []\n }\n\n const orderBeforeChangeHook: BeforeChangeHook = async ({ data, originalDoc, req }) => {\n for (const orderableFieldName of orderableFieldNames) {\n if (!data[orderableFieldName] && !originalDoc?.[orderableFieldName]) {\n const joinScopeWhere = getJoinScopeWhereFromDocData({\n collectionSlug: collection.slug,\n data,\n joinFieldPathsByCollection,\n orderableFieldName,\n originalDoc,\n })\n\n const lastDoc = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 1,\n pagination: false,\n req,\n select: { [orderableFieldName]: true },\n sort: `-${orderableFieldName}`,\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n exists: true,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n\n const lastOrderValue = lastDoc.docs[0]?.[orderableFieldName] || null\n data[orderableFieldName] = generateKeyBetween(lastOrderValue, null)\n }\n }\n\n return data\n }\n\n collection.hooks.beforeChange.push(orderBeforeChangeHook)\n}\n\n/**\n * The body of the reorder endpoint.\n * @internal\n */\nexport type OrderableEndpointBody = {\n collectionSlug: string\n docsToMove: string[]\n newKeyWillBe: 'greater' | 'less'\n orderableFieldName: string\n target: {\n id: string\n key: string\n }\n}\n\nexport const addOrderableEndpoint = (\n config: SanitizedConfig,\n joinFieldPathsByCollection: Map<string, Map<string, string>>,\n) => {\n // 3. Add endpoint\n const reorderHandler: PayloadHandler = async (req) => {\n const body = (await req.json?.()) as OrderableEndpointBody\n\n const { collectionSlug, docsToMove, newKeyWillBe, orderableFieldName, target } = body\n\n if (!Array.isArray(docsToMove) || docsToMove.length === 0) {\n return new Response(JSON.stringify({ error: 'docsToMove must be a non-empty array' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n if (newKeyWillBe !== 'greater' && newKeyWillBe !== 'less') {\n return new Response(JSON.stringify({ error: 'newKeyWillBe must be \"greater\" or \"less\"' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n const collection = config.collections.find((c) => c.slug === collectionSlug)\n if (!collection) {\n return new Response(JSON.stringify({ error: `Collection ${collectionSlug} not found` }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n if (typeof orderableFieldName !== 'string') {\n return new Response(JSON.stringify({ error: 'orderableFieldName must be a string' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n\n const { joinScopeWhere, targetDoc } = await getJoinScopeContext({\n collectionSlug: collection.slug,\n joinFieldPathsByCollection,\n orderableFieldName,\n req,\n target,\n })\n\n // Prevent reordering if user doesn't have editing permissions\n if (collection.access?.update) {\n await executeAccess(\n {\n // Currently only one doc can be moved at a time. We should review this if we want to allow\n // multiple docs to be moved at once in the future.\n id: docsToMove[0],\n data: {},\n req,\n },\n collection.access.update,\n )\n }\n /**\n * If there is no target.key, we can assume the user enabled `orderable`\n * on a collection with existing documents, and that this is the first\n * time they tried to reorder them. Therefore, we perform a one-time\n * migration by setting the key value for all documents. We do this\n * instead of enforcing `required` and `unique` at the database schema\n * level, so that users don't have to run a migration when they enable\n * `orderable` on a collection with existing documents.\n */\n if (!target.key) {\n const { docs } = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 0,\n req,\n select: { [orderableFieldName]: true },\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n exists: false,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n await initTransaction(req)\n // We cannot update all documents in a single operation with `payload.update`,\n // because they would all end up with the same order key (`a0`).\n try {\n for (const doc of docs) {\n await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: {\n // no data needed since the order hooks will handle this\n },\n depth: 0,\n req,\n })\n await commitTransaction(req)\n }\n } catch (e) {\n await killTransaction(req)\n if (e instanceof Error) {\n throw new APIError(e.message, httpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n return new Response(JSON.stringify({ message: 'initial migration', success: true }), {\n headers: { 'Content-Type': 'application/json' },\n status: 200,\n })\n }\n\n if (\n typeof target !== 'object' ||\n typeof target.id === 'undefined' ||\n typeof target.key !== 'string'\n ) {\n return new Response(JSON.stringify({ error: 'target must be an object with id' }), {\n headers: { 'Content-Type': 'application/json' },\n status: 400,\n })\n }\n\n const targetId = target.id\n const targetKey = await resolvePendingTargetKey({\n collectionSlug: collection.slug,\n orderableFieldName,\n req,\n targetDoc,\n targetID: targetId,\n targetKey: target.key,\n })\n\n // The reason the endpoint does not receive this docId as an argument is that there\n // are situations where the user may not see or know what the next or previous one is. For\n // example, access control restrictions, if docBefore is the last one on the page, etc.\n const adjacentDoc = await req.payload.find({\n collection: collection.slug,\n depth: 0,\n limit: 1,\n pagination: false,\n select: { [orderableFieldName]: true },\n sort: newKeyWillBe === 'greater' ? orderableFieldName : `-${orderableFieldName}`,\n where: combineWhereConstraints([\n {\n [orderableFieldName]: {\n [newKeyWillBe === 'greater' ? 'greater_than' : 'less_than']: targetKey,\n },\n },\n joinScopeWhere ?? undefined,\n ]),\n })\n const adjacentDocKey = adjacentDoc.docs?.[0]?.[orderableFieldName] || null\n\n // Currently N (= docsToMove.length) is always 1. Maybe in the future we will\n // allow dragging and reordering multiple documents at once via the UI.\n const orderValues =\n newKeyWillBe === 'greater'\n ? generateNKeysBetween(targetKey, adjacentDocKey, docsToMove.length)\n : generateNKeysBetween(adjacentDocKey, targetKey, docsToMove.length)\n\n const draftsEnabled = hasDraftsEnabled(collection)\n\n // Update each document with its new order value\n for (const [index, id] of docsToMove.entries()) {\n let draft: boolean | undefined\n\n if (draftsEnabled) {\n const latestVersion = await getLatestCollectionVersion({\n id,\n config: collection,\n payload: req.payload,\n query: {\n collection: collection.slug,\n req,\n where: { id: { equals: id } },\n },\n req,\n })\n\n draft = latestVersion?._status === 'draft'\n }\n\n await req.payload.update({\n id,\n collection: collection.slug,\n data: {\n [orderableFieldName]: orderValues[index],\n },\n depth: 0,\n draft,\n req,\n })\n }\n\n return new Response(JSON.stringify({ orderValues, success: true }), {\n headers: { 'Content-Type': 'application/json' },\n status: 200,\n })\n }\n\n const reorderEndpoint: Endpoint = {\n handler: reorderHandler,\n method: 'post',\n path: '/reorder',\n }\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n config.endpoints.push(reorderEndpoint)\n}\n"],"names":["status","httpStatus","executeAccess","APIError","sanitizeField","combineWhereConstraints","commitTransaction","hasDraftsEnabled","initTransaction","killTransaction","getLatestCollectionVersion","generateKeyBetween","generateNKeysBetween","getJoinScopeContext","getJoinScopeWhereFromDocData","resolvePendingTargetKey","addOrderableFieldsAndHook","collection","config","orderableFieldNames","joinFieldPathsByCollection","orderableFieldName","orderField","name","type","admin","disabled","hidden","readOnly","hooks","beforeDuplicate","siblingData","index","collectionConfig","existingFieldNames","Set","field","isTopLevelField","joinPath","parentIndexPath","parentIsLocalized","parentSchemaPath","requireFieldLevelRichTextEditor","validRelationships","fields","unshift","beforeChange","orderBeforeChangeHook","data","originalDoc","req","joinScopeWhere","collectionSlug","slug","lastDoc","payload","find","depth","limit","pagination","select","sort","where","exists","undefined","lastOrderValue","docs","push","addOrderableEndpoint","reorderHandler","body","json","docsToMove","newKeyWillBe","target","Array","isArray","length","Response","JSON","stringify","error","headers","collections","c","targetDoc","access","update","id","key","doc","e","Error","message","INTERNAL_SERVER_ERROR","success","targetId","targetKey","targetID","adjacentDoc","adjacentDocKey","orderValues","draftsEnabled","entries","draft","latestVersion","query","equals","_status","reorderEndpoint","handler","method","path","endpoints"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/config/sanitize.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,MAAM,EAGN,eAAe,EAIhB,MAAM,YAAY,CAAA;AA+FnB,eAAO,MAAM,cAAc,GAAU,gBAAgB,MAAM,KAAG,OAAO,CAAC,eAAe,CAgYpF,CAAA"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/config/sanitize.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,MAAM,EAIN,eAAe,EAIhB,MAAM,YAAY,CAAA;AAiOnB,eAAO,MAAM,cAAc,mBAA0B,MAAM,KAAG,OAAO,CAAC,eAAe,CAsYpF,CAAA"}
@@ -32,19 +32,6 @@ const sanitizeAdminConfig = (configToSanitize)=>{
32
32
  ValidationError: 'info',
33
33
  ...sanitizedConfig.loggingLevels || {}
34
34
  };
35
- (sanitizedConfig.admin.dashboard ??= {
36
- widgets: []
37
- }).widgets.push({
38
- slug: 'collections',
39
- Component: '@payloadcms/ui/rsc#CollectionCards',
40
- minWidth: 'full'
41
- });
42
- sanitizedConfig.admin.dashboard.defaultLayout ??= [
43
- {
44
- widgetSlug: 'collections',
45
- width: 'full'
46
- }
47
- ];
48
35
  // add default user collection if none provided
49
36
  if (!sanitizedConfig?.admin?.user) {
50
37
  const firstCollectionWithAuth = sanitizedConfig.collections.find(({ auth })=>Boolean(auth));
@@ -79,6 +66,138 @@ const sanitizeAdminConfig = (configToSanitize)=>{
79
66
  });
80
67
  return sanitizedConfig;
81
68
  };
69
+ const addDefaultDashboardWidgets = async ({ config, richTextSanitizationPromises, validRelationships })=>{
70
+ const collectionQueryFields = [
71
+ {
72
+ name: 'title',
73
+ type: 'text',
74
+ label: ({ t })=>t('dashboard:widgetTitleLabel')
75
+ },
76
+ {
77
+ name: 'relatedCollection',
78
+ type: 'select',
79
+ label: ({ t })=>t('general:collection'),
80
+ // Only offer collections that are visible in the admin UI. Collections hidden via a function
81
+ // are kept since they may still be visible for some users.
82
+ options: (config.collections ?? []).filter((collection)=>collection.admin?.hidden !== true).map((collection)=>({
83
+ label: collection.labels?.plural || collection.slug,
84
+ value: collection.slug
85
+ })),
86
+ required: true
87
+ },
88
+ {
89
+ name: 'where',
90
+ type: 'json',
91
+ admin: {
92
+ components: {
93
+ Field: '@payloadcms/ui#QueryPresetsWhereField'
94
+ }
95
+ },
96
+ label: ({ t })=>t('general:filters')
97
+ },
98
+ {
99
+ name: 'sortField',
100
+ type: 'text',
101
+ admin: {
102
+ components: {
103
+ Field: '@payloadcms/ui#CollectionQuerySortField'
104
+ }
105
+ },
106
+ label: ({ t })=>t('dashboard:widgetSortFieldLabel')
107
+ },
108
+ {
109
+ name: 'sortDirection',
110
+ type: 'select',
111
+ defaultValue: 'desc',
112
+ label: ({ t })=>t('dashboard:widgetSortDirectionLabel'),
113
+ options: [
114
+ {
115
+ label: ({ t })=>t('general:ascending'),
116
+ value: 'asc'
117
+ },
118
+ {
119
+ label: ({ t })=>t('general:descending'),
120
+ value: 'desc'
121
+ }
122
+ ]
123
+ },
124
+ {
125
+ name: 'limit',
126
+ type: 'number',
127
+ defaultValue: 5,
128
+ label: ({ t })=>t('dashboard:widgetLimitLabel'),
129
+ max: 25,
130
+ min: 1
131
+ }
132
+ ];
133
+ const recentlyViewedFields = [
134
+ {
135
+ name: 'excludedCollections',
136
+ type: 'select',
137
+ admin: {
138
+ components: {
139
+ // Presents an inclusion filter (all collections checked by default) while persisting the
140
+ // inverse as an exclusion list, so collections added later stay visible by default.
141
+ Field: '@payloadcms/ui#RecentlyViewedCollectionsField'
142
+ }
143
+ },
144
+ hasMany: true,
145
+ label: ({ t })=>t('general:collections'),
146
+ // Exclusion list, so an empty value shows every collection and newly added collections are
147
+ // included by default. Hidden collections are never offered as options.
148
+ options: (config.collections ?? []).filter((collection)=>collection.admin?.hidden !== true).map((collection)=>({
149
+ label: collection.labels?.plural || collection.slug,
150
+ value: collection.slug
151
+ }))
152
+ }
153
+ ];
154
+ const adminConfig = config.admin ?? {
155
+ dashboard: {
156
+ widgets: []
157
+ }
158
+ };
159
+ const dashboard = adminConfig.dashboard ??= {
160
+ widgets: []
161
+ };
162
+ dashboard.widgets.push({
163
+ slug: 'collections',
164
+ Component: '@payloadcms/ui/rsc#CollectionCards',
165
+ minWidth: 'full'
166
+ });
167
+ dashboard.widgets.push({
168
+ slug: 'collection-query',
169
+ Component: '@payloadcms/ui/rsc#CollectionQueryWidget',
170
+ fields: await sanitizeFields({
171
+ config: config,
172
+ existingFieldNames: new Set(),
173
+ fields: collectionQueryFields,
174
+ parentIsLocalized: false,
175
+ richTextSanitizationPromises,
176
+ validRelationships
177
+ }),
178
+ minWidth: 'x-small'
179
+ });
180
+ dashboard.widgets.push({
181
+ slug: 'activity',
182
+ Component: '@payloadcms/ui/rsc#RecentlyViewedWidget',
183
+ fields: await sanitizeFields({
184
+ config: config,
185
+ existingFieldNames: new Set(),
186
+ fields: recentlyViewedFields,
187
+ parentIsLocalized: false,
188
+ richTextSanitizationPromises,
189
+ validRelationships
190
+ }),
191
+ label: ({ t })=>t('dashboard:widgetRecentlyViewedTitle'),
192
+ minWidth: 'x-small'
193
+ });
194
+ dashboard.defaultLayout ??= [
195
+ {
196
+ widgetSlug: 'collections',
197
+ width: 'full'
198
+ }
199
+ ];
200
+ };
82
201
  export const sanitizeConfig = async (incomingConfig)=>{
83
202
  const configWithDefaults = addDefaultsToConfig(incomingConfig);
84
203
  const config = sanitizeAdminConfig(configWithDefaults);
@@ -298,6 +417,11 @@ export const sanitizeConfig = async (incomingConfig)=>{
298
417
  if (queryPresetsCollections.length > 0) {
299
418
  configWithDefaults.collections.push(await sanitizeCollection(config, getQueryPresetsConfig(config), richTextSanitizationPromises, validRelationships));
300
419
  }
420
+ await addDefaultDashboardWidgets({
421
+ config,
422
+ richTextSanitizationPromises,
423
+ validRelationships
424
+ });
301
425
  if (config.serverURL !== '') {
302
426
  config.csrf.push(config.serverURL);
303
427
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/sanitize.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\n\nimport { en } from '@payloadcms/translations/languages/en'\n\nimport type { OrderableJoinInfo } from '../fields/config/sanitizeJoinField.js'\nimport type { CollectionSlug, GlobalSlug, SanitizedCollectionConfig } from '../index.js'\nimport type { SanitizedJobsConfig } from '../queues/config/types/index.js'\nimport type {\n Config,\n LocalizationConfigWithLabels,\n LocalizationConfigWithNoLabels,\n SanitizedConfig,\n Timezone,\n Widget,\n WidgetInstance,\n} from './types.js'\n\nimport { defaultUserCollection } from '../auth/defaultUser.js'\nimport { authRootEndpoints } from '../auth/endpoints/index.js'\nimport { sanitizeCollection } from '../collections/config/sanitize.js'\nimport { migrationsCollection } from '../database/migrations/migrationsCollection.js'\nimport { DuplicateCollection, InvalidConfiguration } from '../errors/index.js'\nimport { defaultTimezones } from '../fields/baseFields/timezone/defaultTimezones.js'\nimport { sanitizeGlobal } from '../globals/config/sanitize.js'\nimport { resolveHierarchyCollections } from '../hierarchy/resolveHierarchyCollections.js'\nimport { baseBlockFields, formatLabels, sanitizeFields } from '../index.js'\nimport {\n getLockedDocumentsCollection,\n lockedDocumentsCollectionSlug,\n} from '../locked-documents/config.js'\nimport { getPreferencesCollection, preferencesCollectionSlug } from '../preferences/config.js'\nimport { getQueryPresetsConfig, queryPresetsCollectionSlug } from '../query-presets/config.js'\nimport { getDefaultJobsCollection, jobsCollectionSlug } from '../queues/config/collection.js'\nimport { getJobStatsGlobal } from '../queues/config/global.js'\nimport { flattenAllFields, flattenBlock } from '../utilities/flattenAllFields.js'\nimport { hasScheduledPublishEnabled } from '../utilities/getVersionsConfig.js'\nimport { validateTimezones } from '../utilities/validateTimezones.js'\nimport { getSchedulePublishTask } from '../versions/schedule/job.js'\nimport { addDefaultsToConfig } from './defaults.js'\nimport { addOrderableEndpoint, addOrderableFieldsAndHook } from './orderable/index.js'\n\nconst sanitizeAdminConfig = (configToSanitize: Config): Partial<SanitizedConfig> => {\n const sanitizedConfig = { ...configToSanitize }\n\n // default logging level will be 'error' if not provided\n sanitizedConfig.loggingLevels = {\n Forbidden: 'info',\n Locked: 'info',\n MissingFile: 'info',\n NotFound: 'info',\n ValidationError: 'info',\n ...(sanitizedConfig.loggingLevels || {}),\n }\n ;(sanitizedConfig.admin!.dashboard ??= { widgets: [] }).widgets.push({\n slug: 'collections',\n Component: '@payloadcms/ui/rsc#CollectionCards',\n minWidth: 'full',\n })\n sanitizedConfig.admin!.dashboard.defaultLayout ??= [\n {\n widgetSlug: 'collections',\n width: 'full',\n } satisfies WidgetInstance,\n ]\n\n // add default user collection if none provided\n if (!sanitizedConfig?.admin?.user) {\n const firstCollectionWithAuth = sanitizedConfig.collections!.find(({ auth }) => Boolean(auth))\n\n if (firstCollectionWithAuth) {\n sanitizedConfig.admin!.user = firstCollectionWithAuth.slug\n } else {\n sanitizedConfig.admin!.user = defaultUserCollection.slug\n sanitizedConfig.collections!.push(defaultUserCollection)\n }\n }\n\n const userCollection = sanitizedConfig.collections!.find(\n ({ slug }) => slug === sanitizedConfig.admin!.user,\n )\n\n if (!userCollection || !userCollection.auth) {\n throw new InvalidConfiguration(\n `${sanitizedConfig.admin!.user} is not a valid admin user collection`,\n )\n }\n\n if (sanitizedConfig?.admin?.timezones) {\n if (typeof configToSanitize?.admin?.timezones?.supportedTimezones === 'function') {\n sanitizedConfig.admin.timezones.supportedTimezones =\n configToSanitize.admin.timezones.supportedTimezones({ defaultTimezones })\n }\n\n if (!sanitizedConfig?.admin?.timezones?.supportedTimezones) {\n sanitizedConfig.admin.timezones.supportedTimezones = defaultTimezones\n }\n } else {\n sanitizedConfig.admin!.timezones = {\n supportedTimezones: defaultTimezones,\n }\n }\n\n validateTimezones({\n source: 'admin.timezones.supportedTimezones',\n timezones: sanitizedConfig.admin!.timezones.supportedTimezones as Timezone[],\n })\n\n return sanitizedConfig as unknown as Partial<SanitizedConfig>\n}\n\nexport const sanitizeConfig = async (incomingConfig: Config): Promise<SanitizedConfig> => {\n const configWithDefaults = addDefaultsToConfig(incomingConfig)\n\n const config: Partial<SanitizedConfig> = sanitizeAdminConfig(configWithDefaults)\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n for (const endpoint of authRootEndpoints) {\n config.endpoints.push(endpoint)\n }\n\n if (config.localization && config.localization.locales?.length > 0) {\n // clone localization config so to not break everything\n const firstLocale = config.localization.locales[0]\n if (typeof firstLocale === 'string') {\n config.localization.localeCodes = [\n ...(config.localization as unknown as LocalizationConfigWithNoLabels).locales,\n ]\n\n // is string[], so convert to Locale[]\n config.localization.locales = (\n config.localization as unknown as LocalizationConfigWithNoLabels\n ).locales.map((locale) => ({\n code: locale,\n label: locale,\n rtl: false,\n toString: () => locale,\n }))\n } else {\n // is Locale[], so convert to string[] for localeCodes\n config.localization.localeCodes = config.localization.locales.map((locale) => locale.code)\n\n config.localization.locales = (\n config.localization as LocalizationConfigWithLabels\n ).locales.map((locale) => ({\n ...locale,\n toString: () => locale.code,\n }))\n }\n\n // Default fallback to true if not provided\n config.localization.fallback = config.localization?.fallback ?? true\n }\n\n const i18nConfig: SanitizedConfig['i18n'] = {\n fallbackLanguage: 'en',\n supportedLanguages: {\n en,\n },\n translations: {},\n }\n\n if (incomingConfig?.i18n) {\n i18nConfig.supportedLanguages =\n incomingConfig.i18n?.supportedLanguages || i18nConfig.supportedLanguages\n\n const supportedLangKeys = <AcceptedLanguages[]>Object.keys(i18nConfig.supportedLanguages)\n const fallbackLang = incomingConfig.i18n?.fallbackLanguage || i18nConfig.fallbackLanguage\n\n i18nConfig.fallbackLanguage = supportedLangKeys.includes(fallbackLang)\n ? fallbackLang\n : supportedLangKeys[0]!\n i18nConfig.translations =\n (incomingConfig.i18n?.translations as SanitizedConfig['i18n']['translations']) ||\n i18nConfig.translations\n }\n\n config.i18n = i18nConfig\n\n const richTextSanitizationPromises: Array<(config: SanitizedConfig) => Promise<void>> = []\n\n const schedulePublishCollections: CollectionSlug[] = []\n\n const queryPresetsCollections: CollectionSlug[] = []\n\n const schedulePublishGlobals: GlobalSlug[] = []\n\n const collectionSlugs = new Set<CollectionSlug>()\n\n const validRelationships = [\n ...(config.collections?.map((c) => c.slug) ?? []),\n jobsCollectionSlug,\n lockedDocumentsCollectionSlug,\n preferencesCollectionSlug,\n ]\n\n const dashboardWidgets = config.admin?.dashboard?.widgets ?? ([] as Widget[])\n\n for (const widget of dashboardWidgets) {\n if (widget.fields?.length) {\n widget.fields = await sanitizeFields({\n config: config as unknown as Config,\n existingFieldNames: new Set(),\n fields: widget.fields,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n /**\n * Blocks sanitization needs to happen before collections, as collection/global join field sanitization needs config.blocks\n * to be populated with the sanitized blocks\n */\n config.blocks = []\n\n if (incomingConfig.blocks?.length) {\n for (const block of incomingConfig.blocks) {\n const sanitizedBlock = block\n\n if (sanitizedBlock._sanitized === true) {\n continue\n }\n sanitizedBlock._sanitized = true\n\n sanitizedBlock.fields = sanitizedBlock.fields.concat(baseBlockFields)\n\n sanitizedBlock.labels = !sanitizedBlock.labels\n ? formatLabels(sanitizedBlock.slug)\n : sanitizedBlock.labels\n\n sanitizedBlock.fields = await sanitizeFields({\n config: config as unknown as Config,\n existingFieldNames: new Set(),\n fields: sanitizedBlock.fields,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n const flattenedSanitizedBlock = flattenBlock({ block })\n\n config.blocks.push(flattenedSanitizedBlock)\n }\n }\n\n // Track orderable join fields during sanitization\n const orderableJoins: OrderableJoinInfo[] = []\n\n for (let i = 0; i < config.collections!.length; i++) {\n if (collectionSlugs.has(config.collections![i]!.slug)) {\n throw new DuplicateCollection('slug', config.collections![i]!.slug)\n }\n\n collectionSlugs.add(config.collections![i]!.slug)\n\n const draftsConfig = config.collections![i]?.versions?.drafts\n\n if (typeof draftsConfig === 'object' && draftsConfig.schedulePublish) {\n schedulePublishCollections.push(config.collections![i]!.slug)\n }\n\n if (config.collections![i]!.enableQueryPresets) {\n queryPresetsCollections.push(config.collections![i]!.slug)\n\n if (!validRelationships.includes(queryPresetsCollectionSlug)) {\n validRelationships.push(queryPresetsCollectionSlug)\n }\n }\n\n config.collections![i] = await sanitizeCollection(\n config as unknown as Config,\n config.collections![i]!,\n richTextSanitizationPromises,\n validRelationships,\n orderableJoins,\n )\n }\n\n // Process orderable features after all collections are sanitized\n const fieldsToAdd = new Map<SanitizedCollectionConfig, string[]>()\n const joinFieldPathsByCollection = new Map<string, Map<string, string>>()\n\n // Handle collection.orderable\n for (const collection of config.collections!) {\n if (collection.orderable) {\n const currentFields = fieldsToAdd.get(collection) || []\n fieldsToAdd.set(collection, [...currentFields, '_order'])\n collection.defaultSort = collection.defaultSort ?? '_order'\n }\n }\n\n // Handle orderable join fields (tracked during sanitization)\n for (const joinInfo of orderableJoins) {\n const targetCollection = config.collections!.find(\n (c) => c.slug === joinInfo.targetCollectionSlug,\n )\n if (targetCollection) {\n const currentFields = fieldsToAdd.get(targetCollection) || []\n fieldsToAdd.set(targetCollection, [...currentFields, joinInfo.orderFieldName])\n\n const currentJoinFieldPaths =\n joinFieldPathsByCollection.get(targetCollection.slug) || new Map<string, string>()\n currentJoinFieldPaths.set(joinInfo.orderFieldName, joinInfo.joinFieldOn)\n joinFieldPathsByCollection.set(targetCollection.slug, currentJoinFieldPaths)\n }\n }\n\n // Add fields, hooks, and update flattenedFields\n for (const [collection, orderableFields] of fieldsToAdd) {\n await addOrderableFieldsAndHook(\n collection,\n config as unknown as Config,\n orderableFields,\n joinFieldPathsByCollection,\n )\n // Regenerate flattenedFields since we added new fields\n collection.flattenedFields = flattenAllFields({ fields: collection.fields })\n }\n\n // Add endpoint if any orderable features exist\n if (fieldsToAdd.size > 0) {\n addOrderableEndpoint(config as SanitizedConfig, joinFieldPathsByCollection)\n }\n\n if (config.globals!.length > 0) {\n for (let i = 0; i < config.globals!.length; i++) {\n if (hasScheduledPublishEnabled(config.globals![i]!)) {\n schedulePublishGlobals.push(config.globals![i]!.slug)\n }\n\n config.globals![i] = await sanitizeGlobal(\n config as unknown as Config,\n config.globals![i]!,\n richTextSanitizationPromises,\n validRelationships,\n )\n }\n }\n\n // Resolve hierarchy relationships across collections (also adds sidebar tabs)\n resolveHierarchyCollections(config as unknown as Config)\n\n if (schedulePublishCollections.length || schedulePublishGlobals.length) {\n ;((config.jobs ??= {} as SanitizedJobsConfig).tasks ??= []).push(\n getSchedulePublishTask({\n adminUserSlug: config.admin!.user,\n collections: schedulePublishCollections,\n globals: schedulePublishGlobals,\n }),\n )\n }\n\n ;(config.jobs ??= {} as SanitizedJobsConfig).enabled = Boolean(\n (Array.isArray(configWithDefaults.jobs?.tasks) && configWithDefaults.jobs?.tasks?.length) ||\n (Array.isArray(configWithDefaults.jobs?.workflows) &&\n configWithDefaults.jobs?.workflows?.length),\n )\n\n // Need to add default jobs collection before locked documents collections\n if (config.jobs.enabled) {\n // Check for schedule property in both tasks and workflows\n const hasScheduleProperty =\n (config?.jobs?.tasks?.length && config.jobs.tasks.some((task) => task.schedule)) ||\n (config?.jobs?.workflows?.length &&\n config.jobs.workflows.some((workflow) => workflow.schedule))\n\n if (hasScheduleProperty) {\n config.jobs.scheduling = true\n // Add payload-jobs-stats global for tracking when a job of a specific slug was last run\n ;(config.globals ??= []).push(\n await sanitizeGlobal(\n config as unknown as Config,\n getJobStatsGlobal(config as unknown as Config),\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n\n config.jobs.stats = true\n }\n\n let defaultJobsCollection = getDefaultJobsCollection(config.jobs)\n\n if (typeof config.jobs.jobsCollectionOverrides === 'function') {\n defaultJobsCollection = config.jobs.jobsCollectionOverrides({\n defaultJobsCollection,\n })\n }\n const sanitizedJobsCollection = await sanitizeCollection(\n config as unknown as Config,\n defaultJobsCollection,\n richTextSanitizationPromises,\n validRelationships,\n )\n\n ;(config.collections ??= []).push(sanitizedJobsCollection)\n }\n\n const lockedDocumentsCollection = getLockedDocumentsCollection(config as unknown as Config)\n\n if (lockedDocumentsCollection) {\n configWithDefaults.collections!.push(\n await sanitizeCollection(\n config as unknown as Config,\n lockedDocumentsCollection,\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n }\n\n configWithDefaults.collections!.push(\n await sanitizeCollection(\n config as unknown as Config,\n getPreferencesCollection(config as unknown as Config),\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n\n const migrations = await sanitizeCollection(\n config as unknown as Config,\n migrationsCollection,\n richTextSanitizationPromises,\n validRelationships,\n )\n\n // @ts-expect-error indexSortableFields is only valid for @payloadcms/db-mongodb\n if (config?.db?.indexSortableFields) {\n migrations.indexes = [\n {\n fields: ['batch', 'name'],\n unique: false,\n },\n ]\n }\n configWithDefaults.collections!.push(migrations)\n\n if (queryPresetsCollections.length > 0) {\n configWithDefaults.collections!.push(\n await sanitizeCollection(\n config as unknown as Config,\n getQueryPresetsConfig(config as unknown as Config),\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n }\n\n if (config.serverURL !== '') {\n config.csrf!.push(config.serverURL!)\n }\n\n if (!config.storage) {\n config.storage = []\n }\n\n if (!config.upload) {\n config.upload = { adapters: [] }\n }\n\n config.upload.adapters = Array.from(\n new Set(config.collections!.map((c) => c.upload?.adapter).filter(Boolean) as string[]),\n )\n\n // Pass through the email config as is so adapters don't break\n if (incomingConfig.email) {\n config.email = incomingConfig.email\n }\n\n /*\n Execute richText sanitization\n */\n if (typeof incomingConfig.editor === 'function') {\n config.editor = await incomingConfig.editor({\n config: config as SanitizedConfig,\n isRoot: true,\n parentIsLocalized: false,\n })\n }\n\n const promises: Promise<void>[] = []\n\n for (const sanitizeFunction of richTextSanitizationPromises) {\n promises.push(sanitizeFunction(config as SanitizedConfig))\n }\n\n await Promise.all(promises)\n\n return config as SanitizedConfig\n}\n"],"names":["en","defaultUserCollection","authRootEndpoints","sanitizeCollection","migrationsCollection","DuplicateCollection","InvalidConfiguration","defaultTimezones","sanitizeGlobal","resolveHierarchyCollections","baseBlockFields","formatLabels","sanitizeFields","getLockedDocumentsCollection","lockedDocumentsCollectionSlug","getPreferencesCollection","preferencesCollectionSlug","getQueryPresetsConfig","queryPresetsCollectionSlug","getDefaultJobsCollection","jobsCollectionSlug","getJobStatsGlobal","flattenAllFields","flattenBlock","hasScheduledPublishEnabled","validateTimezones","getSchedulePublishTask","addDefaultsToConfig","addOrderableEndpoint","addOrderableFieldsAndHook","sanitizeAdminConfig","configToSanitize","sanitizedConfig","loggingLevels","Forbidden","Locked","MissingFile","NotFound","ValidationError","admin","dashboard","widgets","push","slug","Component","minWidth","defaultLayout","widgetSlug","width","user","firstCollectionWithAuth","collections","find","auth","Boolean","userCollection","timezones","supportedTimezones","source","sanitizeConfig","incomingConfig","configWithDefaults","config","endpoints","endpoint","localization","locales","length","firstLocale","localeCodes","map","locale","code","label","rtl","toString","fallback","i18nConfig","fallbackLanguage","supportedLanguages","translations","i18n","supportedLangKeys","Object","keys","fallbackLang","includes","richTextSanitizationPromises","schedulePublishCollections","queryPresetsCollections","schedulePublishGlobals","collectionSlugs","Set","validRelationships","c","dashboardWidgets","widget","fields","existingFieldNames","parentIsLocalized","blocks","block","sanitizedBlock","_sanitized","concat","labels","flattenedSanitizedBlock","orderableJoins","i","has","add","draftsConfig","versions","drafts","schedulePublish","enableQueryPresets","fieldsToAdd","Map","joinFieldPathsByCollection","collection","orderable","currentFields","get","set","defaultSort","joinInfo","targetCollection","targetCollectionSlug","orderFieldName","currentJoinFieldPaths","joinFieldOn","orderableFields","flattenedFields","size","globals","jobs","tasks","adminUserSlug","enabled","Array","isArray","workflows","hasScheduleProperty","some","task","schedule","workflow","scheduling","stats","defaultJobsCollection","jobsCollectionOverrides","sanitizedJobsCollection","lockedDocumentsCollection","migrations","db","indexSortableFields","indexes","unique","serverURL","csrf","storage","upload","adapters","from","adapter","filter","email","editor","isRoot","promises","sanitizeFunction","Promise","all"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/config/sanitize.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\n\nimport { en } from '@payloadcms/translations/languages/en'\n\nimport type { OrderableJoinInfo } from '../fields/config/sanitizeJoinField.js'\nimport type { CollectionSlug, GlobalSlug, SanitizedCollectionConfig } from '../index.js'\nimport type { SanitizedJobsConfig } from '../queues/config/types/index.js'\nimport type {\n Config,\n DashboardConfig,\n LocalizationConfigWithLabels,\n LocalizationConfigWithNoLabels,\n SanitizedConfig,\n Timezone,\n Widget,\n WidgetInstance,\n} from './types.js'\n\nimport { defaultUserCollection } from '../auth/defaultUser.js'\nimport { authRootEndpoints } from '../auth/endpoints/index.js'\nimport { sanitizeCollection } from '../collections/config/sanitize.js'\nimport { migrationsCollection } from '../database/migrations/migrationsCollection.js'\nimport { DuplicateCollection, InvalidConfiguration } from '../errors/index.js'\nimport { defaultTimezones } from '../fields/baseFields/timezone/defaultTimezones.js'\nimport { sanitizeGlobal } from '../globals/config/sanitize.js'\nimport { resolveHierarchyCollections } from '../hierarchy/resolveHierarchyCollections.js'\nimport { baseBlockFields, formatLabels, sanitizeFields } from '../index.js'\nimport {\n getLockedDocumentsCollection,\n lockedDocumentsCollectionSlug,\n} from '../locked-documents/config.js'\nimport { getPreferencesCollection, preferencesCollectionSlug } from '../preferences/config.js'\nimport { getQueryPresetsConfig, queryPresetsCollectionSlug } from '../query-presets/config.js'\nimport { getDefaultJobsCollection, jobsCollectionSlug } from '../queues/config/collection.js'\nimport { getJobStatsGlobal } from '../queues/config/global.js'\nimport { flattenAllFields, flattenBlock } from '../utilities/flattenAllFields.js'\nimport { hasScheduledPublishEnabled } from '../utilities/getVersionsConfig.js'\nimport { validateTimezones } from '../utilities/validateTimezones.js'\nimport { getSchedulePublishTask } from '../versions/schedule/job.js'\nimport { addDefaultsToConfig } from './defaults.js'\nimport { addOrderableEndpoint, addOrderableFieldsAndHook } from './orderable/index.js'\n\nconst sanitizeAdminConfig = (configToSanitize: Config): Partial<SanitizedConfig> => {\n const sanitizedConfig = { ...configToSanitize }\n\n // default logging level will be 'error' if not provided\n sanitizedConfig.loggingLevels = {\n Forbidden: 'info',\n Locked: 'info',\n MissingFile: 'info',\n NotFound: 'info',\n ValidationError: 'info',\n ...(sanitizedConfig.loggingLevels || {}),\n }\n // add default user collection if none provided\n if (!sanitizedConfig?.admin?.user) {\n const firstCollectionWithAuth = sanitizedConfig.collections!.find(({ auth }) => Boolean(auth))\n\n if (firstCollectionWithAuth) {\n sanitizedConfig.admin!.user = firstCollectionWithAuth.slug\n } else {\n sanitizedConfig.admin!.user = defaultUserCollection.slug\n sanitizedConfig.collections!.push(defaultUserCollection)\n }\n }\n\n const userCollection = sanitizedConfig.collections!.find(\n ({ slug }) => slug === sanitizedConfig.admin!.user,\n )\n\n if (!userCollection || !userCollection.auth) {\n throw new InvalidConfiguration(\n `${sanitizedConfig.admin!.user} is not a valid admin user collection`,\n )\n }\n\n if (sanitizedConfig?.admin?.timezones) {\n if (typeof configToSanitize?.admin?.timezones?.supportedTimezones === 'function') {\n sanitizedConfig.admin.timezones.supportedTimezones =\n configToSanitize.admin.timezones.supportedTimezones({ defaultTimezones })\n }\n\n if (!sanitizedConfig?.admin?.timezones?.supportedTimezones) {\n sanitizedConfig.admin.timezones.supportedTimezones = defaultTimezones\n }\n } else {\n sanitizedConfig.admin!.timezones = {\n supportedTimezones: defaultTimezones,\n }\n }\n\n validateTimezones({\n source: 'admin.timezones.supportedTimezones',\n timezones: sanitizedConfig.admin!.timezones.supportedTimezones as Timezone[],\n })\n\n return sanitizedConfig as unknown as Partial<SanitizedConfig>\n}\n\nconst addDefaultDashboardWidgets = async ({\n config,\n richTextSanitizationPromises,\n validRelationships,\n}: {\n config: Partial<SanitizedConfig>\n richTextSanitizationPromises: Array<(config: SanitizedConfig) => Promise<void>>\n validRelationships: string[]\n}) => {\n const collectionQueryFields: NonNullable<Widget['fields']> = [\n {\n name: 'title',\n type: 'text',\n label: ({ t }) => t('dashboard:widgetTitleLabel'),\n },\n {\n name: 'relatedCollection',\n type: 'select',\n label: ({ t }) => t('general:collection'),\n // Only offer collections that are visible in the admin UI. Collections hidden via a function\n // are kept since they may still be visible for some users.\n options: (config.collections ?? [])\n .filter((collection) => collection.admin?.hidden !== true)\n .map((collection) => ({\n label: collection.labels?.plural || collection.slug,\n value: collection.slug,\n })),\n required: true,\n },\n {\n name: 'where',\n type: 'json',\n admin: {\n components: {\n Field: '@payloadcms/ui#QueryPresetsWhereField',\n },\n },\n label: ({ t }) => t('general:filters'),\n },\n {\n name: 'sortField',\n type: 'text',\n admin: {\n components: {\n Field: '@payloadcms/ui#CollectionQuerySortField',\n },\n },\n label: ({ t }) => t('dashboard:widgetSortFieldLabel'),\n },\n {\n name: 'sortDirection',\n type: 'select',\n defaultValue: 'desc',\n label: ({ t }) => t('dashboard:widgetSortDirectionLabel'),\n options: [\n {\n label: ({ t }) => t('general:ascending'),\n value: 'asc',\n },\n {\n label: ({ t }) => t('general:descending'),\n value: 'desc',\n },\n ],\n },\n {\n name: 'limit',\n type: 'number',\n defaultValue: 5,\n label: ({ t }) => t('dashboard:widgetLimitLabel'),\n max: 25,\n min: 1,\n },\n ]\n\n const recentlyViewedFields: NonNullable<Widget['fields']> = [\n {\n name: 'excludedCollections',\n type: 'select',\n admin: {\n components: {\n // Presents an inclusion filter (all collections checked by default) while persisting the\n // inverse as an exclusion list, so collections added later stay visible by default.\n Field: '@payloadcms/ui#RecentlyViewedCollectionsField',\n },\n },\n hasMany: true,\n label: ({ t }) => t('general:collections'),\n // Exclusion list, so an empty value shows every collection and newly added collections are\n // included by default. Hidden collections are never offered as options.\n options: (config.collections ?? [])\n .filter((collection) => collection.admin?.hidden !== true)\n .map((collection) => ({\n label: collection.labels?.plural || collection.slug,\n value: collection.slug,\n })),\n },\n ]\n\n const adminConfig: NonNullable<Config['admin']> = config.admin ?? { dashboard: { widgets: [] } }\n const dashboard: DashboardConfig = (adminConfig.dashboard ??= { widgets: [] })\n\n dashboard.widgets.push({\n slug: 'collections',\n Component: '@payloadcms/ui/rsc#CollectionCards',\n minWidth: 'full',\n })\n dashboard.widgets.push({\n slug: 'collection-query',\n Component: '@payloadcms/ui/rsc#CollectionQueryWidget',\n fields: await sanitizeFields({\n config: config as unknown as Config,\n existingFieldNames: new Set(),\n fields: collectionQueryFields,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n }),\n minWidth: 'x-small',\n })\n dashboard.widgets.push({\n slug: 'activity',\n Component: '@payloadcms/ui/rsc#RecentlyViewedWidget',\n fields: await sanitizeFields({\n config: config as unknown as Config,\n existingFieldNames: new Set(),\n fields: recentlyViewedFields,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n }),\n label: ({ t }) => t('dashboard:widgetRecentlyViewedTitle'),\n minWidth: 'x-small',\n })\n dashboard.defaultLayout ??= [\n {\n widgetSlug: 'collections',\n width: 'full',\n } satisfies WidgetInstance,\n ]\n}\n\nexport const sanitizeConfig = async (incomingConfig: Config): Promise<SanitizedConfig> => {\n const configWithDefaults = addDefaultsToConfig(incomingConfig)\n\n const config: Partial<SanitizedConfig> = sanitizeAdminConfig(configWithDefaults)\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n for (const endpoint of authRootEndpoints) {\n config.endpoints.push(endpoint)\n }\n\n if (config.localization && config.localization.locales?.length > 0) {\n // clone localization config so to not break everything\n const firstLocale = config.localization.locales[0]\n if (typeof firstLocale === 'string') {\n config.localization.localeCodes = [\n ...(config.localization as unknown as LocalizationConfigWithNoLabels).locales,\n ]\n\n // is string[], so convert to Locale[]\n config.localization.locales = (\n config.localization as unknown as LocalizationConfigWithNoLabels\n ).locales.map((locale) => ({\n code: locale,\n label: locale,\n rtl: false,\n toString: () => locale,\n }))\n } else {\n // is Locale[], so convert to string[] for localeCodes\n config.localization.localeCodes = config.localization.locales.map((locale) => locale.code)\n\n config.localization.locales = (\n config.localization as LocalizationConfigWithLabels\n ).locales.map((locale) => ({\n ...locale,\n toString: () => locale.code,\n }))\n }\n\n // Default fallback to true if not provided\n config.localization.fallback = config.localization?.fallback ?? true\n }\n\n const i18nConfig: SanitizedConfig['i18n'] = {\n fallbackLanguage: 'en',\n supportedLanguages: {\n en,\n },\n translations: {},\n }\n\n if (incomingConfig?.i18n) {\n i18nConfig.supportedLanguages =\n incomingConfig.i18n?.supportedLanguages || i18nConfig.supportedLanguages\n\n const supportedLangKeys = <AcceptedLanguages[]>Object.keys(i18nConfig.supportedLanguages)\n const fallbackLang = incomingConfig.i18n?.fallbackLanguage || i18nConfig.fallbackLanguage\n\n i18nConfig.fallbackLanguage = supportedLangKeys.includes(fallbackLang)\n ? fallbackLang\n : supportedLangKeys[0]!\n i18nConfig.translations =\n (incomingConfig.i18n?.translations as SanitizedConfig['i18n']['translations']) ||\n i18nConfig.translations\n }\n\n config.i18n = i18nConfig\n\n const richTextSanitizationPromises: Array<(config: SanitizedConfig) => Promise<void>> = []\n\n const schedulePublishCollections: CollectionSlug[] = []\n\n const queryPresetsCollections: CollectionSlug[] = []\n\n const schedulePublishGlobals: GlobalSlug[] = []\n\n const collectionSlugs = new Set<CollectionSlug>()\n\n const validRelationships = [\n ...(config.collections?.map((c) => c.slug) ?? []),\n jobsCollectionSlug,\n lockedDocumentsCollectionSlug,\n preferencesCollectionSlug,\n ]\n\n const dashboardWidgets = config.admin?.dashboard?.widgets ?? ([] as Widget[])\n\n for (const widget of dashboardWidgets) {\n if (widget.fields?.length) {\n widget.fields = await sanitizeFields({\n config: config as unknown as Config,\n existingFieldNames: new Set(),\n fields: widget.fields,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n /**\n * Blocks sanitization needs to happen before collections, as collection/global join field sanitization needs config.blocks\n * to be populated with the sanitized blocks\n */\n config.blocks = []\n\n if (incomingConfig.blocks?.length) {\n for (const block of incomingConfig.blocks) {\n const sanitizedBlock = block\n\n if (sanitizedBlock._sanitized === true) {\n continue\n }\n sanitizedBlock._sanitized = true\n\n sanitizedBlock.fields = sanitizedBlock.fields.concat(baseBlockFields)\n\n sanitizedBlock.labels = !sanitizedBlock.labels\n ? formatLabels(sanitizedBlock.slug)\n : sanitizedBlock.labels\n\n sanitizedBlock.fields = await sanitizeFields({\n config: config as unknown as Config,\n existingFieldNames: new Set(),\n fields: sanitizedBlock.fields,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n const flattenedSanitizedBlock = flattenBlock({ block })\n\n config.blocks.push(flattenedSanitizedBlock)\n }\n }\n\n // Track orderable join fields during sanitization\n const orderableJoins: OrderableJoinInfo[] = []\n\n for (let i = 0; i < config.collections!.length; i++) {\n if (collectionSlugs.has(config.collections![i]!.slug)) {\n throw new DuplicateCollection('slug', config.collections![i]!.slug)\n }\n\n collectionSlugs.add(config.collections![i]!.slug)\n\n const draftsConfig = config.collections![i]?.versions?.drafts\n\n if (typeof draftsConfig === 'object' && draftsConfig.schedulePublish) {\n schedulePublishCollections.push(config.collections![i]!.slug)\n }\n\n if (config.collections![i]!.enableQueryPresets) {\n queryPresetsCollections.push(config.collections![i]!.slug)\n\n if (!validRelationships.includes(queryPresetsCollectionSlug)) {\n validRelationships.push(queryPresetsCollectionSlug)\n }\n }\n\n config.collections![i] = await sanitizeCollection(\n config as unknown as Config,\n config.collections![i]!,\n richTextSanitizationPromises,\n validRelationships,\n orderableJoins,\n )\n }\n\n // Process orderable features after all collections are sanitized\n const fieldsToAdd = new Map<SanitizedCollectionConfig, string[]>()\n const joinFieldPathsByCollection = new Map<string, Map<string, string>>()\n\n // Handle collection.orderable\n for (const collection of config.collections!) {\n if (collection.orderable) {\n const currentFields = fieldsToAdd.get(collection) || []\n fieldsToAdd.set(collection, [...currentFields, '_order'])\n collection.defaultSort = collection.defaultSort ?? '_order'\n }\n }\n\n // Handle orderable join fields (tracked during sanitization)\n for (const joinInfo of orderableJoins) {\n const targetCollection = config.collections!.find(\n (c) => c.slug === joinInfo.targetCollectionSlug,\n )\n if (targetCollection) {\n const currentFields = fieldsToAdd.get(targetCollection) || []\n fieldsToAdd.set(targetCollection, [...currentFields, joinInfo.orderFieldName])\n\n const currentJoinFieldPaths =\n joinFieldPathsByCollection.get(targetCollection.slug) || new Map<string, string>()\n currentJoinFieldPaths.set(joinInfo.orderFieldName, joinInfo.joinFieldOn)\n joinFieldPathsByCollection.set(targetCollection.slug, currentJoinFieldPaths)\n }\n }\n\n // Add fields, hooks, and update flattenedFields\n for (const [collection, orderableFields] of fieldsToAdd) {\n await addOrderableFieldsAndHook(\n collection,\n config as unknown as Config,\n orderableFields,\n joinFieldPathsByCollection,\n )\n // Regenerate flattenedFields since we added new fields\n collection.flattenedFields = flattenAllFields({ fields: collection.fields })\n }\n\n // Add endpoint if any orderable features exist\n if (fieldsToAdd.size > 0) {\n addOrderableEndpoint(config as SanitizedConfig, joinFieldPathsByCollection)\n }\n\n if (config.globals!.length > 0) {\n for (let i = 0; i < config.globals!.length; i++) {\n if (hasScheduledPublishEnabled(config.globals![i]!)) {\n schedulePublishGlobals.push(config.globals![i]!.slug)\n }\n\n config.globals![i] = await sanitizeGlobal(\n config as unknown as Config,\n config.globals![i]!,\n richTextSanitizationPromises,\n validRelationships,\n )\n }\n }\n\n // Resolve hierarchy relationships across collections (also adds sidebar tabs)\n resolveHierarchyCollections(config as unknown as Config)\n\n if (schedulePublishCollections.length || schedulePublishGlobals.length) {\n ;((config.jobs ??= {} as SanitizedJobsConfig).tasks ??= []).push(\n getSchedulePublishTask({\n adminUserSlug: config.admin!.user,\n collections: schedulePublishCollections,\n globals: schedulePublishGlobals,\n }),\n )\n }\n\n ;(config.jobs ??= {} as SanitizedJobsConfig).enabled = Boolean(\n (Array.isArray(configWithDefaults.jobs?.tasks) && configWithDefaults.jobs?.tasks?.length) ||\n (Array.isArray(configWithDefaults.jobs?.workflows) &&\n configWithDefaults.jobs?.workflows?.length),\n )\n\n // Need to add default jobs collection before locked documents collections\n if (config.jobs.enabled) {\n // Check for schedule property in both tasks and workflows\n const hasScheduleProperty =\n (config?.jobs?.tasks?.length && config.jobs.tasks.some((task) => task.schedule)) ||\n (config?.jobs?.workflows?.length &&\n config.jobs.workflows.some((workflow) => workflow.schedule))\n\n if (hasScheduleProperty) {\n config.jobs.scheduling = true\n // Add payload-jobs-stats global for tracking when a job of a specific slug was last run\n ;(config.globals ??= []).push(\n await sanitizeGlobal(\n config as unknown as Config,\n getJobStatsGlobal(config as unknown as Config),\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n\n config.jobs.stats = true\n }\n\n let defaultJobsCollection = getDefaultJobsCollection(config.jobs)\n\n if (typeof config.jobs.jobsCollectionOverrides === 'function') {\n defaultJobsCollection = config.jobs.jobsCollectionOverrides({\n defaultJobsCollection,\n })\n }\n const sanitizedJobsCollection = await sanitizeCollection(\n config as unknown as Config,\n defaultJobsCollection,\n richTextSanitizationPromises,\n validRelationships,\n )\n\n ;(config.collections ??= []).push(sanitizedJobsCollection)\n }\n\n const lockedDocumentsCollection = getLockedDocumentsCollection(config as unknown as Config)\n\n if (lockedDocumentsCollection) {\n configWithDefaults.collections!.push(\n await sanitizeCollection(\n config as unknown as Config,\n lockedDocumentsCollection,\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n }\n\n configWithDefaults.collections!.push(\n await sanitizeCollection(\n config as unknown as Config,\n getPreferencesCollection(config as unknown as Config),\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n\n const migrations = await sanitizeCollection(\n config as unknown as Config,\n migrationsCollection,\n richTextSanitizationPromises,\n validRelationships,\n )\n\n // @ts-expect-error indexSortableFields is only valid for @payloadcms/db-mongodb\n if (config?.db?.indexSortableFields) {\n migrations.indexes = [\n {\n fields: ['batch', 'name'],\n unique: false,\n },\n ]\n }\n configWithDefaults.collections!.push(migrations)\n\n if (queryPresetsCollections.length > 0) {\n configWithDefaults.collections!.push(\n await sanitizeCollection(\n config as unknown as Config,\n getQueryPresetsConfig(config as unknown as Config),\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n }\n\n await addDefaultDashboardWidgets({\n config,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (config.serverURL !== '') {\n config.csrf!.push(config.serverURL!)\n }\n\n if (!config.storage) {\n config.storage = []\n }\n\n if (!config.upload) {\n config.upload = { adapters: [] }\n }\n\n config.upload.adapters = Array.from(\n new Set(config.collections!.map((c) => c.upload?.adapter).filter(Boolean) as string[]),\n )\n\n // Pass through the email config as is so adapters don't break\n if (incomingConfig.email) {\n config.email = incomingConfig.email\n }\n\n /*\n Execute richText sanitization\n */\n if (typeof incomingConfig.editor === 'function') {\n config.editor = await incomingConfig.editor({\n config: config as SanitizedConfig,\n isRoot: true,\n parentIsLocalized: false,\n })\n }\n\n const promises: Promise<void>[] = []\n\n for (const sanitizeFunction of richTextSanitizationPromises) {\n promises.push(sanitizeFunction(config as SanitizedConfig))\n }\n\n await Promise.all(promises)\n\n return config as SanitizedConfig\n}\n"],"names":["en","defaultUserCollection","authRootEndpoints","sanitizeCollection","migrationsCollection","DuplicateCollection","InvalidConfiguration","defaultTimezones","sanitizeGlobal","resolveHierarchyCollections","baseBlockFields","formatLabels","sanitizeFields","getLockedDocumentsCollection","lockedDocumentsCollectionSlug","getPreferencesCollection","preferencesCollectionSlug","getQueryPresetsConfig","queryPresetsCollectionSlug","getDefaultJobsCollection","jobsCollectionSlug","getJobStatsGlobal","flattenAllFields","flattenBlock","hasScheduledPublishEnabled","validateTimezones","getSchedulePublishTask","addDefaultsToConfig","addOrderableEndpoint","addOrderableFieldsAndHook","sanitizeAdminConfig","configToSanitize","sanitizedConfig","loggingLevels","Forbidden","Locked","MissingFile","NotFound","ValidationError","admin","user","firstCollectionWithAuth","collections","find","auth","Boolean","slug","push","userCollection","timezones","supportedTimezones","source","addDefaultDashboardWidgets","config","richTextSanitizationPromises","validRelationships","collectionQueryFields","name","type","label","t","options","filter","collection","hidden","map","labels","plural","value","required","components","Field","defaultValue","max","min","recentlyViewedFields","hasMany","adminConfig","dashboard","widgets","Component","minWidth","fields","existingFieldNames","Set","parentIsLocalized","defaultLayout","widgetSlug","width","sanitizeConfig","incomingConfig","configWithDefaults","endpoints","endpoint","localization","locales","length","firstLocale","localeCodes","locale","code","rtl","toString","fallback","i18nConfig","fallbackLanguage","supportedLanguages","translations","i18n","supportedLangKeys","Object","keys","fallbackLang","includes","schedulePublishCollections","queryPresetsCollections","schedulePublishGlobals","collectionSlugs","c","dashboardWidgets","widget","blocks","block","sanitizedBlock","_sanitized","concat","flattenedSanitizedBlock","orderableJoins","i","has","add","draftsConfig","versions","drafts","schedulePublish","enableQueryPresets","fieldsToAdd","Map","joinFieldPathsByCollection","orderable","currentFields","get","set","defaultSort","joinInfo","targetCollection","targetCollectionSlug","orderFieldName","currentJoinFieldPaths","joinFieldOn","orderableFields","flattenedFields","size","globals","jobs","tasks","adminUserSlug","enabled","Array","isArray","workflows","hasScheduleProperty","some","task","schedule","workflow","scheduling","stats","defaultJobsCollection","jobsCollectionOverrides","sanitizedJobsCollection","lockedDocumentsCollection","migrations","db","indexSortableFields","indexes","unique","serverURL","csrf","storage","upload","adapters","from","adapter","email","editor","isRoot","promises","sanitizeFunction","Promise","all"],"mappings":"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"}
@@ -8,6 +8,7 @@ import type { DestinationStream, Level, LoggerOptions } from 'pino';
8
8
  import type React from 'react';
9
9
  import type { default as sharp } from 'sharp';
10
10
  import type { DeepRequired } from 'ts-essentials';
11
+ import type { ComponentRenderer } from '../admin/adapters/render.js';
11
12
  import type { ServerAdapter } from '../admin/adapters/server.js';
12
13
  import type { RichTextAdapterProvider } from '../admin/RichText.js';
13
14
  import type { CustomStatus, DocumentSubViewTypes, DocumentTabConfig, DocumentViewServerProps, PublishButtonClientProps, PublishButtonServerProps, RichTextAdapter, UnpublishButtonClientProps, UnpublishButtonServerProps } from '../admin/types.js';
@@ -19,7 +20,7 @@ import type { DatabaseAdapterResult } from '../database/types.js';
19
20
  import type { EmailAdapter, SendEmailOptions } from '../email/types.js';
20
21
  import type { ErrorName } from '../errors/types.js';
21
22
  import type { GlobalConfig, Globals, SanitizedGlobalConfig } from '../globals/config/types.js';
22
- import type { Block, ClientField, DataFromWidgetSlug, DefaultDocumentIDType, Field, FlattenedBlock, JobsConfig, KVAdapterResult, Payload, RegisteredPlugins, RequestContext, SelectField, TypedUser, TypedWidget, WidgetSlug } from '../index.js';
23
+ import type { Block, ClientField, DataFromWidgetSlug, DefaultDocumentIDType, Field, FlattenedBlock, JobsConfig, KVAdapterResult, Payload, RegisteredPlugins, RequestContext, SelectField, TypedWidget, User, WidgetSlug } from '../index.js';
23
24
  import type { QueryPreset, QueryPresetConstraints } from '../query-presets/types.js';
24
25
  import type { SanitizedJobsConfig } from '../queues/config/types/index.js';
25
26
  import type { PayloadRequest, Where } from '../types/index.js';
@@ -124,6 +125,13 @@ export type LivePreviewConfig = {
124
125
  name: string;
125
126
  width: number | string;
126
127
  }[];
128
+ /**
129
+ * When `true`, Live Preview opens automatically the first time a user views a document,
130
+ * before they have manually toggled it on. Once the user toggles Live Preview on or off,
131
+ * their stored preference takes precedence and this setting is ignored.
132
+ * @default false
133
+ */
134
+ openByDefault?: boolean;
127
135
  /**
128
136
  * The URL of the frontend application. This will be rendered within an `iframe` as its `src`.
129
137
  * Payload will send a `window.postMessage()` to this URL with the document data in real-time.
@@ -347,14 +355,22 @@ export type ServerProps = {
347
355
  readonly params?: Params;
348
356
  readonly payload: Payload;
349
357
  readonly permissions?: SanitizedPermissions;
358
+ /**
359
+ * Adapter-injected component renderer. Server components can use this
360
+ * to render other import map components without importing a
361
+ * framework-specific renderer directly.
362
+ */
363
+ readonly renderComponent?: ComponentRenderer;
350
364
  readonly searchParams?: Params;
351
365
  /**
352
366
  * Framework-agnostic methods for server-side navigation, headers, cookies, and other server-only APIs.
353
367
  * Plugins should call these methods instead of importing directly from `next/navigation`, `next/headers`, etc.
354
368
  * These methods are populated by the given framework adapter, e.g. `@payloadcms/next`.
369
+ *
370
+ * Optional because non-framework contexts (jobs, scripts, tests) may not have an adapter attached.
355
371
  */
356
372
  readonly server: ServerAdapter;
357
- readonly user?: TypedUser;
373
+ readonly user?: User;
358
374
  readonly viewType?: ViewTypes;
359
375
  readonly visibleEntities?: VisibleEntities;
360
376
  };
@@ -384,6 +400,12 @@ type SanitizedTimezoneConfig = {
384
400
  supportedTimezones: Timezone[];
385
401
  } & Omit<TimezonesConfig, 'supportedTimezones'>;
386
402
  export type CustomComponent<TAdditionalProps extends object = Record<string, any>> = PayloadComponent<ServerProps & TAdditionalProps, TAdditionalProps>;
403
+ export type UserMenuSettingsGroup = {
404
+ group: LabelFunction | StaticLabel;
405
+ items: CustomComponent[];
406
+ };
407
+ export type UserMenuSettingsItem = CustomComponent | UserMenuSettingsGroup;
408
+ export declare const isUserMenuSettingsGroup: (userMenuSettingsItem: UserMenuSettingsItem) => userMenuSettingsItem is UserMenuSettingsGroup;
387
409
  export type Locale = {
388
410
  /**
389
411
  * value of supported locale
@@ -803,6 +825,12 @@ export type Config = {
803
825
  /** Extensible tab system */
804
826
  tabs?: SidebarTab[];
805
827
  };
828
+ /**
829
+ * Add custom items to the user menu popup in the admin panel header.
830
+ * These components will be rendered in the Settings sub-popup of the user menu.
831
+ * When empty or absent, the Settings sub-trigger is not shown.
832
+ */
833
+ userMenuSettingsItems?: UserMenuSettingsItem[];
806
834
  /**
807
835
  * Replace or modify top-level admin routes, or add new ones:
808
836
  * + `Account` - `/admin/account`
@@ -1027,22 +1055,6 @@ export type Config = {
1027
1055
  email?: EmailAdapter | Promise<EmailAdapter>;
1028
1056
  /** Custom REST endpoints */
1029
1057
  endpoints?: Endpoint[];
1030
- /**
1031
- * Experimental features may be unstable or change in future versions.
1032
- */
1033
- experimental?: {
1034
- /**
1035
- * Enable per-locale status for documents.
1036
- *
1037
- * Requires:
1038
- * - `localization` enabled
1039
- * - `versions.drafts` enabled
1040
- * - `versions.drafts.localizeStatus` set at collection or global level
1041
- *
1042
- * @experimental
1043
- */
1044
- localizeStatus?: boolean;
1045
- };
1046
1058
  /**
1047
1059
  * @see https://payloadcms.com/docs/configuration/globals#global-configs
1048
1060
  */
@@ -1338,6 +1350,32 @@ export type Config = {
1338
1350
  */
1339
1351
  ignoreTSError?: boolean;
1340
1352
  } | false;
1353
+ /**
1354
+ * Also generate a write-shaped input type (e.g. `PostInput`) next to each read type, describing
1355
+ * what `create`/`update` accept: relationships and uploads as IDs only, `id` and `defaultValue`
1356
+ * fields optional, and `createdAt`/`updatedAt`/virtual/join fields removed. These are
1357
+ * exposed on `Config['collectionsInput']` and `Config['globalsInput']`. Set `true` to turn them on.
1358
+ * Draft-enabled entities retain `_status` because it is a writable create/update field.
1359
+ *
1360
+ * @default false
1361
+ *
1362
+ * @remarks
1363
+ * Off by default. The Local API's `create`/`update` still type their `data` against the read
1364
+ * type, so these input types aren't used internally - they're here for you to opt into, e.g. to
1365
+ * type a form payload, a seed script, or an API client. `@payloadcms/plugin-mcp` also uses the
1366
+ * input schema, but it builds that itself at runtime, so MCP gets the accurate write schema
1367
+ * whether or not this flag is on.
1368
+ *
1369
+ * @todo We'd like to turn this on by default (or have the Local API use the input type
1370
+ * directly), but there's a catch. When you read a document with `depth > 0`, its relationships
1371
+ * come back as full documents rather than IDs. A strict ID-only input type would reject that and
1372
+ * break the common "read a doc, change a field, save it back" pattern. To enable it by default,
1373
+ * the input type would first need to accept a relationship as either an ID or the full document
1374
+ * (which is what Payload already does at runtime), while keeping `id`, `defaultValue`, and
1375
+ * auto-managed fields optional. Until then it stays opt-in, so we don't put a type that's
1376
+ * stricter than the runtime on the main write path.
1377
+ */
1378
+ generateInputTypes?: boolean;
1341
1379
  /** Filename to write the generated types to */
1342
1380
  outputFile?: string;
1343
1381
  /**
@@ -1536,6 +1574,7 @@ export type SharedEntityViews = {
1536
1574
  [key: string]: {
1537
1575
  actions?: CustomComponent[];
1538
1576
  Component?: PayloadComponent;
1577
+ NoResults?: CustomComponent;
1539
1578
  } | AdminViewConfig | EditConfig | undefined;
1540
1579
  /**
1541
1580
  * Replace, modify, or add new "document" views.
@@ -1560,7 +1599,7 @@ export type SharedAdminComponents = {
1560
1599
  views?: SharedEntityViews;
1561
1600
  };
1562
1601
  export type EntityDescriptionFunction = ({ t }: {
1563
- t: TFunction;
1602
+ t: TFunction<ClientTranslationKeys>;
1564
1603
  }) => string;
1565
1604
  export type EntityDescription = EntityDescriptionFunction | Record<string, string> | string;
1566
1605
  export type { EmailAdapter, SendEmailOptions };