payload 4.0.0-internal.c2b57ce → 4.0.0-internal.cd69eef

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 (822) 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 +3 -11
  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 +10 -1
  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/iterateFields.d.ts.map +1 -1
  141. package/dist/bin/generateImportMap/iterateFields.js +4 -1
  142. package/dist/bin/generateImportMap/iterateFields.js.map +1 -1
  143. package/dist/bin/generateImportMap/utilities/getFromImportMap.d.ts.map +1 -1
  144. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.d.ts +5 -1
  145. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.d.ts.map +1 -1
  146. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js +33 -18
  147. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js.map +1 -1
  148. package/dist/bin/generateTypes.d.ts +3 -2
  149. package/dist/bin/generateTypes.d.ts.map +1 -1
  150. package/dist/bin/generateTypes.js +11 -1
  151. package/dist/bin/generateTypes.js.map +1 -1
  152. package/dist/bin/index.d.ts.map +1 -1
  153. package/dist/bin/index.js +9 -0
  154. package/dist/bin/index.js.map +1 -1
  155. package/dist/bin/loadEnv.d.ts +3 -1
  156. package/dist/bin/loadEnv.d.ts.map +1 -1
  157. package/dist/bin/loadEnv.js +40 -10
  158. package/dist/bin/loadEnv.js.map +1 -1
  159. package/dist/bin/migrate.d.ts.map +1 -1
  160. package/dist/collections/config/client.d.ts +11 -4
  161. package/dist/collections/config/client.d.ts.map +1 -1
  162. package/dist/collections/config/client.js +8 -0
  163. package/dist/collections/config/client.js.map +1 -1
  164. package/dist/collections/config/defaults.d.ts +0 -4
  165. package/dist/collections/config/defaults.d.ts.map +1 -1
  166. package/dist/collections/config/defaults.js +2 -17
  167. package/dist/collections/config/defaults.js.map +1 -1
  168. package/dist/collections/config/defaults.spec.js +47 -0
  169. package/dist/collections/config/defaults.spec.js.map +1 -0
  170. package/dist/collections/config/sanitize.d.ts.map +1 -1
  171. package/dist/collections/config/sanitize.js +1 -11
  172. package/dist/collections/config/sanitize.js.map +1 -1
  173. package/dist/collections/config/sanitizeCompoundIndexes.d.ts.map +1 -1
  174. package/dist/collections/config/types.d.ts +13 -9
  175. package/dist/collections/config/types.d.ts.map +1 -1
  176. package/dist/collections/config/types.js.map +1 -1
  177. package/dist/collections/config/useAsTitle.d.ts.map +1 -1
  178. package/dist/collections/dataloader.d.ts +1 -1
  179. package/dist/collections/dataloader.d.ts.map +1 -1
  180. package/dist/collections/endpoints/create.d.ts.map +1 -1
  181. package/dist/collections/endpoints/create.js +0 -2
  182. package/dist/collections/endpoints/create.js.map +1 -1
  183. package/dist/collections/endpoints/updateByID.d.ts.map +1 -1
  184. package/dist/collections/endpoints/updateByID.js +1 -2
  185. package/dist/collections/endpoints/updateByID.js.map +1 -1
  186. package/dist/collections/operations/count.d.ts.map +1 -1
  187. package/dist/collections/operations/count.js +1 -0
  188. package/dist/collections/operations/count.js.map +1 -1
  189. package/dist/collections/operations/countVersions.d.ts.map +1 -1
  190. package/dist/collections/operations/create.d.ts +0 -1
  191. package/dist/collections/operations/create.d.ts.map +1 -1
  192. package/dist/collections/operations/create.js +15 -6
  193. package/dist/collections/operations/create.js.map +1 -1
  194. package/dist/collections/operations/delete.d.ts.map +1 -1
  195. package/dist/collections/operations/delete.js +3 -0
  196. package/dist/collections/operations/delete.js.map +1 -1
  197. package/dist/collections/operations/deleteByID.d.ts.map +1 -1
  198. package/dist/collections/operations/duplicate.d.ts.map +1 -1
  199. package/dist/collections/operations/find.d.ts.map +1 -1
  200. package/dist/collections/operations/findByID.d.ts.map +1 -1
  201. package/dist/collections/operations/findDistinct.d.ts.map +1 -1
  202. package/dist/collections/operations/findDistinct.js +1 -0
  203. package/dist/collections/operations/findDistinct.js.map +1 -1
  204. package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
  205. package/dist/collections/operations/findVersions.d.ts.map +1 -1
  206. package/dist/collections/operations/local/count.d.ts +3 -3
  207. package/dist/collections/operations/local/count.d.ts.map +1 -1
  208. package/dist/collections/operations/local/count.js.map +1 -1
  209. package/dist/collections/operations/local/countVersions.d.ts +3 -3
  210. package/dist/collections/operations/local/countVersions.d.ts.map +1 -1
  211. package/dist/collections/operations/local/countVersions.js.map +1 -1
  212. package/dist/collections/operations/local/create.d.ts +3 -3
  213. package/dist/collections/operations/local/create.d.ts.map +1 -1
  214. package/dist/collections/operations/local/create.js.map +1 -1
  215. package/dist/collections/operations/local/delete.d.ts +3 -3
  216. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  217. package/dist/collections/operations/local/delete.js.map +1 -1
  218. package/dist/collections/operations/local/duplicate.d.ts +3 -3
  219. package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
  220. package/dist/collections/operations/local/duplicate.js.map +1 -1
  221. package/dist/collections/operations/local/find.d.ts +3 -3
  222. package/dist/collections/operations/local/find.d.ts.map +1 -1
  223. package/dist/collections/operations/local/find.js.map +1 -1
  224. package/dist/collections/operations/local/findByID.d.ts +3 -3
  225. package/dist/collections/operations/local/findByID.d.ts.map +1 -1
  226. package/dist/collections/operations/local/findByID.js.map +1 -1
  227. package/dist/collections/operations/local/findDistinct.d.ts +2 -2
  228. package/dist/collections/operations/local/findDistinct.d.ts.map +1 -1
  229. package/dist/collections/operations/local/findDistinct.js.map +1 -1
  230. package/dist/collections/operations/local/findVersionByID.d.ts +3 -3
  231. package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
  232. package/dist/collections/operations/local/findVersionByID.js.map +1 -1
  233. package/dist/collections/operations/local/findVersions.d.ts +3 -3
  234. package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
  235. package/dist/collections/operations/local/findVersions.js.map +1 -1
  236. package/dist/collections/operations/local/restoreVersion.d.ts +3 -3
  237. package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
  238. package/dist/collections/operations/local/restoreVersion.js.map +1 -1
  239. package/dist/collections/operations/local/update.d.ts +7 -11
  240. package/dist/collections/operations/local/update.d.ts.map +1 -1
  241. package/dist/collections/operations/local/update.js +1 -2
  242. package/dist/collections/operations/local/update.js.map +1 -1
  243. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  244. package/dist/collections/operations/update.d.ts +0 -1
  245. package/dist/collections/operations/update.d.ts.map +1 -1
  246. package/dist/collections/operations/update.js +8 -4
  247. package/dist/collections/operations/update.js.map +1 -1
  248. package/dist/collections/operations/updateByID.d.ts +0 -1
  249. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  250. package/dist/collections/operations/updateByID.js +1 -5
  251. package/dist/collections/operations/updateByID.js.map +1 -1
  252. package/dist/collections/operations/utilities/buildAfterOperation.d.ts +1 -1
  253. package/dist/collections/operations/utilities/buildAfterOperation.d.ts.map +1 -1
  254. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts +9 -0
  255. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts.map +1 -0
  256. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js +170 -0
  257. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js.map +1 -0
  258. package/dist/collections/operations/utilities/sanitizeSortQuery.d.ts.map +1 -1
  259. package/dist/collections/operations/utilities/types.d.ts +20 -29
  260. package/dist/collections/operations/utilities/types.d.ts.map +1 -1
  261. package/dist/collections/operations/utilities/types.js.map +1 -1
  262. package/dist/collections/operations/utilities/update.d.ts +1 -2
  263. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  264. package/dist/collections/operations/utilities/update.js +64 -65
  265. package/dist/collections/operations/utilities/update.js.map +1 -1
  266. package/dist/config/client.d.ts +2 -2
  267. package/dist/config/client.d.ts.map +1 -1
  268. package/dist/config/client.js.map +1 -1
  269. package/dist/config/defaults.d.ts +0 -4
  270. package/dist/config/defaults.d.ts.map +1 -1
  271. package/dist/config/defaults.js +0 -78
  272. package/dist/config/defaults.js.map +1 -1
  273. package/dist/config/definePlugin.d.ts +10 -10
  274. package/dist/config/definePlugin.d.ts.map +1 -1
  275. package/dist/config/definePlugin.js +7 -11
  276. package/dist/config/definePlugin.js.map +1 -1
  277. package/dist/config/orderable/fractional-indexing.d.ts +23 -23
  278. package/dist/config/orderable/fractional-indexing.d.ts.map +1 -1
  279. package/dist/config/orderable/index.d.ts.map +1 -1
  280. package/dist/config/orderable/index.js +23 -0
  281. package/dist/config/orderable/index.js.map +1 -1
  282. package/dist/config/sanitize.d.ts.map +1 -1
  283. package/dist/config/sanitize.js +141 -13
  284. package/dist/config/sanitize.js.map +1 -1
  285. package/dist/config/types.d.ts +67 -20
  286. package/dist/config/types.d.ts.map +1 -1
  287. package/dist/config/types.js +2 -0
  288. package/dist/config/types.js.map +1 -1
  289. package/dist/database/combineQueries.d.ts.map +1 -1
  290. package/dist/database/getLocalizedPaths.d.ts.map +1 -1
  291. package/dist/database/getLocalizedPaths.js +1 -1
  292. package/dist/database/getLocalizedPaths.js.map +1 -1
  293. package/dist/database/migrations/findMigrationDir.d.ts.map +1 -1
  294. package/dist/database/migrations/getPredefinedMigration.d.ts.map +1 -1
  295. package/dist/database/migrations/migrationsCollection.d.ts.map +1 -1
  296. package/dist/database/migrations/migrationsCollection.js +2 -1
  297. package/dist/database/migrations/migrationsCollection.js.map +1 -1
  298. package/dist/database/migrations/readMigrationFiles.d.ts.map +1 -1
  299. package/dist/database/migrations/writeMigrationIndex.d.ts.map +1 -1
  300. package/dist/database/sanitizeJoinQuery.d.ts.map +1 -1
  301. package/dist/database/sanitizeWhereQuery.d.ts.map +1 -1
  302. package/dist/database/types.d.ts +1 -5
  303. package/dist/database/types.d.ts.map +1 -1
  304. package/dist/database/types.js.map +1 -1
  305. package/dist/duplicateDocument/index.d.ts.map +1 -1
  306. package/dist/email/getStringifiedToAddress.d.ts.map +1 -1
  307. package/dist/errors/APIError.d.ts.map +1 -1
  308. package/dist/errors/AuthenticationError.d.ts.map +1 -1
  309. package/dist/errors/DuplicateCollection.d.ts.map +1 -1
  310. package/dist/errors/DuplicateFieldName.d.ts.map +1 -1
  311. package/dist/errors/DuplicateGlobal.d.ts.map +1 -1
  312. package/dist/errors/ErrorDeletingFile.d.ts.map +1 -1
  313. package/dist/errors/FileRetrievalError.d.ts.map +1 -1
  314. package/dist/errors/FileUploadError.d.ts.map +1 -1
  315. package/dist/errors/Forbidden.d.ts.map +1 -1
  316. package/dist/errors/InvalidConfiguration.d.ts.map +1 -1
  317. package/dist/errors/InvalidFieldJoin.d.ts.map +1 -1
  318. package/dist/errors/InvalidFieldName.d.ts.map +1 -1
  319. package/dist/errors/InvalidFieldRelationship.d.ts.map +1 -1
  320. package/dist/errors/InvalidSchema.d.ts.map +1 -1
  321. package/dist/errors/Locked.d.ts.map +1 -1
  322. package/dist/errors/LockedAuth.d.ts.map +1 -1
  323. package/dist/errors/MissingCollectionLabel.d.ts.map +1 -1
  324. package/dist/errors/MissingEditorProp.d.ts.map +1 -1
  325. package/dist/errors/MissingFieldInputOptions.d.ts.map +1 -1
  326. package/dist/errors/MissingFieldType.d.ts.map +1 -1
  327. package/dist/errors/MissingFile.d.ts.map +1 -1
  328. package/dist/errors/NotFound.d.ts.map +1 -1
  329. package/dist/errors/QueryError.d.ts.map +1 -1
  330. package/dist/errors/ReservedFieldName.d.ts.map +1 -1
  331. package/dist/errors/TimestampsRequired.d.ts.map +1 -1
  332. package/dist/errors/UnauthorizedError.d.ts.map +1 -1
  333. package/dist/errors/UnverifiedEmail.d.ts.map +1 -1
  334. package/dist/errors/ValidationError.d.ts +1 -0
  335. package/dist/errors/ValidationError.d.ts.map +1 -1
  336. package/dist/errors/ValidationError.js.map +1 -1
  337. package/dist/exports/internal.d.ts +2 -0
  338. package/dist/exports/internal.d.ts.map +1 -1
  339. package/dist/exports/internal.js +2 -0
  340. package/dist/exports/internal.js.map +1 -1
  341. package/dist/exports/migrations.d.ts +5 -13
  342. package/dist/exports/migrations.d.ts.map +1 -1
  343. package/dist/exports/migrations.js +5 -13
  344. package/dist/exports/migrations.js.map +1 -1
  345. package/dist/exports/shared.d.ts +23 -2
  346. package/dist/exports/shared.d.ts.map +1 -1
  347. package/dist/exports/shared.js +22 -1
  348. package/dist/exports/shared.js.map +1 -1
  349. package/dist/fields/baseFields/slug/countVersions.d.ts.map +1 -1
  350. package/dist/fields/baseFields/slug/countVersions.js +6 -8
  351. package/dist/fields/baseFields/slug/countVersions.js.map +1 -1
  352. package/dist/fields/baseFields/slug/generateSlug.d.ts +14 -7
  353. package/dist/fields/baseFields/slug/generateSlug.d.ts.map +1 -1
  354. package/dist/fields/baseFields/slug/generateSlug.js +53 -73
  355. package/dist/fields/baseFields/slug/generateSlug.js.map +1 -1
  356. package/dist/fields/baseFields/slug/types.d.ts +14 -0
  357. package/dist/fields/baseFields/slug/types.d.ts.map +1 -0
  358. package/dist/fields/baseFields/slug/types.js +6 -0
  359. package/dist/fields/baseFields/slug/types.js.map +1 -0
  360. package/dist/fields/config/client.d.ts +6 -6
  361. package/dist/fields/config/client.d.ts.map +1 -1
  362. package/dist/fields/config/client.js +14 -14
  363. package/dist/fields/config/client.js.map +1 -1
  364. package/dist/fields/config/sanitize.d.ts.map +1 -1
  365. package/dist/fields/config/sanitize.js +40 -4
  366. package/dist/fields/config/sanitize.js.map +1 -1
  367. package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
  368. package/dist/fields/config/types.d.ts +80 -76
  369. package/dist/fields/config/types.d.ts.map +1 -1
  370. package/dist/fields/config/types.js.map +1 -1
  371. package/dist/fields/getDefaultValue.d.ts.map +1 -1
  372. package/dist/fields/hooks/afterChange/index.d.ts.map +1 -1
  373. package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
  374. package/dist/fields/hooks/afterChange/promise.js +1 -1
  375. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  376. package/dist/fields/hooks/afterChange/traverseFields.d.ts.map +1 -1
  377. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  378. package/dist/fields/hooks/afterRead/promise.js +13 -3
  379. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  380. package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
  381. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  382. package/dist/fields/hooks/afterRead/virtualFieldPopulationPromise.d.ts.map +1 -1
  383. package/dist/fields/hooks/beforeChange/cloneDataFromOriginalDoc.d.ts.map +1 -1
  384. package/dist/fields/hooks/beforeChange/getExistingRowDoc.d.ts.map +1 -1
  385. package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
  386. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  387. package/dist/fields/hooks/beforeChange/promise.js +3 -3
  388. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  389. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  390. package/dist/fields/hooks/beforeDuplicate/index.d.ts.map +1 -1
  391. package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
  392. package/dist/fields/hooks/beforeDuplicate/promise.js +2 -2
  393. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  394. package/dist/fields/hooks/beforeDuplicate/traverseFields.d.ts.map +1 -1
  395. package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
  396. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  397. package/dist/fields/hooks/beforeValidate/promise.js +11 -2
  398. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  399. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  400. package/dist/fields/isFieldDisabled.d.ts.map +1 -1
  401. package/dist/fields/mergeBaseFields.d.ts.map +1 -1
  402. package/dist/fields/setDefaultBeforeDuplicate.d.ts.map +1 -1
  403. package/dist/fields/setDefaultBeforeDuplicate.js +1 -0
  404. package/dist/fields/setDefaultBeforeDuplicate.js.map +1 -1
  405. package/dist/fields/sortableFieldTypes.d.ts.map +1 -1
  406. package/dist/fields/sortableFieldTypes.js +1 -0
  407. package/dist/fields/sortableFieldTypes.js.map +1 -1
  408. package/dist/fields/validations.d.ts +4 -1
  409. package/dist/fields/validations.d.ts.map +1 -1
  410. package/dist/fields/validations.js +12 -4
  411. package/dist/fields/validations.js.map +1 -1
  412. package/dist/globals/config/client.d.ts +4 -4
  413. package/dist/globals/config/client.d.ts.map +1 -1
  414. package/dist/globals/config/sanitize.d.ts.map +1 -1
  415. package/dist/globals/config/sanitize.js +2 -6
  416. package/dist/globals/config/sanitize.js.map +1 -1
  417. package/dist/globals/config/sanitize.spec.js +43 -0
  418. package/dist/globals/config/sanitize.spec.js.map +1 -0
  419. package/dist/globals/endpoints/update.d.ts.map +1 -1
  420. package/dist/globals/endpoints/update.js +0 -2
  421. package/dist/globals/endpoints/update.js.map +1 -1
  422. package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -1
  423. package/dist/globals/operations/docAccess.d.ts.map +1 -1
  424. package/dist/globals/operations/findOne.d.ts.map +1 -1
  425. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  426. package/dist/globals/operations/findVersions.d.ts.map +1 -1
  427. package/dist/globals/operations/local/countVersions.d.ts +3 -3
  428. package/dist/globals/operations/local/countVersions.d.ts.map +1 -1
  429. package/dist/globals/operations/local/countVersions.js.map +1 -1
  430. package/dist/globals/operations/local/findOne.d.ts +3 -3
  431. package/dist/globals/operations/local/findOne.d.ts.map +1 -1
  432. package/dist/globals/operations/local/findOne.js.map +1 -1
  433. package/dist/globals/operations/local/findVersionByID.d.ts +3 -3
  434. package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
  435. package/dist/globals/operations/local/findVersionByID.js.map +1 -1
  436. package/dist/globals/operations/local/findVersions.d.ts +3 -3
  437. package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
  438. package/dist/globals/operations/local/findVersions.js.map +1 -1
  439. package/dist/globals/operations/local/restoreVersion.d.ts +3 -3
  440. package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
  441. package/dist/globals/operations/local/restoreVersion.js.map +1 -1
  442. package/dist/globals/operations/local/update.d.ts +7 -9
  443. package/dist/globals/operations/local/update.d.ts.map +1 -1
  444. package/dist/globals/operations/local/update.js +1 -2
  445. package/dist/globals/operations/local/update.js.map +1 -1
  446. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  447. package/dist/globals/operations/update.d.ts +0 -1
  448. package/dist/globals/operations/update.d.ts.map +1 -1
  449. package/dist/globals/operations/update.js +52 -58
  450. package/dist/globals/operations/update.js.map +1 -1
  451. package/dist/hierarchy/addHierarchyToCollection.d.ts.map +1 -1
  452. package/dist/hierarchy/buildParentField.d.ts.map +1 -1
  453. package/dist/hierarchy/constants.d.ts.map +1 -1
  454. package/dist/hierarchy/getInitialTreeData.d.ts.map +1 -1
  455. package/dist/hierarchy/hooks/collectionAfterDelete.d.ts.map +1 -1
  456. package/dist/hierarchy/hooks/collectionAfterRead.d.ts.map +1 -1
  457. package/dist/hierarchy/hooks/collectionBeforeChange.d.ts.map +1 -1
  458. package/dist/hierarchy/hooks/collectionBeforeDelete.d.ts.map +1 -1
  459. package/dist/hierarchy/hooks/collectionBeforeOperation.d.ts.map +1 -1
  460. package/dist/hierarchy/hooks/ensureSafeCollectionsChange.d.ts.map +1 -1
  461. package/dist/hierarchy/injectHierarchyButton.d.ts.map +1 -1
  462. package/dist/hierarchy/resolveHierarchyCollections.d.ts.map +1 -1
  463. package/dist/hierarchy/resolveHierarchyCollections.js +1 -1
  464. package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
  465. package/dist/hierarchy/sanitizeHierarchyCollection.d.ts.map +1 -1
  466. package/dist/hierarchy/sanitizeHierarchyCollection.js +3 -1
  467. package/dist/hierarchy/sanitizeHierarchyCollection.js.map +1 -1
  468. package/dist/hierarchy/types.d.ts +8 -1
  469. package/dist/hierarchy/types.d.ts.map +1 -1
  470. package/dist/hierarchy/types.js.map +1 -1
  471. package/dist/index.bundled.d.ts +4466 -4152
  472. package/dist/index.d.ts +79 -34
  473. package/dist/index.d.ts.map +1 -1
  474. package/dist/index.js +54 -37
  475. package/dist/index.js.map +1 -1
  476. package/dist/kv/adapters/DatabaseKVAdapter.d.ts.map +1 -1
  477. package/dist/kv/adapters/DatabaseKVAdapter.js +1 -0
  478. package/dist/kv/adapters/DatabaseKVAdapter.js.map +1 -1
  479. package/dist/kv/adapters/InMemoryKVAdapter.d.ts.map +1 -1
  480. package/dist/locked-documents/config.d.ts.map +1 -1
  481. package/dist/locked-documents/config.js +2 -1
  482. package/dist/locked-documents/config.js.map +1 -1
  483. package/dist/preferences/config.d.ts.map +1 -1
  484. package/dist/preferences/config.js +2 -1
  485. package/dist/preferences/config.js.map +1 -1
  486. package/dist/preferences/deleteUserPreferences.d.ts.map +1 -1
  487. package/dist/preferences/keys.d.ts +8 -4
  488. package/dist/preferences/keys.d.ts.map +1 -1
  489. package/dist/preferences/keys.js +4 -1
  490. package/dist/preferences/keys.js.map +1 -1
  491. package/dist/preferences/types.d.ts +15 -0
  492. package/dist/preferences/types.d.ts.map +1 -1
  493. package/dist/preferences/types.js +3 -1
  494. package/dist/preferences/types.js.map +1 -1
  495. package/dist/query-presets/access.d.ts.map +1 -1
  496. package/dist/query-presets/config.d.ts.map +1 -1
  497. package/dist/query-presets/config.js +77 -37
  498. package/dist/query-presets/config.js.map +1 -1
  499. package/dist/query-presets/constraints.d.ts.map +1 -1
  500. package/dist/query-presets/constraints.js +3 -2
  501. package/dist/query-presets/constraints.js.map +1 -1
  502. package/dist/query-presets/types.d.ts +1 -1
  503. package/dist/query-presets/types.d.ts.map +1 -1
  504. package/dist/queues/config/collection.d.ts.map +1 -1
  505. package/dist/queues/config/collection.js +2 -1
  506. package/dist/queues/config/collection.js.map +1 -1
  507. package/dist/queues/config/generateJobsJSONSchemas.d.ts +1 -1
  508. package/dist/queues/config/generateJobsJSONSchemas.d.ts.map +1 -1
  509. package/dist/queues/config/generateJobsJSONSchemas.js +33 -12
  510. package/dist/queues/config/generateJobsJSONSchemas.js.map +1 -1
  511. package/dist/queues/config/global.d.ts.map +1 -1
  512. package/dist/queues/config/global.js +2 -1
  513. package/dist/queues/config/global.js.map +1 -1
  514. package/dist/queues/endpoints/run.d.ts.map +1 -1
  515. package/dist/queues/errors/index.d.ts.map +1 -1
  516. package/dist/queues/localAPI.d.ts +8 -8
  517. package/dist/queues/localAPI.d.ts.map +1 -1
  518. package/dist/queues/operations/handleSchedules/getQueuesWithSchedules.d.ts.map +1 -1
  519. package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
  520. package/dist/queues/operations/runJobs/runJSONJob/index.d.ts.map +1 -1
  521. package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.d.ts.map +1 -1
  522. package/dist/queues/operations/runJobs/runJob/importHandlerPath.d.ts +1 -1
  523. package/dist/queues/operations/runJobs/runJob/importHandlerPath.d.ts.map +1 -1
  524. package/dist/queues/operations/runJobs/runJob/index.d.ts.map +1 -1
  525. package/dist/queues/utilities/getCurrentDate.d.ts.map +1 -1
  526. package/dist/queues/utilities/getJobTaskStatus.d.ts.map +1 -1
  527. package/dist/translations/getLocalI18n.d.ts.map +1 -1
  528. package/dist/types/constants.d.ts +2 -2
  529. package/dist/types/constants.d.ts.map +1 -1
  530. package/dist/types/index.d.ts +9 -7
  531. package/dist/types/index.d.ts.map +1 -1
  532. package/dist/types/index.js.map +1 -1
  533. package/dist/uploads/checkFileAccess.d.ts.map +1 -1
  534. package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
  535. package/dist/uploads/cropImage.d.ts.map +1 -1
  536. package/dist/uploads/docWithFilenameExists.d.ts.map +1 -1
  537. package/dist/uploads/endpoints/uploadInstructions.d.ts +3 -0
  538. package/dist/uploads/endpoints/uploadInstructions.d.ts.map +1 -0
  539. package/dist/uploads/endpoints/uploadInstructions.js +38 -0
  540. package/dist/uploads/endpoints/uploadInstructions.js.map +1 -0
  541. package/dist/uploads/fetchAPI-multipart/isEligibleRequest.d.ts.map +1 -1
  542. package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
  543. package/dist/uploads/fetchAPI-multipart/processMultipart.js +4 -0
  544. package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
  545. package/dist/uploads/fetchAPI-multipart/processNested.d.ts.map +1 -1
  546. package/dist/uploads/fetchAPI-multipart/utilities.d.ts.map +1 -1
  547. package/dist/uploads/fileExists.d.ts.map +1 -1
  548. package/dist/uploads/generateFileData.d.ts +2 -1
  549. package/dist/uploads/generateFileData.d.ts.map +1 -1
  550. package/dist/uploads/generateFileData.js +5 -2
  551. package/dist/uploads/generateFileData.js.map +1 -1
  552. package/dist/uploads/getBaseFields.d.ts.map +1 -1
  553. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  554. package/dist/uploads/getFileByPath.d.ts +1 -1
  555. package/dist/uploads/getFileByPath.d.ts.map +1 -1
  556. package/dist/uploads/getFileTypeFallback.d.ts.map +1 -1
  557. package/dist/uploads/getSafeFilename.d.ts.map +1 -1
  558. package/dist/uploads/image-resizing/createImageSize.d.ts.map +1 -1
  559. package/dist/uploads/image-resizing/generateImageSizeFilename.d.ts.map +1 -1
  560. package/dist/uploads/image-resizing/getImageResizeAction.d.ts +1 -1
  561. package/dist/uploads/image-resizing/getImageResizeAction.d.ts.map +1 -1
  562. package/dist/uploads/image-resizing/parseFilename.d.ts.map +1 -1
  563. package/dist/uploads/image-resizing/sanitizeResizeConfig.d.ts.map +1 -1
  564. package/dist/uploads/matchMimeType.d.ts +8 -0
  565. package/dist/uploads/matchMimeType.d.ts.map +1 -0
  566. package/dist/uploads/matchMimeType.js +19 -0
  567. package/dist/uploads/matchMimeType.js.map +1 -0
  568. package/dist/uploads/matchMimeType.spec.js +66 -0
  569. package/dist/uploads/matchMimeType.spec.js.map +1 -0
  570. package/dist/uploads/mimeTypeValidator.d.ts.map +1 -1
  571. package/dist/uploads/safeFetch.d.ts.map +1 -1
  572. package/dist/uploads/safeFetch.js +11 -5
  573. package/dist/uploads/safeFetch.js.map +1 -1
  574. package/dist/uploads/saveBufferToFile.d.ts.map +1 -1
  575. package/dist/uploads/tempFile.d.ts.map +1 -1
  576. package/dist/uploads/types.d.ts +68 -1
  577. package/dist/uploads/types.d.ts.map +1 -1
  578. package/dist/uploads/types.js.map +1 -1
  579. package/dist/uploads/uploadFiles.d.ts.map +1 -1
  580. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  581. package/dist/utilities/addDataAndFileToRequest.js +11 -4
  582. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  583. package/dist/utilities/addLocalesToRequest.d.ts.map +1 -1
  584. package/dist/utilities/addSelectGenericsToGeneretedTypes.d.ts.map +1 -1
  585. package/dist/utilities/appendDateTimezoneSelectFields.d.ts.map +1 -1
  586. package/dist/utilities/appendDateTimezoneSelectFields.js +2 -2
  587. package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
  588. package/dist/utilities/appendNonTrashedFilter.d.ts.map +1 -1
  589. package/dist/utilities/appendUploadSelectFields.d.ts.map +1 -1
  590. package/dist/utilities/canAccessAdmin.d.ts.map +1 -1
  591. package/dist/utilities/checkDocumentLockStatus.d.ts.map +1 -1
  592. package/dist/utilities/configToJSONSchema.d.ts +68 -16
  593. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  594. package/dist/utilities/configToJSONSchema.js +312 -117
  595. package/dist/utilities/configToJSONSchema.js.map +1 -1
  596. package/dist/utilities/configToJSONSchema.spec.js +656 -85
  597. package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
  598. package/dist/utilities/createLocalReq.d.ts +2 -2
  599. package/dist/utilities/createLocalReq.d.ts.map +1 -1
  600. package/dist/utilities/createLocalReq.js.map +1 -1
  601. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  602. package/dist/utilities/createPayloadRequest.js +1 -0
  603. package/dist/utilities/createPayloadRequest.js.map +1 -1
  604. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  605. package/dist/utilities/deepCopyObject.js +8 -0
  606. package/dist/utilities/deepCopyObject.js.map +1 -1
  607. package/dist/utilities/dependencies/dependencyChecker.js +1 -1
  608. package/dist/utilities/dependencies/dependencyChecker.js.map +1 -1
  609. package/dist/utilities/dependencies/getDependencies.d.ts.map +1 -1
  610. package/dist/utilities/dependencies/getDependencies.js +5 -5
  611. package/dist/utilities/dependencies/getDependencies.js.map +1 -1
  612. package/dist/utilities/dependencies/resolveFrom.d.ts.map +1 -1
  613. package/dist/utilities/dynamicImport.js +1 -1
  614. package/dist/utilities/dynamicImport.js.map +1 -1
  615. package/dist/utilities/escapeRegExp.d.ts.map +1 -1
  616. package/dist/utilities/extractID.d.ts.map +1 -1
  617. package/dist/utilities/filterDataToSelectedLocales.d.ts.map +1 -1
  618. package/dist/utilities/filterDataToSelectedLocales.js +5 -12
  619. package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
  620. package/dist/utilities/filterDataToSelectedLocales.spec.js +1 -2
  621. package/dist/utilities/filterDataToSelectedLocales.spec.js.map +1 -1
  622. package/dist/utilities/flattenAllFields.d.ts.map +1 -1
  623. package/dist/utilities/flattenAllFields.js +7 -22
  624. package/dist/utilities/flattenAllFields.js.map +1 -1
  625. package/dist/utilities/formatAdminURL.d.ts.map +1 -1
  626. package/dist/utilities/formatErrors.d.ts.map +1 -1
  627. package/dist/utilities/formatErrors.js +3 -1
  628. package/dist/utilities/formatErrors.js.map +1 -1
  629. package/dist/utilities/formatLabels.d.ts.map +1 -1
  630. package/dist/utilities/getBestFitFromSizes.d.ts.map +1 -1
  631. package/dist/utilities/getBlockSelect.d.ts.map +1 -1
  632. package/dist/utilities/getDataByPath.d.ts.map +1 -1
  633. package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
  634. package/dist/utilities/getEntityPermissions/getEntityPermissions.js +2 -0
  635. package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
  636. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts +7 -1
  637. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts.map +1 -1
  638. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js +24 -7
  639. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
  640. package/dist/utilities/getFieldByPath.d.ts.map +1 -1
  641. package/dist/utilities/getFieldByPath.js +1 -1
  642. package/dist/utilities/getFieldByPath.js.map +1 -1
  643. package/dist/utilities/getFieldPermissions.d.ts.map +1 -1
  644. package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
  645. package/dist/utilities/getRequestEntity.d.ts.map +1 -1
  646. package/dist/utilities/getRequestLanguage.d.ts +2 -2
  647. package/dist/utilities/getRequestLanguage.d.ts.map +1 -1
  648. package/dist/utilities/getRequestLanguage.js.map +1 -1
  649. package/dist/utilities/getRequestOrigin.d.ts +2 -2
  650. package/dist/utilities/getRequestOrigin.d.ts.map +1 -1
  651. package/dist/utilities/getSafeRedirect.d.ts.map +1 -1
  652. package/dist/utilities/getSelectMode.d.ts.map +1 -1
  653. package/dist/utilities/getSiblingData.d.ts.map +1 -1
  654. package/dist/utilities/getTranslatedLabel.d.ts.map +1 -1
  655. package/dist/utilities/getVersionsConfig.d.ts +1 -1
  656. package/dist/utilities/getVersionsConfig.d.ts.map +1 -1
  657. package/dist/utilities/getVersionsConfig.js.map +1 -1
  658. package/dist/utilities/handleEndpoints.d.ts.map +1 -1
  659. package/dist/utilities/handleEndpoints.js +7 -3
  660. package/dist/utilities/handleEndpoints.js.map +1 -1
  661. package/dist/utilities/headersWithCors.d.ts.map +1 -1
  662. package/dist/utilities/isEntityHidden.d.ts +2 -2
  663. package/dist/utilities/isEntityHidden.d.ts.map +1 -1
  664. package/dist/utilities/isURLAllowed.d.ts.map +1 -1
  665. package/dist/utilities/isURLAllowed.js +9 -3
  666. package/dist/utilities/isURLAllowed.js.map +1 -1
  667. package/dist/utilities/isURLAllowed.spec.js +78 -0
  668. package/dist/utilities/isURLAllowed.spec.js.map +1 -0
  669. package/dist/utilities/isValidID.d.ts +1 -1
  670. package/dist/utilities/isValidID.d.ts.map +1 -1
  671. package/dist/utilities/logError.d.ts.map +1 -1
  672. package/dist/utilities/logger.d.ts +1 -1
  673. package/dist/utilities/logger.d.ts.map +1 -1
  674. package/dist/utilities/mergeHeaders.d.ts.map +1 -1
  675. package/dist/utilities/mergeListSearchAndWhere.d.ts.map +1 -1
  676. package/dist/utilities/mergeLocalizedData.d.ts +14 -4
  677. package/dist/utilities/mergeLocalizedData.d.ts.map +1 -1
  678. package/dist/utilities/mergeLocalizedData.js +54 -46
  679. package/dist/utilities/mergeLocalizedData.js.map +1 -1
  680. package/dist/utilities/mergeLocalizedData.spec.js +23 -23
  681. package/dist/utilities/mergeLocalizedData.spec.js.map +1 -1
  682. package/dist/utilities/miniChalk.d.ts.map +1 -1
  683. package/dist/utilities/optionsAreEqual.d.ts.map +1 -1
  684. package/dist/utilities/parseBooleanString.d.ts.map +1 -1
  685. package/dist/utilities/parseCookies.d.ts +1 -1
  686. package/dist/utilities/parseCookies.d.ts.map +1 -1
  687. package/dist/utilities/parseParams/index.d.ts +2 -5
  688. package/dist/utilities/parseParams/index.d.ts.map +1 -1
  689. package/dist/utilities/parseParams/index.js.map +1 -1
  690. package/dist/utilities/parseParams/index.spec.js +0 -9
  691. package/dist/utilities/parseParams/index.spec.js.map +1 -1
  692. package/dist/utilities/profiling.d.ts.map +1 -1
  693. package/dist/utilities/reduceFieldsToValues.d.ts.map +1 -1
  694. package/dist/utilities/resolveSelect.d.ts.map +1 -1
  695. package/dist/utilities/routeError.d.ts.map +1 -1
  696. package/dist/utilities/sanitizeFallbackLocale.d.ts.map +1 -1
  697. package/dist/utilities/sanitizeInternalFields.d.ts.map +1 -1
  698. package/dist/utilities/sanitizeJoinParams.d.ts.map +1 -1
  699. package/dist/utilities/sanitizePopulateParam.d.ts.map +1 -1
  700. package/dist/utilities/sanitizeSelect.d.ts.map +1 -1
  701. package/dist/utilities/sanitizeSelectParam.d.ts.map +1 -1
  702. package/dist/utilities/sanitizeSortParams.d.ts.map +1 -1
  703. package/dist/utilities/setsAreEqual.d.ts.map +1 -1
  704. package/dist/utilities/slugify.d.ts.map +1 -1
  705. package/dist/utilities/stripUnselectedFields.d.ts.map +1 -1
  706. package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
  707. package/dist/utilities/telemetry/events/adminInit.d.ts.map +1 -1
  708. package/dist/utilities/telemetry/events/adminInit.js +2 -3
  709. package/dist/utilities/telemetry/events/adminInit.js.map +1 -1
  710. package/dist/utilities/telemetry/events/serverInit.d.ts.map +1 -1
  711. package/dist/utilities/telemetry/events/serverInit.js +2 -3
  712. package/dist/utilities/telemetry/events/serverInit.js.map +1 -1
  713. package/dist/utilities/telemetry/index.d.ts +15 -4
  714. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  715. package/dist/utilities/telemetry/index.js +6 -1
  716. package/dist/utilities/telemetry/index.js.map +1 -1
  717. package/dist/utilities/telemetry/index.spec.js +43 -0
  718. package/dist/utilities/telemetry/index.spec.js.map +1 -0
  719. package/dist/utilities/telemetry/oneWayHash.d.ts.map +1 -1
  720. package/dist/utilities/timestamp.d.ts.map +1 -1
  721. package/dist/utilities/toKebabCase.d.ts.map +1 -1
  722. package/dist/utilities/transformColumnPreferences.d.ts.map +1 -1
  723. package/dist/utilities/transformColumnPreferences.js +4 -2
  724. package/dist/utilities/transformColumnPreferences.js.map +1 -1
  725. package/dist/utilities/transformWhereQuery.d.ts.map +1 -1
  726. package/dist/utilities/traverseFields.d.ts.map +1 -1
  727. package/dist/utilities/traverseFields.js +2 -4
  728. package/dist/utilities/traverseFields.js.map +1 -1
  729. package/dist/utilities/traverseForLocalizedFields.d.ts.map +1 -1
  730. package/dist/utilities/traverseForLocalizedFields.js +3 -0
  731. package/dist/utilities/traverseForLocalizedFields.js.map +1 -1
  732. package/dist/utilities/unflatten.d.ts.map +1 -1
  733. package/dist/utilities/validateMimeType.d.ts.map +1 -1
  734. package/dist/utilities/validateTimezones.d.ts.map +1 -1
  735. package/dist/utilities/validateWhereQuery.d.ts.map +1 -1
  736. package/dist/utilities/wordBoundariesRegex.d.ts.map +1 -1
  737. package/dist/utilities/wrapInternalEndpoints.d.ts.map +1 -1
  738. package/dist/versions/baseFields.d.ts +1 -2
  739. package/dist/versions/baseFields.d.ts.map +1 -1
  740. package/dist/versions/baseFields.js +0 -13
  741. package/dist/versions/baseFields.js.map +1 -1
  742. package/dist/versions/buildCollectionFields.d.ts.map +1 -1
  743. package/dist/versions/buildCollectionFields.js +0 -2
  744. package/dist/versions/buildCollectionFields.js.map +1 -1
  745. package/dist/versions/buildGlobalFields.d.ts.map +1 -1
  746. package/dist/versions/buildGlobalFields.js +0 -2
  747. package/dist/versions/buildGlobalFields.js.map +1 -1
  748. package/dist/versions/buildSingleLocalePublishData.d.ts +32 -0
  749. package/dist/versions/buildSingleLocalePublishData.d.ts.map +1 -0
  750. package/dist/versions/buildSingleLocalePublishData.js +37 -0
  751. package/dist/versions/buildSingleLocalePublishData.js.map +1 -0
  752. package/dist/versions/buildVersionCompoundIndexes.d.ts.map +1 -1
  753. package/dist/versions/defaults.d.ts.map +1 -1
  754. package/dist/versions/deleteCollectionVersions.d.ts.map +1 -1
  755. package/dist/versions/deleteScheduledPublishJobs.d.ts.map +1 -1
  756. package/dist/versions/drafts/appendVersionToQueryKey.d.ts.map +1 -1
  757. package/dist/versions/drafts/getQueryDraftsSelect.d.ts.map +1 -1
  758. package/dist/versions/drafts/getQueryDraftsSort.d.ts.map +1 -1
  759. package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
  760. package/dist/versions/enforceMaxVersions.d.ts.map +1 -1
  761. package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
  762. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  763. package/dist/versions/migrations/localizeStatus/shared.d.ts.map +1 -1
  764. package/dist/versions/saveVersion.d.ts +0 -2
  765. package/dist/versions/saveVersion.d.ts.map +1 -1
  766. package/dist/versions/saveVersion.js +12 -17
  767. package/dist/versions/saveVersion.js.map +1 -1
  768. package/dist/versions/schedule/job.d.ts.map +1 -1
  769. package/dist/versions/schedule/job.js +6 -10
  770. package/dist/versions/schedule/job.js.map +1 -1
  771. package/dist/versions/types.d.ts +2 -15
  772. package/dist/versions/types.d.ts.map +1 -1
  773. package/dist/versions/types.js.map +1 -1
  774. package/package.json +9 -6
  775. package/dist/database/migrations/templates/localizeStatus.d.ts +0 -10
  776. package/dist/database/migrations/templates/localizeStatus.d.ts.map +0 -1
  777. package/dist/database/migrations/templates/localizeStatus.js +0 -54
  778. package/dist/database/migrations/templates/localizeStatus.js.map +0 -1
  779. package/dist/fields/baseFields/slug/index.d.ts +0 -89
  780. package/dist/fields/baseFields/slug/index.d.ts.map +0 -1
  781. package/dist/fields/baseFields/slug/index.js +0 -81
  782. package/dist/fields/baseFields/slug/index.js.map +0 -1
  783. package/dist/versions/migrations/localizeStatus/index.d.ts +0 -12
  784. package/dist/versions/migrations/localizeStatus/index.d.ts.map +0 -1
  785. package/dist/versions/migrations/localizeStatus/index.js +0 -33
  786. package/dist/versions/migrations/localizeStatus/index.js.map +0 -1
  787. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts +0 -9
  788. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts.map +0 -1
  789. package/dist/versions/migrations/localizeStatus/mongo/down.js +0 -112
  790. package/dist/versions/migrations/localizeStatus/mongo/down.js.map +0 -1
  791. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts +0 -8
  792. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts.map +0 -1
  793. package/dist/versions/migrations/localizeStatus/mongo/index.js +0 -8
  794. package/dist/versions/migrations/localizeStatus/mongo/index.js.map +0 -1
  795. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts +0 -9
  796. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts.map +0 -1
  797. package/dist/versions/migrations/localizeStatus/mongo/up.js +0 -220
  798. package/dist/versions/migrations/localizeStatus/mongo/up.js.map +0 -1
  799. package/dist/versions/migrations/localizeStatus/sql/down.d.ts +0 -11
  800. package/dist/versions/migrations/localizeStatus/sql/down.d.ts.map +0 -1
  801. package/dist/versions/migrations/localizeStatus/sql/down.js +0 -213
  802. package/dist/versions/migrations/localizeStatus/sql/down.js.map +0 -1
  803. package/dist/versions/migrations/localizeStatus/sql/index.d.ts +0 -8
  804. package/dist/versions/migrations/localizeStatus/sql/index.d.ts.map +0 -1
  805. package/dist/versions/migrations/localizeStatus/sql/index.js +0 -8
  806. package/dist/versions/migrations/localizeStatus/sql/index.js.map +0 -1
  807. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts +0 -13
  808. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts.map +0 -1
  809. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js +0 -51
  810. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js.map +0 -1
  811. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts +0 -13
  812. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts.map +0 -1
  813. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js +0 -54
  814. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js.map +0 -1
  815. package/dist/versions/migrations/localizeStatus/sql/up.d.ts +0 -11
  816. package/dist/versions/migrations/localizeStatus/sql/up.d.ts.map +0 -1
  817. package/dist/versions/migrations/localizeStatus/sql/up.js +0 -277
  818. package/dist/versions/migrations/localizeStatus/sql/up.js.map +0 -1
  819. package/dist/versions/saveSnapshot.d.ts +0 -18
  820. package/dist/versions/saveSnapshot.d.ts.map +0 -1
  821. package/dist/versions/saveSnapshot.js +0 -38
  822. package/dist/versions/saveSnapshot.js.map +0 -1
@@ -66,18 +66,11 @@ import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/
66
66
  return rows;
67
67
  }
68
68
  return rows.map((blockData)=>{
69
- let block;
70
- if (configBlockReferences && field.blockReferences) {
71
- for (const blockOrReference of field.blockReferences){
72
- if (typeof blockOrReference === 'string') {
73
- block = configBlockReferences.find((b)=>b.slug === blockData.blockType);
74
- } else {
75
- block = blockOrReference;
76
- }
77
- }
78
- } else if (field.blocks) {
79
- block = field.blocks.find((b)=>b.slug === blockData.blockType);
80
- }
69
+ const blockOrSlug = field.blocks.find((b)=>{
70
+ const slug = typeof b === 'string' ? b : b.slug;
71
+ return slug === blockData.blockType;
72
+ });
73
+ const block = typeof blockOrSlug === 'string' ? configBlockReferences?.find((b)=>b.slug === blockOrSlug) : blockOrSlug;
81
74
  if (block) {
82
75
  const filtered = filterDataToSelectedLocales({
83
76
  configBlockReferences,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/filterDataToSelectedLocales.ts"],"sourcesContent":["import type { Block, Field, FlattenedBlock } from '../fields/config/types.js'\nimport type { SanitizedConfig } from '../index.js'\nimport type { JsonObject } from '../types/index.js'\n\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js'\n\ntype FilterDataToSelectedLocalesArgs = {\n configBlockReferences: SanitizedConfig['blocks']\n docWithLocales: JsonObject\n fields: Field[]\n parentIsLocalized?: boolean\n selectedLocales: string[]\n}\n\n/**\n * Filters a locale map to selected locales and applies a transform to each locale's value.\n */\nfunction filterLocaleMap(\n localeMap: Record<string, unknown>,\n selectedLocales: string[],\n transform: (value: unknown) => unknown,\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {}\n const localesToInclude =\n selectedLocales && selectedLocales.length > 0 ? selectedLocales : Object.keys(localeMap)\n\n for (const locale of localesToInclude) {\n if (locale in localeMap) {\n filtered[locale] = transform(localeMap[locale])\n }\n }\n\n return Object.keys(filtered).length > 0 ? filtered : {}\n}\n\n/**\n * Filters localized field data to only include specified locales.\n * For non-localized fields, returns all data as-is.\n * For localized fields, if selectedLocales is provided, returns only those locales.\n * If selectedLocales is not provided and field is localized, returns all locales.\n */\nexport function filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields,\n parentIsLocalized = false,\n selectedLocales,\n}: FilterDataToSelectedLocalesArgs): JsonObject {\n if (!docWithLocales || typeof docWithLocales !== 'object') {\n return docWithLocales\n }\n\n const result: JsonObject = {}\n\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n const fieldIsLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n switch (field.type) {\n case 'array': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const arrayValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (arrayValue && typeof arrayValue === 'object' && !Array.isArray(arrayValue)) {\n result[field.name] = filterLocaleMap(arrayValue, selectedLocales, (localeRows) =>\n Array.isArray(localeRows)\n ? localeRows.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n : localeRows,\n )\n }\n } else if (Array.isArray(arrayValue)) {\n result[field.name] = arrayValue.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n }\n\n break\n }\n\n case 'blocks': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const blocksValue = docWithLocales[field.name]\n\n const processBlockRows = (rows: unknown): unknown => {\n if (!Array.isArray(rows)) {\n return rows\n }\n\n return rows.map((blockData: JsonObject) => {\n let block: Block | FlattenedBlock | undefined\n if (configBlockReferences && field.blockReferences) {\n for (const blockOrReference of field.blockReferences) {\n if (typeof blockOrReference === 'string') {\n block = configBlockReferences.find((b) => b.slug === blockData.blockType)\n } else {\n block = blockOrReference\n }\n }\n } else if (field.blocks) {\n block = field.blocks.find((b) => b.slug === blockData.blockType)\n }\n\n if (block) {\n const filtered = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: blockData,\n fields: block?.fields || [],\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n\n // blockType, id, blockName are set by Payload internally\n // and not part of block.fields, so they must be preserved explicitly\n filtered.blockType = blockData.blockType\n filtered.id = blockData.id\n filtered.blockName = blockData.blockName\n\n return filtered\n }\n\n return blockData\n })\n }\n\n if (fieldIsLocalized) {\n if (blocksValue && typeof blocksValue === 'object' && !Array.isArray(blocksValue)) {\n result[field.name] = filterLocaleMap(blocksValue, selectedLocales, (localeRows) =>\n processBlockRows(localeRows),\n )\n }\n } else if (Array.isArray(blocksValue)) {\n result[field.name] = processBlockRows(blocksValue)\n }\n\n break\n }\n\n case 'group': {\n if (field.name in docWithLocales && typeof docWithLocales[field.name] === 'object') {\n const groupValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (groupValue && typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterLocaleMap(groupValue, selectedLocales, (localeValue) => {\n if (\n localeValue &&\n typeof localeValue === 'object' &&\n !Array.isArray(localeValue)\n ) {\n return filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: localeValue as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n return localeValue\n })\n }\n } else if (typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: groupValue as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed groups pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n break\n }\n\n default: {\n if (field.name in docWithLocales) {\n const value = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n result[field.name] = filterLocaleMap(\n value,\n selectedLocales,\n (localeValue) => localeValue,\n )\n }\n } else {\n result[field.name] = value\n }\n }\n break\n }\n }\n } else {\n // Layout-only fields that don't affect data structure\n switch (field.type) {\n case 'collapsible':\n case 'group':\n case 'row': {\n // These pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n // Named tabs create a nested data structure\n if (tab.name in docWithLocales && typeof docWithLocales[tab.name] === 'object') {\n result[tab.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: docWithLocales[tab.name],\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed tabs pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n }\n break\n }\n }\n }\n }\n\n return result\n}\n"],"names":["fieldAffectsData","fieldShouldBeLocalized","tabHasName","filterLocaleMap","localeMap","selectedLocales","transform","filtered","localesToInclude","length","Object","keys","locale","filterDataToSelectedLocales","configBlockReferences","docWithLocales","fields","parentIsLocalized","result","field","fieldIsLocalized","type","name","arrayValue","Array","isArray","localeRows","map","item","blocksValue","processBlockRows","rows","blockData","block","blockReferences","blockOrReference","find","b","slug","blockType","blocks","id","blockName","groupValue","localeValue","nestedResult","assign","value","tab","tabs"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/filterDataToSelectedLocales.ts"],"sourcesContent":["import type { Block, Field, FlattenedBlock } from '../fields/config/types.js'\nimport type { SanitizedConfig } from '../index.js'\nimport type { JsonObject } from '../types/index.js'\n\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js'\n\ntype FilterDataToSelectedLocalesArgs = {\n configBlockReferences: SanitizedConfig['blocks']\n docWithLocales: JsonObject\n fields: Field[]\n parentIsLocalized?: boolean\n selectedLocales: string[]\n}\n\n/**\n * Filters a locale map to selected locales and applies a transform to each locale's value.\n */\nfunction filterLocaleMap(\n localeMap: Record<string, unknown>,\n selectedLocales: string[],\n transform: (value: unknown) => unknown,\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {}\n const localesToInclude =\n selectedLocales && selectedLocales.length > 0 ? selectedLocales : Object.keys(localeMap)\n\n for (const locale of localesToInclude) {\n if (locale in localeMap) {\n filtered[locale] = transform(localeMap[locale])\n }\n }\n\n return Object.keys(filtered).length > 0 ? filtered : {}\n}\n\n/**\n * Filters localized field data to only include specified locales.\n * For non-localized fields, returns all data as-is.\n * For localized fields, if selectedLocales is provided, returns only those locales.\n * If selectedLocales is not provided and field is localized, returns all locales.\n */\nexport function filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields,\n parentIsLocalized = false,\n selectedLocales,\n}: FilterDataToSelectedLocalesArgs): JsonObject {\n if (!docWithLocales || typeof docWithLocales !== 'object') {\n return docWithLocales\n }\n\n const result: JsonObject = {}\n\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n const fieldIsLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n switch (field.type) {\n case 'array': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const arrayValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (arrayValue && typeof arrayValue === 'object' && !Array.isArray(arrayValue)) {\n result[field.name] = filterLocaleMap(arrayValue, selectedLocales, (localeRows) =>\n Array.isArray(localeRows)\n ? localeRows.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n : localeRows,\n )\n }\n } else if (Array.isArray(arrayValue)) {\n result[field.name] = arrayValue.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n }\n\n break\n }\n\n case 'blocks': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const blocksValue = docWithLocales[field.name]\n\n const processBlockRows = (rows: unknown): unknown => {\n if (!Array.isArray(rows)) {\n return rows\n }\n\n return rows.map((blockData: JsonObject) => {\n const blockOrSlug = field.blocks.find((b) => {\n const slug = typeof b === 'string' ? b : b.slug\n return slug === blockData.blockType\n })\n const block: Block | FlattenedBlock | undefined =\n typeof blockOrSlug === 'string'\n ? configBlockReferences?.find((b) => b.slug === blockOrSlug)\n : blockOrSlug\n\n if (block) {\n const filtered = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: blockData,\n fields: block?.fields || [],\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n\n // blockType, id, blockName are set by Payload internally\n // and not part of block.fields, so they must be preserved explicitly\n filtered.blockType = blockData.blockType\n filtered.id = blockData.id\n filtered.blockName = blockData.blockName\n\n return filtered\n }\n\n return blockData\n })\n }\n\n if (fieldIsLocalized) {\n if (blocksValue && typeof blocksValue === 'object' && !Array.isArray(blocksValue)) {\n result[field.name] = filterLocaleMap(blocksValue, selectedLocales, (localeRows) =>\n processBlockRows(localeRows),\n )\n }\n } else if (Array.isArray(blocksValue)) {\n result[field.name] = processBlockRows(blocksValue)\n }\n\n break\n }\n\n case 'group': {\n if (field.name in docWithLocales && typeof docWithLocales[field.name] === 'object') {\n const groupValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (groupValue && typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterLocaleMap(groupValue, selectedLocales, (localeValue) => {\n if (\n localeValue &&\n typeof localeValue === 'object' &&\n !Array.isArray(localeValue)\n ) {\n return filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: localeValue as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n return localeValue\n })\n }\n } else if (typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: groupValue as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed groups pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n break\n }\n\n default: {\n if (field.name in docWithLocales) {\n const value = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n result[field.name] = filterLocaleMap(\n value,\n selectedLocales,\n (localeValue) => localeValue,\n )\n }\n } else {\n result[field.name] = value\n }\n }\n break\n }\n }\n } else {\n // Layout-only fields that don't affect data structure\n switch (field.type) {\n case 'collapsible':\n case 'group':\n case 'row': {\n // These pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n // Named tabs create a nested data structure\n if (tab.name in docWithLocales && typeof docWithLocales[tab.name] === 'object') {\n result[tab.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: docWithLocales[tab.name],\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed tabs pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n }\n break\n }\n }\n }\n }\n\n return result\n}\n"],"names":["fieldAffectsData","fieldShouldBeLocalized","tabHasName","filterLocaleMap","localeMap","selectedLocales","transform","filtered","localesToInclude","length","Object","keys","locale","filterDataToSelectedLocales","configBlockReferences","docWithLocales","fields","parentIsLocalized","result","field","fieldIsLocalized","type","name","arrayValue","Array","isArray","localeRows","map","item","blocksValue","processBlockRows","rows","blockData","blockOrSlug","blocks","find","b","slug","blockType","block","id","blockName","groupValue","localeValue","nestedResult","assign","value","tab","tabs"],"mappings":"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"}
@@ -101,8 +101,7 @@ describe('filterDataToSelectedLocales', ()=>{
101
101
  {
102
102
  name: 'layout',
103
103
  type: 'blocks',
104
- blocks: [],
105
- blockReferences: [
104
+ blocks: [
106
105
  'content'
107
106
  ]
108
107
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/filterDataToSelectedLocales.spec.ts"],"sourcesContent":["import type { Field } from '../fields/config/types.js'\n\nimport { describe, expect, it } from 'vitest'\n\nimport { filterDataToSelectedLocales } from './filterDataToSelectedLocales.js'\n\ndescribe('filterDataToSelectedLocales', () => {\n const selectedLocales = ['en']\n const configBlockReferences = []\n\n describe('block metadata preservation', () => {\n it('should preserve blockType, id, and blockName on non-localized blocks', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'content',\n fields: [\n {\n name: 'richText',\n type: 'richText',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: [\n {\n blockType: 'content',\n id: 'abc123',\n blockName: 'My Block',\n richText: { en: 'English', es: 'Spanish' },\n },\n ],\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('content')\n expect(result.layout[0].id).toBe('abc123')\n expect(result.layout[0].blockName).toBe('My Block')\n expect(result.layout[0].richText).toEqual({ en: 'English' })\n })\n\n it('should preserve blockType and id when block has no blockName', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'text',\n fields: [\n {\n name: 'text',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: [\n {\n blockType: 'text',\n id: 'def456',\n text: { en: 'English', es: 'Spanish' },\n },\n ],\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('text')\n expect(result.layout[0].id).toBe('def456')\n expect(result.layout[0].text).toEqual({ en: 'English' })\n })\n\n it('should preserve blockType and id with configBlockReferences', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [],\n blockReferences: ['content'],\n },\n ]\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [\n {\n slug: 'content',\n flattenedFields: [],\n fields: [\n {\n name: 'body',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n docWithLocales: {\n layout: [\n {\n blockType: 'content',\n id: 'ref123',\n body: { en: 'English', es: 'Spanish' },\n },\n ],\n },\n fields,\n selectedLocales,\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('content')\n expect(result.layout[0].id).toBe('ref123')\n expect(result.layout[0].body).toEqual({ en: 'English' })\n })\n })\n\n describe('localized arrays', () => {\n it('should filter localized array to selected locales and recurse into rows', () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n localized: true,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n items: {\n en: [{ title: 'English Item' }],\n es: [{ title: 'Spanish Item' }],\n de: [{ title: 'German Item' }],\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.items).toEqual({\n en: [{ title: 'English Item' }],\n })\n })\n\n it('should handle non-localized array with localized children', () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n fields: [\n {\n name: 'label',\n type: 'text',\n localized: true,\n },\n {\n name: 'value',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n items: [\n { label: { en: 'English', es: 'Spanish' }, value: 'one' },\n { label: { en: 'English 2', es: 'Spanish 2' }, value: 'two' },\n ],\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.items).toEqual([\n { label: { en: 'English' }, value: 'one' },\n { label: { en: 'English 2' }, value: 'two' },\n ])\n })\n })\n\n describe('localized blocks', () => {\n it('should filter localized blocks field to selected locales', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'hero',\n fields: [\n {\n name: 'heading',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: {\n en: [{ blockType: 'hero', id: '1', blockName: 'Hero EN', heading: 'Hello' }],\n es: [{ blockType: 'hero', id: '2', blockName: 'Hero ES', heading: 'Hola' }],\n de: [{ blockType: 'hero', id: '3', blockName: 'Hero DE', heading: 'Hallo' }],\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.layout).toEqual({\n en: [{ blockType: 'hero', id: '1', blockName: 'Hero EN', heading: 'Hello' }],\n })\n })\n\n it('should filter localized blocks with multiple selected locales', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'text',\n fields: [\n {\n name: 'body',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: {\n en: [{ blockType: 'text', id: '1', blockName: 'Text EN', body: 'English' }],\n es: [{ blockType: 'text', id: '2', blockName: 'Text ES', body: 'Spanish' }],\n de: [{ blockType: 'text', id: '3', blockName: 'Text DE', body: 'German' }],\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales: ['en', 'es'],\n })\n\n expect(result.layout).toEqual({\n en: [{ blockType: 'text', id: '1', blockName: 'Text EN', body: 'English' }],\n es: [{ blockType: 'text', id: '2', blockName: 'Text ES', body: 'Spanish' }],\n })\n })\n })\n\n describe('localized groups', () => {\n it('should filter localized group to selected locales and recurse into children', () => {\n const fields: Field[] = [\n {\n name: 'meta',\n type: 'group',\n localized: true,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'description',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n meta: {\n en: { title: 'English Title', description: 'English Desc' },\n es: { title: 'Spanish Title', description: 'Spanish Desc' },\n de: { title: 'German Title', description: 'German Desc' },\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.meta).toEqual({\n en: { title: 'English Title', description: 'English Desc' },\n })\n })\n\n it('should handle non-localized group with localized children', () => {\n const fields: Field[] = [\n {\n name: 'seo',\n type: 'group',\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n seo: {\n title: { en: 'English SEO', es: 'Spanish SEO' },\n slug: 'my-page',\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.seo).toEqual({\n title: { en: 'English SEO' },\n slug: 'my-page',\n })\n })\n })\n\n describe('simple fields', () => {\n it('should filter localized field values to selected locales', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'English Title',\n es: 'Spanish Title',\n de: 'German Title',\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.title).toEqual({ en: 'English Title' })\n })\n\n it('should pass through non-localized fields as-is', () => {\n const fields: Field[] = [\n {\n name: 'slug',\n type: 'text',\n },\n ]\n\n const docWithLocales = {\n slug: 'my-slug',\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.slug).toBe('my-slug')\n })\n })\n})\n"],"names":["describe","expect","it","filterDataToSelectedLocales","selectedLocales","configBlockReferences","fields","name","type","blocks","slug","localized","docWithLocales","layout","blockType","id","blockName","richText","en","es","result","toHaveLength","toBe","toEqual","text","blockReferences","flattenedFields","body","items","title","de","label","value","heading","meta","description","seo"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/filterDataToSelectedLocales.spec.ts"],"sourcesContent":["import type { Field } from '../fields/config/types.js'\n\nimport { describe, expect, it } from 'vitest'\n\nimport { filterDataToSelectedLocales } from './filterDataToSelectedLocales.js'\n\ndescribe('filterDataToSelectedLocales', () => {\n const selectedLocales = ['en']\n const configBlockReferences = []\n\n describe('block metadata preservation', () => {\n it('should preserve blockType, id, and blockName on non-localized blocks', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'content',\n fields: [\n {\n name: 'richText',\n type: 'richText',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: [\n {\n blockType: 'content',\n id: 'abc123',\n blockName: 'My Block',\n richText: { en: 'English', es: 'Spanish' },\n },\n ],\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('content')\n expect(result.layout[0].id).toBe('abc123')\n expect(result.layout[0].blockName).toBe('My Block')\n expect(result.layout[0].richText).toEqual({ en: 'English' })\n })\n\n it('should preserve blockType and id when block has no blockName', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'text',\n fields: [\n {\n name: 'text',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: [\n {\n blockType: 'text',\n id: 'def456',\n text: { en: 'English', es: 'Spanish' },\n },\n ],\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('text')\n expect(result.layout[0].id).toBe('def456')\n expect(result.layout[0].text).toEqual({ en: 'English' })\n })\n\n it('should preserve blockType and id with configBlockReferences', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: ['content'],\n },\n ]\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [\n {\n slug: 'content',\n flattenedFields: [],\n fields: [\n {\n name: 'body',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n docWithLocales: {\n layout: [\n {\n blockType: 'content',\n id: 'ref123',\n body: { en: 'English', es: 'Spanish' },\n },\n ],\n },\n fields,\n selectedLocales,\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('content')\n expect(result.layout[0].id).toBe('ref123')\n expect(result.layout[0].body).toEqual({ en: 'English' })\n })\n })\n\n describe('localized arrays', () => {\n it('should filter localized array to selected locales and recurse into rows', () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n localized: true,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n items: {\n en: [{ title: 'English Item' }],\n es: [{ title: 'Spanish Item' }],\n de: [{ title: 'German Item' }],\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.items).toEqual({\n en: [{ title: 'English Item' }],\n })\n })\n\n it('should handle non-localized array with localized children', () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n fields: [\n {\n name: 'label',\n type: 'text',\n localized: true,\n },\n {\n name: 'value',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n items: [\n { label: { en: 'English', es: 'Spanish' }, value: 'one' },\n { label: { en: 'English 2', es: 'Spanish 2' }, value: 'two' },\n ],\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.items).toEqual([\n { label: { en: 'English' }, value: 'one' },\n { label: { en: 'English 2' }, value: 'two' },\n ])\n })\n })\n\n describe('localized blocks', () => {\n it('should filter localized blocks field to selected locales', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'hero',\n fields: [\n {\n name: 'heading',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: {\n en: [{ blockType: 'hero', id: '1', blockName: 'Hero EN', heading: 'Hello' }],\n es: [{ blockType: 'hero', id: '2', blockName: 'Hero ES', heading: 'Hola' }],\n de: [{ blockType: 'hero', id: '3', blockName: 'Hero DE', heading: 'Hallo' }],\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.layout).toEqual({\n en: [{ blockType: 'hero', id: '1', blockName: 'Hero EN', heading: 'Hello' }],\n })\n })\n\n it('should filter localized blocks with multiple selected locales', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'text',\n fields: [\n {\n name: 'body',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: {\n en: [{ blockType: 'text', id: '1', blockName: 'Text EN', body: 'English' }],\n es: [{ blockType: 'text', id: '2', blockName: 'Text ES', body: 'Spanish' }],\n de: [{ blockType: 'text', id: '3', blockName: 'Text DE', body: 'German' }],\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales: ['en', 'es'],\n })\n\n expect(result.layout).toEqual({\n en: [{ blockType: 'text', id: '1', blockName: 'Text EN', body: 'English' }],\n es: [{ blockType: 'text', id: '2', blockName: 'Text ES', body: 'Spanish' }],\n })\n })\n })\n\n describe('localized groups', () => {\n it('should filter localized group to selected locales and recurse into children', () => {\n const fields: Field[] = [\n {\n name: 'meta',\n type: 'group',\n localized: true,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'description',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n meta: {\n en: { title: 'English Title', description: 'English Desc' },\n es: { title: 'Spanish Title', description: 'Spanish Desc' },\n de: { title: 'German Title', description: 'German Desc' },\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.meta).toEqual({\n en: { title: 'English Title', description: 'English Desc' },\n })\n })\n\n it('should handle non-localized group with localized children', () => {\n const fields: Field[] = [\n {\n name: 'seo',\n type: 'group',\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n seo: {\n title: { en: 'English SEO', es: 'Spanish SEO' },\n slug: 'my-page',\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.seo).toEqual({\n title: { en: 'English SEO' },\n slug: 'my-page',\n })\n })\n })\n\n describe('simple fields', () => {\n it('should filter localized field values to selected locales', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'English Title',\n es: 'Spanish Title',\n de: 'German Title',\n },\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.title).toEqual({ en: 'English Title' })\n })\n\n it('should pass through non-localized fields as-is', () => {\n const fields: Field[] = [\n {\n name: 'slug',\n type: 'text',\n },\n ]\n\n const docWithLocales = {\n slug: 'my-slug',\n }\n\n const result = filterDataToSelectedLocales({\n configBlockReferences: [],\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.slug).toBe('my-slug')\n })\n })\n})\n"],"names":["describe","expect","it","filterDataToSelectedLocales","selectedLocales","configBlockReferences","fields","name","type","blocks","slug","localized","docWithLocales","layout","blockType","id","blockName","richText","en","es","result","toHaveLength","toBe","toEqual","text","flattenedFields","body","items","title","de","label","value","heading","meta","description","seo"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"flattenAllFields.d.ts","sourceRoot":"","sources":["../../src/utilities/flattenAllFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,KAAK,EACL,cAAc,EAEd,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAIlC,eAAO,MAAM,YAAY,GAAI,WAAW;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,KAAG,cAK1D,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,oBAG9B;IACD,wGAAwG;IACxG,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB,KAAG,cAAc,EAiGjB,CAAA"}
1
+ {"version":3,"file":"flattenAllFields.d.ts","sourceRoot":"","sources":["../../src/utilities/flattenAllFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,KAAK,EACL,cAAc,EAEd,cAAc,EAEf,MAAM,2BAA2B,CAAA;AAIlC,eAAO,MAAM,YAAY,cAAe;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,KAAG,cAK1D,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,uBAG1B;IACD,wGAAwG;IACxG,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB,KAAG,cAAc,EAoFjB,CAAA"}
@@ -44,32 +44,17 @@ const flattenedFieldsCache = new Map();
44
44
  case 'blocks':
45
45
  {
46
46
  const blocks = [];
47
- let blockReferences = undefined;
48
- if (field.blockReferences) {
49
- blockReferences = [];
50
- for (const block of field.blockReferences){
51
- if (typeof block === 'string') {
52
- blockReferences.push(block);
53
- continue;
54
- }
55
- blockReferences.push(flattenBlock({
56
- block
57
- }));
58
- }
59
- } else {
60
- for (const block of field.blocks){
61
- if (typeof block === 'string') {
62
- blocks.push(block);
63
- continue;
64
- }
65
- blocks.push(flattenBlock({
66
- block
67
- }));
47
+ for (const block of field.blocks){
48
+ if (typeof block === 'string') {
49
+ blocks.push(block);
50
+ continue;
68
51
  }
52
+ blocks.push(flattenBlock({
53
+ block
54
+ }));
69
55
  }
70
56
  const resultField = {
71
57
  ...field,
72
- blockReferences,
73
58
  blocks
74
59
  };
75
60
  result.push(resultField);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/flattenAllFields.ts"],"sourcesContent":["import type {\n Block,\n Field,\n FlattenedBlock,\n FlattenedBlocksField,\n FlattenedField,\n FlattenedJoinField,\n} from '../fields/config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\n\nexport const flattenBlock = ({ block }: { block: Block }): FlattenedBlock => {\n return {\n ...block,\n flattenedFields: flattenAllFields({ fields: block.fields }),\n }\n}\n\nconst flattenedFieldsCache = new Map<Field[], FlattenedField[]>()\n\n/**\n * Flattens all fields in a collection, preserving the nested field structure.\n * @param cache\n * @param fields\n */\nexport const flattenAllFields = ({\n cache,\n fields,\n}: {\n /** Allows you to get FlattenedField[] from Field[] anywhere without performance overhead by caching. */\n cache?: boolean\n fields: Field[]\n}): FlattenedField[] => {\n if (cache) {\n const maybeFields = flattenedFieldsCache.get(fields)\n if (maybeFields) {\n return maybeFields\n }\n }\n\n const result: FlattenedField[] = []\n\n for (const field of fields) {\n switch (field.type) {\n case 'array':\n case 'group': {\n if (fieldAffectsData(field)) {\n result.push({ ...field, flattenedFields: flattenAllFields({ fields: field.fields }) })\n } else {\n for (const nestedField of flattenAllFields({ fields: field.fields })) {\n result.push(nestedField)\n }\n }\n break\n }\n\n case 'blocks': {\n const blocks: FlattenedBlock[] = []\n let blockReferences: (FlattenedBlock | string)[] | undefined = undefined\n if (field.blockReferences) {\n blockReferences = []\n for (const block of field.blockReferences) {\n if (typeof block === 'string') {\n blockReferences.push(block)\n continue\n }\n blockReferences.push(flattenBlock({ block }))\n }\n } else {\n for (const block of field.blocks) {\n if (typeof block === 'string') {\n blocks.push(block)\n continue\n }\n blocks.push(flattenBlock({ block }))\n }\n }\n\n const resultField: FlattenedBlocksField = {\n ...field,\n blockReferences,\n blocks,\n }\n\n result.push(resultField)\n break\n }\n\n case 'collapsible':\n case 'row': {\n for (const nestedField of flattenAllFields({ fields: field.fields })) {\n result.push(nestedField)\n }\n break\n }\n\n case 'join': {\n result.push(field as FlattenedJoinField)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (!tabHasName(tab)) {\n for (const nestedField of flattenAllFields({ fields: tab.fields })) {\n result.push(nestedField)\n }\n } else {\n result.push({\n ...tab,\n type: 'tab',\n flattenedFields: flattenAllFields({ fields: tab.fields }),\n })\n }\n }\n break\n }\n\n default: {\n if (field.type !== 'ui') {\n result.push(field)\n }\n }\n }\n }\n\n flattenedFieldsCache.set(fields, result)\n\n return result\n}\n"],"names":["fieldAffectsData","tabHasName","flattenBlock","block","flattenedFields","flattenAllFields","fields","flattenedFieldsCache","Map","cache","maybeFields","get","result","field","type","push","nestedField","blocks","blockReferences","undefined","resultField","tab","tabs","set"],"mappings":"AASA,SAASA,gBAAgB,EAAEC,UAAU,QAAQ,4BAA2B;AAExE,OAAO,MAAMC,eAAe,CAAC,EAAEC,KAAK,EAAoB;IACtD,OAAO;QACL,GAAGA,KAAK;QACRC,iBAAiBC,iBAAiB;YAAEC,QAAQH,MAAMG,MAAM;QAAC;IAC3D;AACF,EAAC;AAED,MAAMC,uBAAuB,IAAIC;AAEjC;;;;CAIC,GACD,OAAO,MAAMH,mBAAmB,CAAC,EAC/BI,KAAK,EACLH,MAAM,EAKP;IACC,IAAIG,OAAO;QACT,MAAMC,cAAcH,qBAAqBI,GAAG,CAACL;QAC7C,IAAII,aAAa;YACf,OAAOA;QACT;IACF;IAEA,MAAME,SAA2B,EAAE;IAEnC,KAAK,MAAMC,SAASP,OAAQ;QAC1B,OAAQO,MAAMC,IAAI;YAChB,KAAK;YACL,KAAK;gBAAS;oBACZ,IAAId,iBAAiBa,QAAQ;wBAC3BD,OAAOG,IAAI,CAAC;4BAAE,GAAGF,KAAK;4BAAET,iBAAiBC,iBAAiB;gCAAEC,QAAQO,MAAMP,MAAM;4BAAC;wBAAG;oBACtF,OAAO;wBACL,KAAK,MAAMU,eAAeX,iBAAiB;4BAAEC,QAAQO,MAAMP,MAAM;wBAAC,GAAI;4BACpEM,OAAOG,IAAI,CAACC;wBACd;oBACF;oBACA;gBACF;YAEA,KAAK;gBAAU;oBACb,MAAMC,SAA2B,EAAE;oBACnC,IAAIC,kBAA2DC;oBAC/D,IAAIN,MAAMK,eAAe,EAAE;wBACzBA,kBAAkB,EAAE;wBACpB,KAAK,MAAMf,SAASU,MAAMK,eAAe,CAAE;4BACzC,IAAI,OAAOf,UAAU,UAAU;gCAC7Be,gBAAgBH,IAAI,CAACZ;gCACrB;4BACF;4BACAe,gBAAgBH,IAAI,CAACb,aAAa;gCAAEC;4BAAM;wBAC5C;oBACF,OAAO;wBACL,KAAK,MAAMA,SAASU,MAAMI,MAAM,CAAE;4BAChC,IAAI,OAAOd,UAAU,UAAU;gCAC7Bc,OAAOF,IAAI,CAACZ;gCACZ;4BACF;4BACAc,OAAOF,IAAI,CAACb,aAAa;gCAAEC;4BAAM;wBACnC;oBACF;oBAEA,MAAMiB,cAAoC;wBACxC,GAAGP,KAAK;wBACRK;wBACAD;oBACF;oBAEAL,OAAOG,IAAI,CAACK;oBACZ;gBACF;YAEA,KAAK;YACL,KAAK;gBAAO;oBACV,KAAK,MAAMJ,eAAeX,iBAAiB;wBAAEC,QAAQO,MAAMP,MAAM;oBAAC,GAAI;wBACpEM,OAAOG,IAAI,CAACC;oBACd;oBACA;gBACF;YAEA,KAAK;gBAAQ;oBACXJ,OAAOG,IAAI,CAACF;oBACZ;gBACF;YAEA,KAAK;gBAAQ;oBACX,KAAK,MAAMQ,OAAOR,MAAMS,IAAI,CAAE;wBAC5B,IAAI,CAACrB,WAAWoB,MAAM;4BACpB,KAAK,MAAML,eAAeX,iBAAiB;gCAAEC,QAAQe,IAAIf,MAAM;4BAAC,GAAI;gCAClEM,OAAOG,IAAI,CAACC;4BACd;wBACF,OAAO;4BACLJ,OAAOG,IAAI,CAAC;gCACV,GAAGM,GAAG;gCACNP,MAAM;gCACNV,iBAAiBC,iBAAiB;oCAAEC,QAAQe,IAAIf,MAAM;gCAAC;4BACzD;wBACF;oBACF;oBACA;gBACF;YAEA;gBAAS;oBACP,IAAIO,MAAMC,IAAI,KAAK,MAAM;wBACvBF,OAAOG,IAAI,CAACF;oBACd;gBACF;QACF;IACF;IAEAN,qBAAqBgB,GAAG,CAACjB,QAAQM;IAEjC,OAAOA;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/flattenAllFields.ts"],"sourcesContent":["import type {\n Block,\n Field,\n FlattenedBlock,\n FlattenedBlocksField,\n FlattenedField,\n FlattenedJoinField,\n} from '../fields/config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\n\nexport const flattenBlock = ({ block }: { block: Block }): FlattenedBlock => {\n return {\n ...block,\n flattenedFields: flattenAllFields({ fields: block.fields }),\n }\n}\n\nconst flattenedFieldsCache = new Map<Field[], FlattenedField[]>()\n\n/**\n * Flattens all fields in a collection, preserving the nested field structure.\n * @param cache\n * @param fields\n */\nexport const flattenAllFields = ({\n cache,\n fields,\n}: {\n /** Allows you to get FlattenedField[] from Field[] anywhere without performance overhead by caching. */\n cache?: boolean\n fields: Field[]\n}): FlattenedField[] => {\n if (cache) {\n const maybeFields = flattenedFieldsCache.get(fields)\n if (maybeFields) {\n return maybeFields\n }\n }\n\n const result: FlattenedField[] = []\n\n for (const field of fields) {\n switch (field.type) {\n case 'array':\n case 'group': {\n if (fieldAffectsData(field)) {\n result.push({ ...field, flattenedFields: flattenAllFields({ fields: field.fields }) })\n } else {\n for (const nestedField of flattenAllFields({ fields: field.fields })) {\n result.push(nestedField)\n }\n }\n break\n }\n\n case 'blocks': {\n const blocks: (FlattenedBlock | string)[] = []\n for (const block of field.blocks) {\n if (typeof block === 'string') {\n blocks.push(block)\n continue\n }\n blocks.push(flattenBlock({ block }))\n }\n\n const resultField: FlattenedBlocksField = {\n ...field,\n blocks,\n }\n\n result.push(resultField)\n break\n }\n\n case 'collapsible':\n case 'row': {\n for (const nestedField of flattenAllFields({ fields: field.fields })) {\n result.push(nestedField)\n }\n break\n }\n\n case 'join': {\n result.push(field as FlattenedJoinField)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (!tabHasName(tab)) {\n for (const nestedField of flattenAllFields({ fields: tab.fields })) {\n result.push(nestedField)\n }\n } else {\n result.push({\n ...tab,\n type: 'tab',\n flattenedFields: flattenAllFields({ fields: tab.fields }),\n })\n }\n }\n break\n }\n\n default: {\n if (field.type !== 'ui') {\n result.push(field)\n }\n }\n }\n }\n\n flattenedFieldsCache.set(fields, result)\n\n return result\n}\n"],"names":["fieldAffectsData","tabHasName","flattenBlock","block","flattenedFields","flattenAllFields","fields","flattenedFieldsCache","Map","cache","maybeFields","get","result","field","type","push","nestedField","blocks","resultField","tab","tabs","set"],"mappings":"AASA,SAASA,gBAAgB,EAAEC,UAAU,QAAQ,4BAA2B;AAExE,OAAO,MAAMC,eAAe,CAAC,EAAEC,KAAK,EAAoB;IACtD,OAAO;QACL,GAAGA,KAAK;QACRC,iBAAiBC,iBAAiB;YAAEC,QAAQH,MAAMG,MAAM;QAAC;IAC3D;AACF,EAAC;AAED,MAAMC,uBAAuB,IAAIC;AAEjC;;;;CAIC,GACD,OAAO,MAAMH,mBAAmB,CAAC,EAC/BI,KAAK,EACLH,MAAM,EAKP;IACC,IAAIG,OAAO;QACT,MAAMC,cAAcH,qBAAqBI,GAAG,CAACL;QAC7C,IAAII,aAAa;YACf,OAAOA;QACT;IACF;IAEA,MAAME,SAA2B,EAAE;IAEnC,KAAK,MAAMC,SAASP,OAAQ;QAC1B,OAAQO,MAAMC,IAAI;YAChB,KAAK;YACL,KAAK;gBAAS;oBACZ,IAAId,iBAAiBa,QAAQ;wBAC3BD,OAAOG,IAAI,CAAC;4BAAE,GAAGF,KAAK;4BAAET,iBAAiBC,iBAAiB;gCAAEC,QAAQO,MAAMP,MAAM;4BAAC;wBAAG;oBACtF,OAAO;wBACL,KAAK,MAAMU,eAAeX,iBAAiB;4BAAEC,QAAQO,MAAMP,MAAM;wBAAC,GAAI;4BACpEM,OAAOG,IAAI,CAACC;wBACd;oBACF;oBACA;gBACF;YAEA,KAAK;gBAAU;oBACb,MAAMC,SAAsC,EAAE;oBAC9C,KAAK,MAAMd,SAASU,MAAMI,MAAM,CAAE;wBAChC,IAAI,OAAOd,UAAU,UAAU;4BAC7Bc,OAAOF,IAAI,CAACZ;4BACZ;wBACF;wBACAc,OAAOF,IAAI,CAACb,aAAa;4BAAEC;wBAAM;oBACnC;oBAEA,MAAMe,cAAoC;wBACxC,GAAGL,KAAK;wBACRI;oBACF;oBAEAL,OAAOG,IAAI,CAACG;oBACZ;gBACF;YAEA,KAAK;YACL,KAAK;gBAAO;oBACV,KAAK,MAAMF,eAAeX,iBAAiB;wBAAEC,QAAQO,MAAMP,MAAM;oBAAC,GAAI;wBACpEM,OAAOG,IAAI,CAACC;oBACd;oBACA;gBACF;YAEA,KAAK;gBAAQ;oBACXJ,OAAOG,IAAI,CAACF;oBACZ;gBACF;YAEA,KAAK;gBAAQ;oBACX,KAAK,MAAMM,OAAON,MAAMO,IAAI,CAAE;wBAC5B,IAAI,CAACnB,WAAWkB,MAAM;4BACpB,KAAK,MAAMH,eAAeX,iBAAiB;gCAAEC,QAAQa,IAAIb,MAAM;4BAAC,GAAI;gCAClEM,OAAOG,IAAI,CAACC;4BACd;wBACF,OAAO;4BACLJ,OAAOG,IAAI,CAAC;gCACV,GAAGI,GAAG;gCACNL,MAAM;gCACNV,iBAAiBC,iBAAiB;oCAAEC,QAAQa,IAAIb,MAAM;gCAAC;4BACzD;wBACF;oBACF;oBACA;gBACF;YAEA;gBAAS;oBACP,IAAIO,MAAMC,IAAI,KAAK,MAAM;wBACvBF,OAAOG,IAAI,CAACF;oBACd;gBACF;QACF;IACF;IAEAN,qBAAqBc,GAAG,CAACf,QAAQM;IAEjC,OAAOA;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"formatAdminURL.d.ts","sourceRoot":"","sources":["../../src/utilities/formatAdminURL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,KAAK,iBAAiB,GAAG;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,CAAA;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AAE7B,KAAK,aAAa,GACd,CAAC;IACC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAClD,QAAQ,CAAC,EAAE,KAAK,CAAA;CACjB,GAAG,iBAAiB,CAAC,GACtB,CAAC;IACC,UAAU,CAAC,EAAE,KAAK,CAAA;IAClB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;CAC/C,GAAG,iBAAiB,CAAC,CAAA;AAE1B,eAAO,MAAM,cAAc,GAAI,MAAM,aAAa,KAAG,MAyBpD,CAAA"}
1
+ {"version":3,"file":"formatAdminURL.d.ts","sourceRoot":"","sources":["../../src/utilities/formatAdminURL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,KAAK,iBAAiB,GAAG;IACvB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,CAAA;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AAE7B,KAAK,aAAa,GACd,CAAC;IACC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAClD,QAAQ,CAAC,EAAE,KAAK,CAAA;CACjB,GAAG,iBAAiB,CAAC,GACtB,CAAC;IACC,UAAU,CAAC,EAAE,KAAK,CAAA;IAClB,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;CAC/C,GAAG,iBAAiB,CAAC,CAAA;AAE1B,eAAO,MAAM,cAAc,SAAU,aAAa,KAAG,MAyBpD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"formatErrors.d.ts","sourceRoot":"","sources":["../../src/utilities/formatErrors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAGhD,eAAO,MAAM,YAAY,GAAI,UAAU;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,QAAQ,KAAG,WA4D9E,CAAA"}
1
+ {"version":3,"file":"formatErrors.d.ts","sourceRoot":"","sources":["../../src/utilities/formatErrors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAGhD,eAAO,MAAM,YAAY,aAAc;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,QAAQ,KAAG,WAmE9E,CAAA"}
@@ -3,7 +3,9 @@ import { ValidationError } from '../errors/ValidationError.js';
3
3
  export const formatErrors = (incoming)=>{
4
4
  if (incoming) {
5
5
  // Payload 'ValidationError' and 'APIError'
6
- if ((incoming instanceof ValidationError || incoming instanceof APIError) && incoming.data) {
6
+ // Use duck-typing fallback alongside instanceof to handle bundlers (e.g. Vite)
7
+ // that may load duplicate module instances, causing instanceof to fail.
8
+ if ((incoming instanceof ValidationError || incoming instanceof APIError || 'isOperational' in incoming && incoming.isOperational === true) && incoming.data) {
7
9
  return {
8
10
  errors: [
9
11
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/formatErrors.ts"],"sourcesContent":["import type { ErrorResult } from '../config/types.js'\n\nimport { APIError } from '../errors/APIError.js'\nimport { ValidationError } from '../errors/ValidationError.js'\n\nexport const formatErrors = (incoming: { [key: string]: unknown } | APIError): ErrorResult => {\n if (incoming) {\n // Payload 'ValidationError' and 'APIError'\n if ((incoming instanceof ValidationError || incoming instanceof APIError) && incoming.data) {\n return {\n errors: [\n {\n name: incoming.name,\n data: incoming.data as Record<string, unknown>,\n message: incoming.message,\n },\n ],\n }\n }\n\n // Mongoose 'ValidationError': https://mongoosejs.com/docs/api/error.html#Error.ValidationError\n if (\n 'name' in incoming &&\n incoming.name === 'ValidationError' &&\n 'errors' in incoming &&\n incoming.errors\n ) {\n return {\n errors: Object.keys(incoming.errors).reduce(\n (acc, key) => {\n acc.push({\n field: (incoming.errors as any)[key].path,\n message: (incoming.errors as any)[key].message,\n })\n return acc\n },\n [] as { field: string; message: string }[],\n ),\n }\n }\n\n if (Array.isArray(incoming.message)) {\n return {\n errors: incoming.message,\n }\n }\n\n if (incoming.name) {\n return {\n errors: [\n {\n message: incoming.message as string,\n },\n ],\n }\n }\n }\n\n return {\n errors: [\n {\n message: 'An unknown error occurred.',\n },\n ],\n }\n}\n"],"names":["APIError","ValidationError","formatErrors","incoming","data","errors","name","message","Object","keys","reduce","acc","key","push","field","path","Array","isArray"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,eAAe,QAAQ,+BAA8B;AAE9D,OAAO,MAAMC,eAAe,CAACC;IAC3B,IAAIA,UAAU;QACZ,2CAA2C;QAC3C,IAAI,AAACA,CAAAA,oBAAoBF,mBAAmBE,oBAAoBH,QAAO,KAAMG,SAASC,IAAI,EAAE;YAC1F,OAAO;gBACLC,QAAQ;oBACN;wBACEC,MAAMH,SAASG,IAAI;wBACnBF,MAAMD,SAASC,IAAI;wBACnBG,SAASJ,SAASI,OAAO;oBAC3B;iBACD;YACH;QACF;QAEA,+FAA+F;QAC/F,IACE,UAAUJ,YACVA,SAASG,IAAI,KAAK,qBAClB,YAAYH,YACZA,SAASE,MAAM,EACf;YACA,OAAO;gBACLA,QAAQG,OAAOC,IAAI,CAACN,SAASE,MAAM,EAAEK,MAAM,CACzC,CAACC,KAAKC;oBACJD,IAAIE,IAAI,CAAC;wBACPC,OAAO,AAACX,SAASE,MAAM,AAAQ,CAACO,IAAI,CAACG,IAAI;wBACzCR,SAAS,AAACJ,SAASE,MAAM,AAAQ,CAACO,IAAI,CAACL,OAAO;oBAChD;oBACA,OAAOI;gBACT,GACA,EAAE;YAEN;QACF;QAEA,IAAIK,MAAMC,OAAO,CAACd,SAASI,OAAO,GAAG;YACnC,OAAO;gBACLF,QAAQF,SAASI,OAAO;YAC1B;QACF;QAEA,IAAIJ,SAASG,IAAI,EAAE;YACjB,OAAO;gBACLD,QAAQ;oBACN;wBACEE,SAASJ,SAASI,OAAO;oBAC3B;iBACD;YACH;QACF;IACF;IAEA,OAAO;QACLF,QAAQ;YACN;gBACEE,SAAS;YACX;SACD;IACH;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/formatErrors.ts"],"sourcesContent":["import type { ErrorResult } from '../config/types.js'\n\nimport { APIError } from '../errors/APIError.js'\nimport { ValidationError } from '../errors/ValidationError.js'\n\nexport const formatErrors = (incoming: { [key: string]: unknown } | APIError): ErrorResult => {\n if (incoming) {\n // Payload 'ValidationError' and 'APIError'\n // Use duck-typing fallback alongside instanceof to handle bundlers (e.g. Vite)\n // that may load duplicate module instances, causing instanceof to fail.\n if (\n (incoming instanceof ValidationError ||\n incoming instanceof APIError ||\n ('isOperational' in incoming && incoming.isOperational === true)) &&\n incoming.data\n ) {\n return {\n errors: [\n {\n name: incoming.name as string | undefined,\n data: incoming.data as Record<string, unknown>,\n message: incoming.message as string | undefined,\n },\n ],\n }\n }\n\n // Mongoose 'ValidationError': https://mongoosejs.com/docs/api/error.html#Error.ValidationError\n if (\n 'name' in incoming &&\n incoming.name === 'ValidationError' &&\n 'errors' in incoming &&\n incoming.errors\n ) {\n return {\n errors: Object.keys(incoming.errors).reduce(\n (acc, key) => {\n acc.push({\n field: (incoming.errors as any)[key].path,\n message: (incoming.errors as any)[key].message,\n })\n return acc\n },\n [] as { field: string; message: string }[],\n ),\n }\n }\n\n if (Array.isArray(incoming.message)) {\n return {\n errors: incoming.message,\n }\n }\n\n if (incoming.name) {\n return {\n errors: [\n {\n message: incoming.message as string,\n },\n ],\n }\n }\n }\n\n return {\n errors: [\n {\n message: 'An unknown error occurred.',\n },\n ],\n }\n}\n"],"names":["APIError","ValidationError","formatErrors","incoming","isOperational","data","errors","name","message","Object","keys","reduce","acc","key","push","field","path","Array","isArray"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,eAAe,QAAQ,+BAA8B;AAE9D,OAAO,MAAMC,eAAe,CAACC;IAC3B,IAAIA,UAAU;QACZ,2CAA2C;QAC3C,+EAA+E;QAC/E,wEAAwE;QACxE,IACE,AAACA,CAAAA,oBAAoBF,mBACnBE,oBAAoBH,YACnB,mBAAmBG,YAAYA,SAASC,aAAa,KAAK,IAAI,KACjED,SAASE,IAAI,EACb;YACA,OAAO;gBACLC,QAAQ;oBACN;wBACEC,MAAMJ,SAASI,IAAI;wBACnBF,MAAMF,SAASE,IAAI;wBACnBG,SAASL,SAASK,OAAO;oBAC3B;iBACD;YACH;QACF;QAEA,+FAA+F;QAC/F,IACE,UAAUL,YACVA,SAASI,IAAI,KAAK,qBAClB,YAAYJ,YACZA,SAASG,MAAM,EACf;YACA,OAAO;gBACLA,QAAQG,OAAOC,IAAI,CAACP,SAASG,MAAM,EAAEK,MAAM,CACzC,CAACC,KAAKC;oBACJD,IAAIE,IAAI,CAAC;wBACPC,OAAO,AAACZ,SAASG,MAAM,AAAQ,CAACO,IAAI,CAACG,IAAI;wBACzCR,SAAS,AAACL,SAASG,MAAM,AAAQ,CAACO,IAAI,CAACL,OAAO;oBAChD;oBACA,OAAOI;gBACT,GACA,EAAE;YAEN;QACF;QAEA,IAAIK,MAAMC,OAAO,CAACf,SAASK,OAAO,GAAG;YACnC,OAAO;gBACLF,QAAQH,SAASK,OAAO;YAC1B;QACF;QAEA,IAAIL,SAASI,IAAI,EAAE;YACjB,OAAO;gBACLD,QAAQ;oBACN;wBACEE,SAASL,SAASK,OAAO;oBAC3B;iBACD;YACH;QACF;IACF;IAEA,OAAO;QACLF,QAAQ;YACN;gBACEE,SAAS;YACX;SACD;IACH;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"formatLabels.d.ts","sourceRoot":"","sources":["../../src/utilities/formatLabels.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,OAAO,GAAI,aAAa,MAAM,EAAE,mBAAiB,KAAG,MAczD,CAAA;AAED,QAAA,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAYtE,CAAA;AAED,QAAA,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAWrE,CAAA;AAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"formatLabels.d.ts","sourceRoot":"","sources":["../../src/utilities/formatLabels.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,OAAO,gBAAiB,MAAM,0BAAsB,MAczD,CAAA;AAED,QAAA,MAAM,YAAY,SAAU,MAAM,KAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAYtE,CAAA;AAED,QAAA,MAAM,WAAW,SAAU,MAAM,KAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAWrE,CAAA;AAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getBestFitFromSizes.d.ts","sourceRoot":"","sources":["../../src/utilities/getBestFitFromSizes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,GAAI,oEAOjC;IACD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,WA0CA,CAAA"}
1
+ {"version":3,"file":"getBestFitFromSizes.d.ts","sourceRoot":"","sources":["../../src/utilities/getBestFitFromSizes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,uEAO7B;IACD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,WA0CA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getBlockSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/getBlockSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE/D;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,gCAI5B;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;CACvB,KAAG;IAAE,WAAW,EAAE,OAAO,GAAG,UAAU,CAAC;IAAC,eAAe,EAAE,UAAU,CAAA;CAqCnE,CAAA"}
1
+ {"version":3,"file":"getBlockSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/getBlockSelect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE/D;;;;GAIG;AACH,eAAO,MAAM,cAAc,mCAIxB;IACD,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;CACvB,KAAG;IAAE,WAAW,EAAE,OAAO,GAAG,UAAU,CAAC;IAAC,eAAe,EAAE,UAAU,CAAA;CAqCnE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getDataByPath.d.ts","sourceRoot":"","sources":["../../src/utilities/getDataByPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAIlD,eAAO,MAAM,aAAa,GAAI,CAAC,GAAG,OAAO,EAAE,QAAQ,SAAS,EAAE,MAAM,MAAM,KAAG,CAkB5E,CAAA"}
1
+ {"version":3,"file":"getDataByPath.d.ts","sourceRoot":"","sources":["../../src/utilities/getDataByPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAIlD,eAAO,MAAM,aAAa,GAAI,CAAC,GAAG,OAAO,UAAU,SAAS,QAAQ,MAAM,KAAG,CAkB5E,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getEntityPermissions.d.ts","sourceRoot":"","sources":["../../../src/utilities/getEntityPermissions/getEntityPermissions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EAEpB,gBAAgB,EAEjB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC9F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAS,MAAM,sBAAsB,CAAA;AAO5F,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAC7C,SAAS,EACT,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAC7C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,CAAA;AAE/C,KAAK,UAAU,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,IAAI,WAAW,SAAS,QAAQ,GACvF,gBAAgB,GAChB,oBAAoB,CAAA;AAExB,KAAK,IAAI,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,IAAI;IACvD,0BAA0B,EAAE,0BAA0B,CAAA;IACtD;;OAEG;IACH,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,MAAM,EAAE,WAAW,SAAS,YAAY,GAAG,yBAAyB,GAAG,qBAAqB,CAAA;IAC5F,UAAU,EAAE,WAAW,CAAA;IACvB;;OAEG;IACH,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,CACA;IACE,SAAS,EAAE,KAAK,CAAA;IAChB,EAAE,CAAC,EAAE,KAAK,CAAA;CACX,GACD;IACE,SAAS,EAAE,IAAI,CAAA;IACf,EAAE,EAAE,WAAW,SAAS,YAAY,GAAG,qBAAqB,GAAG,SAAS,CAAA;CACzE,CACJ,CAAA;AAYD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,EACpF,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GACtB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAwJlC"}
1
+ {"version":3,"file":"getEntityPermissions.d.ts","sourceRoot":"","sources":["../../../src/utilities/getEntityPermissions/getEntityPermissions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EAEpB,gBAAgB,EAEjB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAC9F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAS,MAAM,sBAAsB,CAAA;AAO5F,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAC7C,SAAS,EACT,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAC7C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,CAAA;AAE/C,KAAK,UAAU,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,IAAI,WAAW,SAAS,QAAQ,GACvF,gBAAgB,GAChB,oBAAoB,CAAA;AAExB,KAAK,IAAI,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,IAAI;IACvD,0BAA0B,EAAE,0BAA0B,CAAA;IACtD;;OAEG;IACH,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,MAAM,EAAE,WAAW,SAAS,YAAY,GAAG,yBAAyB,GAAG,qBAAqB,CAAA;IAC5F,UAAU,EAAE,WAAW,CAAA;IACvB;;OAEG;IACH,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,CACA;IACE,SAAS,EAAE,KAAK,CAAA;IAChB,EAAE,CAAC,EAAE,KAAK,CAAA;CACX,GACD;IACE,SAAS,EAAE,IAAI,CAAA;IACf,EAAE,EAAE,WAAW,SAAS,YAAY,GAAG,qBAAqB,GAAG,SAAS,CAAA;CACzE,CACJ,CAAA;AAYD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,SAAS,YAAY,GAAG,QAAQ,EACpF,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GACtB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CA0JlC"}
@@ -127,8 +127,10 @@ const topLevelGlobalPermissions = [
127
127
  await Promise.all(wherePromises);
128
128
  populateFieldPermissions({
129
129
  blockReferencesPermissions,
130
+ collection: entityType === 'collection' ? entity : null,
130
131
  data,
131
132
  fields: entity.fields,
133
+ global: entityType === 'global' ? entity : null,
132
134
  operations,
133
135
  parentPermissionsObject: entityPermissions,
134
136
  permissionsObject: fieldsPermissions,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utilities/getEntityPermissions/getEntityPermissions.ts"],"sourcesContent":["import { isDeepStrictEqual } from 'util'\n\nimport type {\n BlockPermissions,\n CollectionPermission,\n FieldsPermissions,\n GlobalPermission,\n Permission,\n} from '../../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { BlockSlug, DefaultDocumentIDType } from '../../index.js'\nimport type { AllOperations, JsonObject, PayloadRequest, Where } from '../../types/index.js'\n\nimport { entityDocExists } from './entityDocExists.js'\nimport { populateFieldPermissions } from './populateFieldPermissions.js'\n\ntype WhereQueryCache = { result: Promise<boolean>; where: Where }[]\n\nexport type BlockReferencesPermissions = Record<\n BlockSlug,\n BlockPermissions | Promise<BlockPermissions>\n>\n\nexport type EntityDoc = JsonObject | TypeWithID\n\ntype ReturnType<TEntityType extends 'collection' | 'global'> = TEntityType extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype Args<TEntityType extends 'collection' | 'global'> = {\n blockReferencesPermissions: BlockReferencesPermissions\n /**\n * If the document data is passed, it will be used to check access instead of fetching the document from the database.\n */\n data?: JsonObject\n entity: TEntityType extends 'collection' ? SanitizedCollectionConfig : SanitizedGlobalConfig\n entityType: TEntityType\n /**\n * Operations to check access for\n */\n operations: AllOperations[]\n req: PayloadRequest\n} & (\n | {\n fetchData: false\n id?: never\n }\n | {\n fetchData: true\n id: TEntityType extends 'collection' ? DefaultDocumentIDType : undefined\n }\n)\n\nconst topLevelCollectionPermissions = [\n 'create',\n 'delete',\n 'read',\n 'readVersions',\n 'update',\n 'unlock',\n]\nconst topLevelGlobalPermissions = ['read', 'readVersions', 'update']\n\n/**\n * Build up permissions object for an entity (collection or global).\n * This is not run during any update and reflects the current state of the entity data => doc and data is the same.\n *\n * When `fetchData` is false:\n * - returned `Where` are not run and evaluated as \"does not have permission\".\n * - If req.data is passed: `data` and `doc` is passed to access functions.\n * - If req.data is not passed: `data` and `doc` is not passed to access functions.\n *\n * When `fetchData` is true:\n * - `Where` are run and evaluated as \"has permission\" or \"does not have permission\".\n * - `data` and `doc` are always passed to access functions.\n * - Error is thrown if `entityType` is 'collection' and `id` is not passed.\n *\n * In both cases:\n * We cannot include siblingData or blockData here, as we do not have siblingData available once we reach block or array\n * rows, as we're calculating schema permissions, which do not include individual rows.\n * For consistency, it's thus better to never include the siblingData and blockData\n *\n * @internal\n */\nexport async function getEntityPermissions<TEntityType extends 'collection' | 'global'>(\n args: Args<TEntityType>,\n): Promise<ReturnType<TEntityType>> {\n const {\n id,\n blockReferencesPermissions,\n data: _data,\n entity,\n entityType,\n fetchData,\n operations,\n req,\n } = args\n const { locale: _locale, user } = req\n\n const locale = _locale ? _locale : undefined\n\n if (fetchData && entityType === 'collection' && !id) {\n throw new Error('ID is required when fetching data for a collection')\n }\n\n const hasData = _data && Object.keys(_data).length > 0\n const data: JsonObject | undefined = hasData\n ? _data\n : fetchData\n ? await (async () => {\n if (entityType === 'global') {\n return req.payload.findGlobal({\n slug: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n\n if (entityType === 'collection') {\n return req.payload.findByID({\n id: id!,\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n trash: true,\n })\n }\n })()\n : undefined\n\n const isLoggedIn = !!user\n\n const fieldsPermissions: FieldsPermissions = {}\n\n const entityPermissions: ReturnType<TEntityType> = {\n fields: fieldsPermissions,\n } as ReturnType<TEntityType>\n\n const promises: Promise<void>[] = []\n\n // Phase 1: Resolve all access functions to get where queries\n const accessResults: {\n operation: keyof typeof entity.access\n result: Promise<boolean | Where>\n }[] = []\n\n for (const _operation of operations) {\n const operation = _operation as keyof typeof entity.access\n const accessFunction = entity.access[operation]\n\n if (\n (entityType === 'collection' && topLevelCollectionPermissions.includes(operation)) ||\n (entityType === 'global' && topLevelGlobalPermissions.includes(operation))\n ) {\n if (typeof accessFunction === 'function') {\n accessResults.push({\n operation,\n result: Promise.resolve(accessFunction({ id, data, req })) as Promise<boolean | Where>,\n })\n } else {\n entityPermissions[operation] = {\n permission: isLoggedIn,\n }\n }\n }\n }\n\n // Await all access functions in parallel\n const resolvedAccessResults = await Promise.all(\n accessResults.map(async (item) => ({\n operation: item.operation,\n result: await item.result,\n })),\n )\n\n // Phase 2: Process where queries with cache and resolve in parallel\n const whereQueryCache: WhereQueryCache = []\n const wherePromises: Promise<void>[] = []\n\n for (const { operation, result: accessResult } of resolvedAccessResults) {\n if (typeof accessResult === 'object') {\n processWhereQuery({\n id,\n slug: entity.slug,\n accessResult,\n entityPermissions,\n entityType,\n fetchData,\n locale,\n operation,\n req,\n wherePromises,\n whereQueryCache,\n })\n } else if (entityPermissions[operation]?.permission !== false) {\n entityPermissions[operation] = { permission: !!accessResult }\n }\n }\n\n // Await all where query DB calls in parallel\n await Promise.all(wherePromises)\n\n populateFieldPermissions({\n blockReferencesPermissions,\n data,\n fields: entity.fields,\n operations,\n parentPermissionsObject: entityPermissions,\n permissionsObject: fieldsPermissions,\n promises,\n req,\n })\n\n /**\n * Await all promises in parallel.\n * A promise can add more promises to the promises array (group of fields calls populateFieldPermissions again in their own promise), which will not be\n * awaited in the first run.\n * This is why we need to loop again to process the new promises, until there are no more promises left.\n */\n let iterations = 0\n while (promises.length > 0) {\n const currentPromises = promises.splice(0, promises.length)\n\n await Promise.all(currentPromises)\n\n iterations++\n if (iterations >= 100) {\n throw new Error('Infinite getEntityPermissions promise loop detected.')\n }\n }\n\n return entityPermissions\n}\n\nconst processWhereQuery = ({\n id,\n slug,\n accessResult,\n entityPermissions,\n entityType,\n fetchData,\n locale,\n operation,\n req,\n wherePromises,\n whereQueryCache,\n}: {\n accessResult: Where\n entityPermissions: CollectionPermission | GlobalPermission\n entityType: 'collection' | 'global'\n fetchData: boolean\n id?: DefaultDocumentIDType\n locale?: string\n operation: Extract<keyof (CollectionPermission | GlobalPermission), AllOperations>\n req: PayloadRequest\n slug: string\n wherePromises: Promise<void>[]\n whereQueryCache: WhereQueryCache\n}): void => {\n if (fetchData) {\n // Check cache for identical where query using deep comparison\n let cached = whereQueryCache.find((entry) => isDeepStrictEqual(entry.where, accessResult))\n\n if (!cached) {\n // Cache miss - start DB query (don't await)\n cached = {\n result: entityDocExists({\n id,\n slug,\n entityType,\n locale,\n operation,\n req,\n where: accessResult,\n }),\n where: accessResult,\n }\n whereQueryCache.push(cached)\n }\n\n // Defer resolution to Promise.all (cache hits reuse same promise)\n wherePromises.push(\n cached.result.then((hasPermission) => {\n entityPermissions[operation] = {\n permission: hasPermission,\n where: accessResult,\n } as Permission\n }),\n )\n } else {\n // TODO: 4.0: Investigate defaulting to `false` here, if where query is returned but ignored as we don't\n // have the document data available. This seems more secure.\n // Alternatively, we could set permission to a third state, like 'unknown'.\n // Even after calling sanitizePermissions, the permissions will still be true if the where query is returned but ignored as we don't have the document data available.\n entityPermissions[operation] = { permission: true, where: accessResult } as Permission\n }\n}\n"],"names":["isDeepStrictEqual","entityDocExists","populateFieldPermissions","topLevelCollectionPermissions","topLevelGlobalPermissions","getEntityPermissions","args","id","blockReferencesPermissions","data","_data","entity","entityType","fetchData","operations","req","locale","_locale","user","undefined","Error","hasData","Object","keys","length","payload","findGlobal","slug","depth","fallbackLocale","overrideAccess","findByID","collection","trash","isLoggedIn","fieldsPermissions","entityPermissions","fields","promises","accessResults","_operation","operation","accessFunction","access","includes","push","result","Promise","resolve","permission","resolvedAccessResults","all","map","item","whereQueryCache","wherePromises","accessResult","processWhereQuery","parentPermissionsObject","permissionsObject","iterations","currentPromises","splice","cached","find","entry","where","then","hasPermission"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utilities/getEntityPermissions/getEntityPermissions.ts"],"sourcesContent":["import { isDeepStrictEqual } from 'util'\n\nimport type {\n BlockPermissions,\n CollectionPermission,\n FieldsPermissions,\n GlobalPermission,\n Permission,\n} from '../../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { BlockSlug, DefaultDocumentIDType } from '../../index.js'\nimport type { AllOperations, JsonObject, PayloadRequest, Where } from '../../types/index.js'\n\nimport { entityDocExists } from './entityDocExists.js'\nimport { populateFieldPermissions } from './populateFieldPermissions.js'\n\ntype WhereQueryCache = { result: Promise<boolean>; where: Where }[]\n\nexport type BlockReferencesPermissions = Record<\n BlockSlug,\n BlockPermissions | Promise<BlockPermissions>\n>\n\nexport type EntityDoc = JsonObject | TypeWithID\n\ntype ReturnType<TEntityType extends 'collection' | 'global'> = TEntityType extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype Args<TEntityType extends 'collection' | 'global'> = {\n blockReferencesPermissions: BlockReferencesPermissions\n /**\n * If the document data is passed, it will be used to check access instead of fetching the document from the database.\n */\n data?: JsonObject\n entity: TEntityType extends 'collection' ? SanitizedCollectionConfig : SanitizedGlobalConfig\n entityType: TEntityType\n /**\n * Operations to check access for\n */\n operations: AllOperations[]\n req: PayloadRequest\n} & (\n | {\n fetchData: false\n id?: never\n }\n | {\n fetchData: true\n id: TEntityType extends 'collection' ? DefaultDocumentIDType : undefined\n }\n)\n\nconst topLevelCollectionPermissions = [\n 'create',\n 'delete',\n 'read',\n 'readVersions',\n 'update',\n 'unlock',\n]\nconst topLevelGlobalPermissions = ['read', 'readVersions', 'update']\n\n/**\n * Build up permissions object for an entity (collection or global).\n * This is not run during any update and reflects the current state of the entity data => doc and data is the same.\n *\n * When `fetchData` is false:\n * - returned `Where` are not run and evaluated as \"does not have permission\".\n * - If req.data is passed: `data` and `doc` is passed to access functions.\n * - If req.data is not passed: `data` and `doc` is not passed to access functions.\n *\n * When `fetchData` is true:\n * - `Where` are run and evaluated as \"has permission\" or \"does not have permission\".\n * - `data` and `doc` are always passed to access functions.\n * - Error is thrown if `entityType` is 'collection' and `id` is not passed.\n *\n * In both cases:\n * We cannot include siblingData or blockData here, as we do not have siblingData available once we reach block or array\n * rows, as we're calculating schema permissions, which do not include individual rows.\n * For consistency, it's thus better to never include the siblingData and blockData\n *\n * @internal\n */\nexport async function getEntityPermissions<TEntityType extends 'collection' | 'global'>(\n args: Args<TEntityType>,\n): Promise<ReturnType<TEntityType>> {\n const {\n id,\n blockReferencesPermissions,\n data: _data,\n entity,\n entityType,\n fetchData,\n operations,\n req,\n } = args\n const { locale: _locale, user } = req\n\n const locale = _locale ? _locale : undefined\n\n if (fetchData && entityType === 'collection' && !id) {\n throw new Error('ID is required when fetching data for a collection')\n }\n\n const hasData = _data && Object.keys(_data).length > 0\n const data: JsonObject | undefined = hasData\n ? _data\n : fetchData\n ? await (async () => {\n if (entityType === 'global') {\n return req.payload.findGlobal({\n slug: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n\n if (entityType === 'collection') {\n return req.payload.findByID({\n id: id!,\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n trash: true,\n })\n }\n })()\n : undefined\n\n const isLoggedIn = !!user\n\n const fieldsPermissions: FieldsPermissions = {}\n\n const entityPermissions: ReturnType<TEntityType> = {\n fields: fieldsPermissions,\n } as ReturnType<TEntityType>\n\n const promises: Promise<void>[] = []\n\n // Phase 1: Resolve all access functions to get where queries\n const accessResults: {\n operation: keyof typeof entity.access\n result: Promise<boolean | Where>\n }[] = []\n\n for (const _operation of operations) {\n const operation = _operation as keyof typeof entity.access\n const accessFunction = entity.access[operation]\n\n if (\n (entityType === 'collection' && topLevelCollectionPermissions.includes(operation)) ||\n (entityType === 'global' && topLevelGlobalPermissions.includes(operation))\n ) {\n if (typeof accessFunction === 'function') {\n accessResults.push({\n operation,\n result: Promise.resolve(accessFunction({ id, data, req })) as Promise<boolean | Where>,\n })\n } else {\n entityPermissions[operation] = {\n permission: isLoggedIn,\n }\n }\n }\n }\n\n // Await all access functions in parallel\n const resolvedAccessResults = await Promise.all(\n accessResults.map(async (item) => ({\n operation: item.operation,\n result: await item.result,\n })),\n )\n\n // Phase 2: Process where queries with cache and resolve in parallel\n const whereQueryCache: WhereQueryCache = []\n const wherePromises: Promise<void>[] = []\n\n for (const { operation, result: accessResult } of resolvedAccessResults) {\n if (typeof accessResult === 'object') {\n processWhereQuery({\n id,\n slug: entity.slug,\n accessResult,\n entityPermissions,\n entityType,\n fetchData,\n locale,\n operation,\n req,\n wherePromises,\n whereQueryCache,\n })\n } else if (entityPermissions[operation]?.permission !== false) {\n entityPermissions[operation] = { permission: !!accessResult }\n }\n }\n\n // Await all where query DB calls in parallel\n await Promise.all(wherePromises)\n\n populateFieldPermissions({\n blockReferencesPermissions,\n collection: entityType === 'collection' ? (entity as SanitizedCollectionConfig) : null,\n data,\n fields: entity.fields,\n global: entityType === 'global' ? (entity as SanitizedGlobalConfig) : null,\n operations,\n parentPermissionsObject: entityPermissions,\n permissionsObject: fieldsPermissions,\n promises,\n req,\n })\n\n /**\n * Await all promises in parallel.\n * A promise can add more promises to the promises array (group of fields calls populateFieldPermissions again in their own promise), which will not be\n * awaited in the first run.\n * This is why we need to loop again to process the new promises, until there are no more promises left.\n */\n let iterations = 0\n while (promises.length > 0) {\n const currentPromises = promises.splice(0, promises.length)\n\n await Promise.all(currentPromises)\n\n iterations++\n if (iterations >= 100) {\n throw new Error('Infinite getEntityPermissions promise loop detected.')\n }\n }\n\n return entityPermissions\n}\n\nconst processWhereQuery = ({\n id,\n slug,\n accessResult,\n entityPermissions,\n entityType,\n fetchData,\n locale,\n operation,\n req,\n wherePromises,\n whereQueryCache,\n}: {\n accessResult: Where\n entityPermissions: CollectionPermission | GlobalPermission\n entityType: 'collection' | 'global'\n fetchData: boolean\n id?: DefaultDocumentIDType\n locale?: string\n operation: Extract<keyof (CollectionPermission | GlobalPermission), AllOperations>\n req: PayloadRequest\n slug: string\n wherePromises: Promise<void>[]\n whereQueryCache: WhereQueryCache\n}): void => {\n if (fetchData) {\n // Check cache for identical where query using deep comparison\n let cached = whereQueryCache.find((entry) => isDeepStrictEqual(entry.where, accessResult))\n\n if (!cached) {\n // Cache miss - start DB query (don't await)\n cached = {\n result: entityDocExists({\n id,\n slug,\n entityType,\n locale,\n operation,\n req,\n where: accessResult,\n }),\n where: accessResult,\n }\n whereQueryCache.push(cached)\n }\n\n // Defer resolution to Promise.all (cache hits reuse same promise)\n wherePromises.push(\n cached.result.then((hasPermission) => {\n entityPermissions[operation] = {\n permission: hasPermission,\n where: accessResult,\n } as Permission\n }),\n )\n } else {\n // TODO: 4.0: Investigate defaulting to `false` here, if where query is returned but ignored as we don't\n // have the document data available. This seems more secure.\n // Alternatively, we could set permission to a third state, like 'unknown'.\n // Even after calling sanitizePermissions, the permissions will still be true if the where query is returned but ignored as we don't have the document data available.\n entityPermissions[operation] = { permission: true, where: accessResult } as Permission\n }\n}\n"],"names":["isDeepStrictEqual","entityDocExists","populateFieldPermissions","topLevelCollectionPermissions","topLevelGlobalPermissions","getEntityPermissions","args","id","blockReferencesPermissions","data","_data","entity","entityType","fetchData","operations","req","locale","_locale","user","undefined","Error","hasData","Object","keys","length","payload","findGlobal","slug","depth","fallbackLocale","overrideAccess","findByID","collection","trash","isLoggedIn","fieldsPermissions","entityPermissions","fields","promises","accessResults","_operation","operation","accessFunction","access","includes","push","result","Promise","resolve","permission","resolvedAccessResults","all","map","item","whereQueryCache","wherePromises","accessResult","processWhereQuery","global","parentPermissionsObject","permissionsObject","iterations","currentPromises","splice","cached","find","entry","where","then","hasPermission"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { CollectionPermission, FieldPermissions, FieldsPermissions, GlobalPermission } from '../../auth/types.js';
2
+ import type { SanitizedCollectionConfig } from '../../collections/config/types.js';
3
+ import type { SanitizedGlobalConfig } from '../../globals/config/types.js';
2
4
  import type { DefaultDocumentIDType } from '../../index.js';
3
5
  import type { AllOperations, JsonObject, PayloadRequest } from '../../types/index.js';
4
6
  import type { BlockReferencesPermissions } from './getEntityPermissions.js';
@@ -7,10 +9,14 @@ import { type Field } from '../../fields/config/types.js';
7
9
  * Build up permissions object and run access functions for each field of an entity
8
10
  * This function is synchronous and collects all async work into the promises array
9
11
  */
10
- export declare const populateFieldPermissions: ({ id, blockReferencesPermissions, data, fields, operations, parentPermissionsObject, permissionsObject, promises, req, }: {
12
+ export declare const populateFieldPermissions: ({ id, blockReferencesPermissions, collection, data, fields, global, operations, parentPermissionsObject, permissionsObject, promises, req, }: {
11
13
  blockReferencesPermissions: BlockReferencesPermissions;
14
+ /** The collection which the fields belong to. If the fields belong to a global, this will be null. */
15
+ collection: null | SanitizedCollectionConfig;
12
16
  data: JsonObject | undefined;
13
17
  fields: Field[];
18
+ /** The global which the fields belong to. If the fields belong to a collection, this will be null. */
19
+ global: null | SanitizedGlobalConfig;
14
20
  id?: DefaultDocumentIDType;
15
21
  /**
16
22
  * Operations to check access for
@@ -1 +1 @@
1
- {"version":3,"file":"populateFieldPermissions.d.ts","sourceRoot":"","sources":["../../../src/utilities/getEntityPermissions/populateFieldPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AAE3E,OAAO,EAAE,KAAK,KAAK,EAAc,MAAM,8BAA8B,CAAA;AAkCrE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,0HAUtC;IACD,0BAA0B,EAAE,0BAA0B,CAAA;IACtD,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,EAAE,CAAC,EAAE,qBAAqB,CAAA;IAC1B;;OAEG;IACH,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,uBAAuB,EAAE,oBAAoB,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;IACnF,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,IAsPH,CAAA"}
1
+ {"version":3,"file":"populateFieldPermissions.d.ts","sourceRoot":"","sources":["../../../src/utilities/getEntityPermissions/populateFieldPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAC1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AAE3E,OAAO,EAAE,KAAK,KAAK,EAAc,MAAM,8BAA8B,CAAA;AAkCrE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,iJAYlC;IACD,0BAA0B,EAAE,0BAA0B,CAAA;IACtD,sGAAsG;IACtG,UAAU,EAAE,IAAI,GAAG,yBAAyB,CAAA;IAC5C,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,sGAAsG;IACtG,MAAM,EAAE,IAAI,GAAG,qBAAqB,CAAA;IACpC,EAAE,CAAC,EAAE,qBAAqB,CAAA;IAC1B;;OAEG;IACH,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,uBAAuB,EAAE,oBAAoB,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;IACnF,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;IACzB,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,IA2QH,CAAA"}
@@ -27,7 +27,7 @@ target, operation, value, promises)=>{
27
27
  /**
28
28
  * Build up permissions object and run access functions for each field of an entity
29
29
  * This function is synchronous and collects all async work into the promises array
30
- */ export const populateFieldPermissions = ({ id, blockReferencesPermissions, data, fields, operations, parentPermissionsObject, permissionsObject, promises, req })=>{
30
+ */ export const populateFieldPermissions = ({ id, blockReferencesPermissions, collection, data, fields, global, operations, parentPermissionsObject, permissionsObject, promises, req })=>{
31
31
  for (const field of fields){
32
32
  // Set up permissions for all operations
33
33
  for (const operation of operations){
@@ -42,11 +42,18 @@ target, operation, value, promises)=>{
42
42
  }
43
43
  const fieldPermissions = permissionsObject[field.name];
44
44
  if ('access' in field && field.access && typeof field.access[operation] === 'function') {
45
- const accessResult = field.access[operation]({
45
+ const accessResult = field.access[operation](collection ? {
46
46
  id,
47
+ collection,
47
48
  data,
48
49
  doc: data,
49
50
  req
51
+ } : {
52
+ id,
53
+ data,
54
+ doc: data,
55
+ global: global,
56
+ req
50
57
  });
51
58
  // Handle both sync and async access results
52
59
  if (isThenable(accessResult)) {
@@ -71,8 +78,10 @@ target, operation, value, promises)=>{
71
78
  populateFieldPermissions({
72
79
  id,
73
80
  blockReferencesPermissions,
81
+ collection,
74
82
  data,
75
83
  fields: field.fields,
84
+ global,
76
85
  operations,
77
86
  parentPermissionsObject: fieldPermissions,
78
87
  permissionsObject: fieldPermissions.fields,
@@ -80,7 +89,7 @@ target, operation, value, promises)=>{
80
89
  req
81
90
  });
82
91
  }
83
- if ('blocks' in field && field.blocks?.length || 'blockReferences' in field && field.blockReferences?.length) {
92
+ if ('blocks' in field && field.blocks?.length) {
84
93
  if (!fieldPermissions.blocks) {
85
94
  fieldPermissions.blocks = {};
86
95
  }
@@ -92,7 +101,7 @@ target, operation, value, promises)=>{
92
101
  continue;
93
102
  }
94
103
  const parentPermissionForOperation = parentPermissionsObject[operation]?.permission;
95
- for (const _block of field.blockReferences ?? field.blocks){
104
+ for (const _block of field.blocks){
96
105
  const block = typeof _block === 'string' ? req.payload.blocks[_block] : _block;
97
106
  // Skip if block doesn't exist (invalid block reference)
98
107
  if (!block) {
@@ -122,7 +131,7 @@ target, operation, value, promises)=>{
122
131
  }
123
132
  // Process nested content for each unique block (once per block, not once per operation)
124
133
  const processedBlocks = new Set();
125
- for (const _block of field.blockReferences ?? field.blocks){
134
+ for (const _block of field.blocks){
126
135
  const block = typeof _block === 'string' ? req.payload.blocks[_block] : _block;
127
136
  // Skip if block doesn't exist (invalid block reference)
128
137
  if (!block || processedBlocks.has(block.slug)) {
@@ -145,8 +154,10 @@ target, operation, value, promises)=>{
145
154
  populateFieldPermissions({
146
155
  id,
147
156
  blockReferencesPermissions,
157
+ collection,
148
158
  data,
149
159
  fields: block.fields,
160
+ global,
150
161
  operations,
151
162
  parentPermissionsObject: blockPermission,
152
163
  permissionsObject: blockPermission.fields,
@@ -161,11 +172,13 @@ target, operation, value, promises)=>{
161
172
  // Field does not have a name => same parentPermissionsObject
162
173
  populateFieldPermissions({
163
174
  id,
164
- blockReferencesPermissions,
175
+ collection,
165
176
  data,
166
177
  fields: field.fields,
178
+ global,
167
179
  operations,
168
180
  // Field does not have a name here => use parent permissions object
181
+ blockReferencesPermissions,
169
182
  parentPermissionsObject,
170
183
  permissionsObject,
171
184
  promises,
@@ -205,8 +218,10 @@ target, operation, value, promises)=>{
205
218
  populateFieldPermissions({
206
219
  id,
207
220
  blockReferencesPermissions,
221
+ collection,
208
222
  data,
209
223
  fields: tab.fields,
224
+ global,
210
225
  operations,
211
226
  parentPermissionsObject: tabPermissions,
212
227
  permissionsObject: tabPermissions.fields,
@@ -217,11 +232,13 @@ target, operation, value, promises)=>{
217
232
  // Tab does not have a name => same parentPermissionsObject
218
233
  populateFieldPermissions({
219
234
  id,
220
- blockReferencesPermissions,
235
+ collection,
221
236
  data,
222
237
  fields: tab.fields,
238
+ global,
223
239
  operations,
224
240
  // Tab does not have a name here => use parent permissions object
241
+ blockReferencesPermissions,
225
242
  parentPermissionsObject,
226
243
  permissionsObject,
227
244
  promises,