payload 4.0.0-internal.2fddfc0 → 4.0.0-internal.3aa3d85

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 (262) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +11 -0
  3. package/dist/admin/RichText.d.ts +1 -21
  4. package/dist/admin/RichText.d.ts.map +1 -1
  5. package/dist/admin/RichText.js.map +1 -1
  6. package/dist/admin/forms/Field.d.ts +2 -2
  7. package/dist/admin/forms/Field.d.ts.map +1 -1
  8. package/dist/admin/forms/Field.js.map +1 -1
  9. package/dist/admin/forms/Form.d.ts +0 -29
  10. package/dist/admin/forms/Form.d.ts.map +1 -1
  11. package/dist/admin/forms/Form.js.map +1 -1
  12. package/dist/admin/functions/index.d.ts +1 -1
  13. package/dist/admin/functions/index.js.map +1 -1
  14. package/dist/admin/types.d.ts +1 -0
  15. package/dist/admin/types.d.ts.map +1 -1
  16. package/dist/admin/types.js.map +1 -1
  17. package/dist/auth/operations/auth.d.ts +2 -2
  18. package/dist/auth/operations/auth.d.ts.map +1 -1
  19. package/dist/auth/operations/auth.js.map +1 -1
  20. package/dist/auth/operations/login.d.ts +2 -1
  21. package/dist/auth/operations/login.d.ts.map +1 -1
  22. package/dist/auth/operations/login.js.map +1 -1
  23. package/dist/auth/operations/me.js.map +1 -1
  24. package/dist/auth/operations/refresh.d.ts.map +1 -1
  25. package/dist/auth/operations/refresh.js +9 -3
  26. package/dist/auth/operations/refresh.js.map +1 -1
  27. package/dist/auth/operations/resetPassword.d.ts.map +1 -1
  28. package/dist/auth/operations/resetPassword.js.map +1 -1
  29. package/dist/auth/sendVerificationEmail.d.ts +2 -2
  30. package/dist/auth/sendVerificationEmail.d.ts.map +1 -1
  31. package/dist/auth/sendVerificationEmail.js +1 -1
  32. package/dist/auth/sendVerificationEmail.js.map +1 -1
  33. package/dist/auth/sessions.d.ts +4 -5
  34. package/dist/auth/sessions.d.ts.map +1 -1
  35. package/dist/auth/sessions.js +5 -3
  36. package/dist/auth/sessions.js.map +1 -1
  37. package/dist/auth/strategies/apiKey.js.map +1 -1
  38. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts +2 -2
  39. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts.map +1 -1
  40. package/dist/auth/strategies/local/incrementLoginAttempts.js +1 -1
  41. package/dist/auth/strategies/local/incrementLoginAttempts.js.map +1 -1
  42. package/dist/auth/types.d.ts +28 -21
  43. package/dist/auth/types.d.ts.map +1 -1
  44. package/dist/auth/types.js.map +1 -1
  45. package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
  46. package/dist/bin/generateImportMap/iterateCollections.js +10 -0
  47. package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
  48. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.d.ts.map +1 -1
  49. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js +11 -3
  50. package/dist/bin/generateImportMap/utilities/resolveImportMapFilePath.js.map +1 -1
  51. package/dist/collections/config/client.d.ts +1 -1
  52. package/dist/collections/config/client.d.ts.map +1 -1
  53. package/dist/collections/config/client.js +1 -0
  54. package/dist/collections/config/client.js.map +1 -1
  55. package/dist/collections/config/defaults.d.ts +0 -4
  56. package/dist/collections/config/defaults.d.ts.map +1 -1
  57. package/dist/collections/config/defaults.js +0 -15
  58. package/dist/collections/config/defaults.js.map +1 -1
  59. package/dist/collections/config/types.d.ts +6 -0
  60. package/dist/collections/config/types.d.ts.map +1 -1
  61. package/dist/collections/config/types.js.map +1 -1
  62. package/dist/collections/operations/findDistinct.d.ts.map +1 -1
  63. package/dist/collections/operations/findDistinct.js +1 -0
  64. package/dist/collections/operations/findDistinct.js.map +1 -1
  65. package/dist/collections/operations/local/count.d.ts +3 -3
  66. package/dist/collections/operations/local/count.d.ts.map +1 -1
  67. package/dist/collections/operations/local/count.js.map +1 -1
  68. package/dist/collections/operations/local/countVersions.d.ts +3 -3
  69. package/dist/collections/operations/local/countVersions.d.ts.map +1 -1
  70. package/dist/collections/operations/local/countVersions.js.map +1 -1
  71. package/dist/collections/operations/local/create.d.ts +3 -3
  72. package/dist/collections/operations/local/create.d.ts.map +1 -1
  73. package/dist/collections/operations/local/create.js.map +1 -1
  74. package/dist/collections/operations/local/delete.d.ts +3 -3
  75. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  76. package/dist/collections/operations/local/delete.js.map +1 -1
  77. package/dist/collections/operations/local/duplicate.d.ts +3 -3
  78. package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
  79. package/dist/collections/operations/local/duplicate.js.map +1 -1
  80. package/dist/collections/operations/local/find.d.ts +3 -3
  81. package/dist/collections/operations/local/find.d.ts.map +1 -1
  82. package/dist/collections/operations/local/find.js.map +1 -1
  83. package/dist/collections/operations/local/findByID.d.ts +3 -3
  84. package/dist/collections/operations/local/findByID.d.ts.map +1 -1
  85. package/dist/collections/operations/local/findByID.js.map +1 -1
  86. package/dist/collections/operations/local/findDistinct.d.ts +2 -2
  87. package/dist/collections/operations/local/findDistinct.d.ts.map +1 -1
  88. package/dist/collections/operations/local/findDistinct.js.map +1 -1
  89. package/dist/collections/operations/local/findVersionByID.d.ts +3 -3
  90. package/dist/collections/operations/local/findVersionByID.d.ts.map +1 -1
  91. package/dist/collections/operations/local/findVersionByID.js.map +1 -1
  92. package/dist/collections/operations/local/findVersions.d.ts +3 -3
  93. package/dist/collections/operations/local/findVersions.d.ts.map +1 -1
  94. package/dist/collections/operations/local/findVersions.js.map +1 -1
  95. package/dist/collections/operations/local/restoreVersion.d.ts +3 -3
  96. package/dist/collections/operations/local/restoreVersion.d.ts.map +1 -1
  97. package/dist/collections/operations/local/restoreVersion.js.map +1 -1
  98. package/dist/collections/operations/local/update.d.ts +3 -3
  99. package/dist/collections/operations/local/update.d.ts.map +1 -1
  100. package/dist/collections/operations/local/update.js.map +1 -1
  101. package/dist/collections/operations/utilities/types.d.ts +0 -9
  102. package/dist/collections/operations/utilities/types.d.ts.map +1 -1
  103. package/dist/collections/operations/utilities/types.js.map +1 -1
  104. package/dist/config/client.d.ts +2 -2
  105. package/dist/config/client.d.ts.map +1 -1
  106. package/dist/config/client.js.map +1 -1
  107. package/dist/config/defaults.d.ts +0 -4
  108. package/dist/config/defaults.d.ts.map +1 -1
  109. package/dist/config/defaults.js +0 -78
  110. package/dist/config/defaults.js.map +1 -1
  111. package/dist/config/definePlugin.d.ts +10 -10
  112. package/dist/config/definePlugin.d.ts.map +1 -1
  113. package/dist/config/definePlugin.js +7 -11
  114. package/dist/config/definePlugin.js.map +1 -1
  115. package/dist/config/sanitize.d.ts.map +1 -1
  116. package/dist/config/sanitize.js +137 -13
  117. package/dist/config/sanitize.js.map +1 -1
  118. package/dist/config/types.d.ts +35 -3
  119. package/dist/config/types.d.ts.map +1 -1
  120. package/dist/config/types.js.map +1 -1
  121. package/dist/exports/internal.d.ts +1 -0
  122. package/dist/exports/internal.d.ts.map +1 -1
  123. package/dist/exports/internal.js +1 -0
  124. package/dist/exports/internal.js.map +1 -1
  125. package/dist/exports/shared.d.ts +3 -2
  126. package/dist/exports/shared.d.ts.map +1 -1
  127. package/dist/exports/shared.js +2 -1
  128. package/dist/exports/shared.js.map +1 -1
  129. package/dist/fields/baseFields/slug/countVersions.d.ts.map +1 -1
  130. package/dist/fields/baseFields/slug/countVersions.js +6 -8
  131. package/dist/fields/baseFields/slug/countVersions.js.map +1 -1
  132. package/dist/fields/baseFields/slug/generateSlug.d.ts +14 -7
  133. package/dist/fields/baseFields/slug/generateSlug.d.ts.map +1 -1
  134. package/dist/fields/baseFields/slug/generateSlug.js +53 -73
  135. package/dist/fields/baseFields/slug/generateSlug.js.map +1 -1
  136. package/dist/fields/baseFields/slug/types.d.ts +14 -0
  137. package/dist/fields/baseFields/slug/types.d.ts.map +1 -0
  138. package/dist/fields/baseFields/slug/types.js +6 -0
  139. package/dist/fields/baseFields/slug/types.js.map +1 -0
  140. package/dist/fields/config/client.d.ts +1 -1
  141. package/dist/fields/config/client.d.ts.map +1 -1
  142. package/dist/fields/config/client.js +2 -1
  143. package/dist/fields/config/client.js.map +1 -1
  144. package/dist/fields/config/sanitize.d.ts.map +1 -1
  145. package/dist/fields/config/sanitize.js +39 -0
  146. package/dist/fields/config/sanitize.js.map +1 -1
  147. package/dist/fields/config/types.d.ts +44 -8
  148. package/dist/fields/config/types.d.ts.map +1 -1
  149. package/dist/fields/config/types.js.map +1 -1
  150. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  151. package/dist/fields/hooks/afterRead/promise.js +11 -1
  152. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  153. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  154. package/dist/fields/hooks/beforeValidate/promise.js +10 -1
  155. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  156. package/dist/fields/setDefaultBeforeDuplicate.js +1 -0
  157. package/dist/fields/setDefaultBeforeDuplicate.js.map +1 -1
  158. package/dist/fields/sortableFieldTypes.d.ts.map +1 -1
  159. package/dist/fields/sortableFieldTypes.js +1 -0
  160. package/dist/fields/sortableFieldTypes.js.map +1 -1
  161. package/dist/fields/validations.d.ts +4 -1
  162. package/dist/fields/validations.d.ts.map +1 -1
  163. package/dist/fields/validations.js +7 -0
  164. package/dist/fields/validations.js.map +1 -1
  165. package/dist/globals/operations/local/countVersions.d.ts +3 -3
  166. package/dist/globals/operations/local/countVersions.d.ts.map +1 -1
  167. package/dist/globals/operations/local/countVersions.js.map +1 -1
  168. package/dist/globals/operations/local/findOne.d.ts +3 -3
  169. package/dist/globals/operations/local/findOne.d.ts.map +1 -1
  170. package/dist/globals/operations/local/findOne.js.map +1 -1
  171. package/dist/globals/operations/local/findVersionByID.d.ts +3 -3
  172. package/dist/globals/operations/local/findVersionByID.d.ts.map +1 -1
  173. package/dist/globals/operations/local/findVersionByID.js.map +1 -1
  174. package/dist/globals/operations/local/findVersions.d.ts +3 -3
  175. package/dist/globals/operations/local/findVersions.d.ts.map +1 -1
  176. package/dist/globals/operations/local/findVersions.js.map +1 -1
  177. package/dist/globals/operations/local/restoreVersion.d.ts +3 -3
  178. package/dist/globals/operations/local/restoreVersion.d.ts.map +1 -1
  179. package/dist/globals/operations/local/restoreVersion.js.map +1 -1
  180. package/dist/globals/operations/local/update.d.ts +3 -3
  181. package/dist/globals/operations/local/update.d.ts.map +1 -1
  182. package/dist/globals/operations/local/update.js.map +1 -1
  183. package/dist/index.bundled.d.ts +365 -300
  184. package/dist/index.d.ts +59 -15
  185. package/dist/index.d.ts.map +1 -1
  186. package/dist/index.js +1 -2
  187. package/dist/index.js.map +1 -1
  188. package/dist/preferences/keys.d.ts +4 -0
  189. package/dist/preferences/keys.d.ts.map +1 -1
  190. package/dist/preferences/keys.js +4 -1
  191. package/dist/preferences/keys.js.map +1 -1
  192. package/dist/preferences/types.d.ts +15 -0
  193. package/dist/preferences/types.d.ts.map +1 -1
  194. package/dist/preferences/types.js +3 -1
  195. package/dist/preferences/types.js.map +1 -1
  196. package/dist/types/index.d.ts +8 -3
  197. package/dist/types/index.d.ts.map +1 -1
  198. package/dist/types/index.js.map +1 -1
  199. package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
  200. package/dist/uploads/fetchAPI-multipart/processMultipart.js +1 -14
  201. package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
  202. package/dist/uploads/matchMimeType.d.ts +8 -0
  203. package/dist/uploads/matchMimeType.d.ts.map +1 -0
  204. package/dist/uploads/matchMimeType.js +19 -0
  205. package/dist/uploads/matchMimeType.js.map +1 -0
  206. package/dist/uploads/matchMimeType.spec.js +66 -0
  207. package/dist/uploads/matchMimeType.spec.js.map +1 -0
  208. package/dist/uploads/types.d.ts +21 -0
  209. package/dist/uploads/types.d.ts.map +1 -1
  210. package/dist/uploads/types.js.map +1 -1
  211. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  212. package/dist/utilities/addDataAndFileToRequest.js +6 -0
  213. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  214. package/dist/utilities/configToJSONSchema.d.ts +13 -4
  215. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  216. package/dist/utilities/configToJSONSchema.js +139 -61
  217. package/dist/utilities/configToJSONSchema.js.map +1 -1
  218. package/dist/utilities/configToJSONSchema.spec.js +319 -0
  219. package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
  220. package/dist/utilities/createLocalReq.d.ts +2 -2
  221. package/dist/utilities/createLocalReq.d.ts.map +1 -1
  222. package/dist/utilities/createLocalReq.js.map +1 -1
  223. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  224. package/dist/utilities/createPayloadRequest.js +1 -0
  225. package/dist/utilities/createPayloadRequest.js.map +1 -1
  226. package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
  227. package/dist/utilities/getEntityPermissions/getEntityPermissions.js +2 -0
  228. package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
  229. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts +7 -1
  230. package/dist/utilities/getEntityPermissions/populateFieldPermissions.d.ts.map +1 -1
  231. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js +19 -2
  232. package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
  233. package/dist/utilities/isURLAllowed.d.ts.map +1 -1
  234. package/dist/utilities/isURLAllowed.js +9 -3
  235. package/dist/utilities/isURLAllowed.js.map +1 -1
  236. package/dist/utilities/isURLAllowed.spec.js +78 -0
  237. package/dist/utilities/isURLAllowed.spec.js.map +1 -0
  238. package/dist/utilities/telemetry/conf/envPaths.d.ts.map +1 -1
  239. package/dist/utilities/telemetry/conf/envPaths.js +40 -31
  240. package/dist/utilities/telemetry/conf/envPaths.js.map +1 -1
  241. package/dist/utilities/telemetry/events/adminInit.d.ts.map +1 -1
  242. package/dist/utilities/telemetry/events/adminInit.js +2 -3
  243. package/dist/utilities/telemetry/events/adminInit.js.map +1 -1
  244. package/dist/utilities/telemetry/events/serverInit.d.ts.map +1 -1
  245. package/dist/utilities/telemetry/events/serverInit.js +2 -3
  246. package/dist/utilities/telemetry/events/serverInit.js.map +1 -1
  247. package/dist/utilities/telemetry/index.d.ts +14 -3
  248. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  249. package/dist/utilities/telemetry/index.js +6 -1
  250. package/dist/utilities/telemetry/index.js.map +1 -1
  251. package/dist/utilities/telemetry/index.spec.js +43 -0
  252. package/dist/utilities/telemetry/index.spec.js.map +1 -0
  253. package/dist/versions/schedule/job.js.map +1 -1
  254. package/package.json +3 -3
  255. package/dist/fields/baseFields/slug/index.d.ts +0 -89
  256. package/dist/fields/baseFields/slug/index.d.ts.map +0 -1
  257. package/dist/fields/baseFields/slug/index.js +0 -81
  258. package/dist/fields/baseFields/slug/index.js.map +0 -1
  259. package/dist/utilities/isRSCEnabled.d.ts +0 -12
  260. package/dist/utilities/isRSCEnabled.d.ts.map +0 -1
  261. package/dist/utilities/isRSCEnabled.js +0 -14
  262. package/dist/utilities/isRSCEnabled.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"generateSlug.d.ts","sourceRoot":"","sources":["../../../../src/fields/baseFields/slug/generateSlug.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAW,MAAM,YAAY,CAAA;AAMxD,KAAK,QAAQ,GAAG;IACd,aAAa,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;CAClD,GAAG,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,GAChC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;AAoB5C;;;GAGG;AACH,eAAO,MAAM,YAAY,GACtB,sDAAsD,QAAQ,KAAG,SA6EjE,CAAA"}
1
+ {"version":3,"file":"generateSlug.d.ts","sourceRoot":"","sources":["../../../../src/fields/baseFields/slug/generateSlug.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAMzC,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GACtB,6CAA6C,IAAI,KAAG,SA+DpD,CAAA"}
@@ -1,84 +1,64 @@
1
1
  import { hasAutosaveEnabled } from '../../../utilities/getVersionsConfig.js';
2
2
  import { slugify as defaultSlugify } from '../../../utilities/slugify.js';
3
3
  import { countVersions } from './countVersions.js';
4
- const slugify = ({ customSlugify, data, req, valueToSlugify })=>{
5
- if (customSlugify) {
6
- return customSlugify({
7
- data,
8
- req,
9
- valueToSlugify
10
- });
11
- }
12
- return defaultSlugify(valueToSlugify);
13
- };
14
4
  /**
15
- * This is a `BeforeChange` field hook used to auto-generate the `slug` field.
16
- * See `slugField` for more details.
17
- */ export const generateSlug = ({ slugFieldName, slugify: customSlugify, useAsSlug })=>async ({ collection, data, global, operation, originalDoc, req, value: isChecked })=>{
5
+ * Field `beforeChange` hook for the native `slug` field. Returns the slug value.
6
+ *
7
+ * Auto-tracking is derived statelessly: the slug follows its source while it is
8
+ * empty or still equals `slugify(storedSource)`. Once it diverges (the admin
9
+ * overwrites it), it freezes — and stays frozen, because the stored value keeps
10
+ * differing from `slugify(source)`. Re-aligning (the UI generate button) resumes
11
+ * tracking.
12
+ */ export const generateSlug = ({ name, slugify: customSlugify, useAsSlug })=>async ({ collection, data, global, operation, originalDoc, req, value })=>{
13
+ const source = data?.[useAsSlug];
14
+ const slugify = (valueToSlugify)=>customSlugify ? customSlugify({
15
+ data: data ?? {},
16
+ req,
17
+ valueToSlugify
18
+ }) : defaultSlugify(valueToSlugify);
19
+ const entity = collection || global;
18
20
  if (operation === 'create') {
19
- if (data) {
20
- data[slugFieldName] = slugify({
21
- customSlugify,
22
- data,
23
- req,
24
- // Ensure user-defined slugs are not overwritten during create
25
- // Use a generic falsy check here to include empty strings
26
- valueToSlugify: data?.[slugFieldName] || data?.[useAsSlug]
27
- });
21
+ // Autosave drafts: do not auto-generate on the initial draft — the user is still entering content.
22
+ // Keep the explicit non-slugified value (if any); generation begins on a later autosave.
23
+ if (hasAutosaveEnabled(entity) && data?._status === 'draft') {
24
+ return value || null;
28
25
  }
29
- return Boolean(!data?.[slugFieldName]);
26
+ // Keep an explicitly provided slug; otherwise generate from the source.
27
+ return await slugify(value || source);
30
28
  }
31
- if (operation === 'update') {
32
- // Early return to avoid additional processing
33
- if (!isChecked) {
34
- return false;
35
- }
36
- if (!hasAutosaveEnabled(collection || global)) {
37
- // We can generate the slug at this point
38
- if (data) {
39
- data[slugFieldName] = slugify({
40
- customSlugify,
41
- data,
42
- req,
43
- valueToSlugify: data?.[useAsSlug]
44
- });
45
- }
46
- return Boolean(!data?.[slugFieldName]);
47
- } else {
48
- // If we're publishing, we can avoid querying as we can safely assume we've exceeded the version threshold (2)
49
- const isPublishing = data?._status === 'published';
50
- // Ensure the user can take over the generated slug themselves without it ever being overridden back
51
- const userOverride = data?.[slugFieldName] !== originalDoc?.[slugFieldName];
52
- if (!userOverride) {
53
- if (data) {
54
- // If the fallback is an empty string, we want the slug to return to `null`
55
- // This will ensure that live preview conditions continue to run as expected
56
- data[slugFieldName] = data?.[useAsSlug] ? slugify({
57
- customSlugify,
58
- data,
59
- req,
60
- valueToSlugify: data?.[useAsSlug]
61
- }) : null;
62
- }
63
- }
64
- if (isPublishing || userOverride) {
65
- return false;
66
- }
67
- // Important: ensure `countVersions` is not called unnecessarily often
68
- // That is why this is buried beneath all these conditions
69
- const versionCount = await countVersions({
70
- collectionSlug: collection?.slug,
71
- globalSlug: global?.slug,
72
- parentID: originalDoc?.id,
73
- req
74
- });
75
- if (versionCount <= 2) {
76
- return true;
77
- } else {
78
- return false;
79
- }
80
- }
29
+ const storedSlug = originalDoc?.[name];
30
+ const originalSource = originalDoc?.[useAsSlug];
31
+ // User explicitly edited the slug (or cleared the value): respect it.
32
+ if (value !== undefined && value !== storedSlug) {
33
+ return value;
34
+ }
35
+ // No explicit edit this save. If the stored slug doesn't match what its source
36
+ // would generate, it was customized on an earlier save — keep it frozen.
37
+ const storedSlugIsCustom = storedSlug && storedSlug !== await slugify(originalSource);
38
+ if (storedSlugIsCustom) {
39
+ return storedSlug;
40
+ }
41
+ if (!hasAutosaveEnabled(entity)) {
42
+ // Non-autosave: generate once while empty, then freeze.
43
+ return storedSlug || await slugify(source);
44
+ }
45
+ // Autosave / drafts
46
+ const priorVersions = await countVersions({
47
+ collectionSlug: collection?.slug,
48
+ globalSlug: global?.slug,
49
+ parentID: originalDoc?.id,
50
+ req
51
+ });
52
+ // Do not generate on the very first draft (no prior version yet).
53
+ if (priorVersions === 0) {
54
+ return storedSlug ?? null;
55
+ }
56
+ // Stabilize after publish to protect live URLs.
57
+ if (data?._status === 'published' || originalDoc?._status === 'published') {
58
+ return storedSlug;
81
59
  }
60
+ // Still auto-tracking an unpublished draft with content.
61
+ return source ? await slugify(source) : null;
82
62
  };
83
63
 
84
64
  //# sourceMappingURL=generateSlug.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/fields/baseFields/slug/generateSlug.ts"],"sourcesContent":["import type { PayloadRequest } from '../../../types/index.js'\nimport type { FieldHook } from '../../config/types.js'\nimport type { SlugFieldArgs, Slugify } from './index.js'\n\nimport { hasAutosaveEnabled } from '../../../utilities/getVersionsConfig.js'\nimport { slugify as defaultSlugify } from '../../../utilities/slugify.js'\nimport { countVersions } from './countVersions.js'\n\ntype HookArgs = {\n slugFieldName: NonNullable<SlugFieldArgs['name']>\n} & Pick<SlugFieldArgs, 'slugify'> &\n Required<Pick<SlugFieldArgs, 'useAsSlug'>>\n\nconst slugify = ({\n customSlugify,\n data,\n req,\n valueToSlugify,\n}: {\n customSlugify?: Slugify\n data: Record<string, unknown>\n req: PayloadRequest\n valueToSlugify?: string\n}) => {\n if (customSlugify) {\n return customSlugify({ data, req, valueToSlugify })\n }\n\n return defaultSlugify(valueToSlugify)\n}\n\n/**\n * This is a `BeforeChange` field hook used to auto-generate the `slug` field.\n * See `slugField` for more details.\n */\nexport const generateSlug =\n ({ slugFieldName, slugify: customSlugify, useAsSlug }: HookArgs): FieldHook =>\n async ({ collection, data, global, operation, originalDoc, req, value: isChecked }) => {\n if (operation === 'create') {\n if (data) {\n data[slugFieldName] = slugify({\n customSlugify,\n data,\n req,\n // Ensure user-defined slugs are not overwritten during create\n // Use a generic falsy check here to include empty strings\n valueToSlugify: data?.[slugFieldName] || data?.[useAsSlug],\n })\n }\n\n return Boolean(!data?.[slugFieldName])\n }\n\n if (operation === 'update') {\n // Early return to avoid additional processing\n if (!isChecked) {\n return false\n }\n\n if (!hasAutosaveEnabled(collection || global!)) {\n // We can generate the slug at this point\n if (data) {\n data[slugFieldName] = slugify({\n customSlugify,\n data,\n req,\n valueToSlugify: data?.[useAsSlug],\n })\n }\n\n return Boolean(!data?.[slugFieldName])\n } else {\n // If we're publishing, we can avoid querying as we can safely assume we've exceeded the version threshold (2)\n const isPublishing = data?._status === 'published'\n\n // Ensure the user can take over the generated slug themselves without it ever being overridden back\n const userOverride = data?.[slugFieldName] !== originalDoc?.[slugFieldName]\n\n if (!userOverride) {\n if (data) {\n // If the fallback is an empty string, we want the slug to return to `null`\n // This will ensure that live preview conditions continue to run as expected\n data[slugFieldName] = data?.[useAsSlug]\n ? slugify({\n customSlugify,\n data,\n req,\n valueToSlugify: data?.[useAsSlug],\n })\n : null\n }\n }\n\n if (isPublishing || userOverride) {\n return false\n }\n\n // Important: ensure `countVersions` is not called unnecessarily often\n // That is why this is buried beneath all these conditions\n const versionCount = await countVersions({\n collectionSlug: collection?.slug,\n globalSlug: global?.slug,\n parentID: originalDoc?.id,\n req,\n })\n\n if (versionCount <= 2) {\n return true\n } else {\n return false\n }\n }\n }\n }\n"],"names":["hasAutosaveEnabled","slugify","defaultSlugify","countVersions","customSlugify","data","req","valueToSlugify","generateSlug","slugFieldName","useAsSlug","collection","global","operation","originalDoc","value","isChecked","Boolean","isPublishing","_status","userOverride","versionCount","collectionSlug","slug","globalSlug","parentID","id"],"mappings":"AAIA,SAASA,kBAAkB,QAAQ,0CAAyC;AAC5E,SAASC,WAAWC,cAAc,QAAQ,gCAA+B;AACzE,SAASC,aAAa,QAAQ,qBAAoB;AAOlD,MAAMF,UAAU,CAAC,EACfG,aAAa,EACbC,IAAI,EACJC,GAAG,EACHC,cAAc,EAMf;IACC,IAAIH,eAAe;QACjB,OAAOA,cAAc;YAAEC;YAAMC;YAAKC;QAAe;IACnD;IAEA,OAAOL,eAAeK;AACxB;AAEA;;;CAGC,GACD,OAAO,MAAMC,eACX,CAAC,EAAEC,aAAa,EAAER,SAASG,aAAa,EAAEM,SAAS,EAAY,GAC/D,OAAO,EAAEC,UAAU,EAAEN,IAAI,EAAEO,MAAM,EAAEC,SAAS,EAAEC,WAAW,EAAER,GAAG,EAAES,OAAOC,SAAS,EAAE;QAChF,IAAIH,cAAc,UAAU;YAC1B,IAAIR,MAAM;gBACRA,IAAI,CAACI,cAAc,GAAGR,QAAQ;oBAC5BG;oBACAC;oBACAC;oBACA,8DAA8D;oBAC9D,0DAA0D;oBAC1DC,gBAAgBF,MAAM,CAACI,cAAc,IAAIJ,MAAM,CAACK,UAAU;gBAC5D;YACF;YAEA,OAAOO,QAAQ,CAACZ,MAAM,CAACI,cAAc;QACvC;QAEA,IAAII,cAAc,UAAU;YAC1B,8CAA8C;YAC9C,IAAI,CAACG,WAAW;gBACd,OAAO;YACT;YAEA,IAAI,CAAChB,mBAAmBW,cAAcC,SAAU;gBAC9C,yCAAyC;gBACzC,IAAIP,MAAM;oBACRA,IAAI,CAACI,cAAc,GAAGR,QAAQ;wBAC5BG;wBACAC;wBACAC;wBACAC,gBAAgBF,MAAM,CAACK,UAAU;oBACnC;gBACF;gBAEA,OAAOO,QAAQ,CAACZ,MAAM,CAACI,cAAc;YACvC,OAAO;gBACL,8GAA8G;gBAC9G,MAAMS,eAAeb,MAAMc,YAAY;gBAEvC,oGAAoG;gBACpG,MAAMC,eAAef,MAAM,CAACI,cAAc,KAAKK,aAAa,CAACL,cAAc;gBAE3E,IAAI,CAACW,cAAc;oBACjB,IAAIf,MAAM;wBACR,2EAA2E;wBAC3E,4EAA4E;wBAC5EA,IAAI,CAACI,cAAc,GAAGJ,MAAM,CAACK,UAAU,GACnCT,QAAQ;4BACNG;4BACAC;4BACAC;4BACAC,gBAAgBF,MAAM,CAACK,UAAU;wBACnC,KACA;oBACN;gBACF;gBAEA,IAAIQ,gBAAgBE,cAAc;oBAChC,OAAO;gBACT;gBAEA,sEAAsE;gBACtE,0DAA0D;gBAC1D,MAAMC,eAAe,MAAMlB,cAAc;oBACvCmB,gBAAgBX,YAAYY;oBAC5BC,YAAYZ,QAAQW;oBACpBE,UAAUX,aAAaY;oBACvBpB;gBACF;gBAEA,IAAIe,gBAAgB,GAAG;oBACrB,OAAO;gBACT,OAAO;oBACL,OAAO;gBACT;YACF;QACF;IACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/fields/baseFields/slug/generateSlug.ts"],"sourcesContent":["import type { TypeWithID } from '../../../collections/config/types.js'\nimport type { FieldHook } from '../../config/types.js'\nimport type { Slugify } from './types.js'\n\nimport { hasAutosaveEnabled } from '../../../utilities/getVersionsConfig.js'\nimport { slugify as defaultSlugify } from '../../../utilities/slugify.js'\nimport { countVersions } from './countVersions.js'\n\ntype Args = {\n name: string\n slugify?: Slugify\n useAsSlug: string\n}\n\n/**\n * Field `beforeChange` hook for the native `slug` field. Returns the slug value.\n *\n * Auto-tracking is derived statelessly: the slug follows its source while it is\n * empty or still equals `slugify(storedSource)`. Once it diverges (the admin\n * overwrites it), it freezes and stays frozen, because the stored value keeps\n * differing from `slugify(source)`. Re-aligning (the UI generate button) resumes\n * tracking.\n */\nexport const generateSlug =\n ({ name, slugify: customSlugify, useAsSlug }: Args): FieldHook =>\n async ({ collection, data, global, operation, originalDoc, req, value }) => {\n const source = data?.[useAsSlug]\n\n const slugify = (valueToSlugify: unknown) =>\n customSlugify\n ? customSlugify({ data: (data ?? {}) as TypeWithID, req, valueToSlugify })\n : defaultSlugify(valueToSlugify as string)\n\n const entity = collection || global!\n\n if (operation === 'create') {\n // Autosave drafts: do not auto-generate on the initial draft the user is still entering content.\n // Keep the explicit non-slugified value (if any); generation begins on a later autosave.\n if (hasAutosaveEnabled(entity) && data?._status === 'draft') {\n return value || null\n }\n\n // Keep an explicitly provided slug; otherwise generate from the source.\n return await slugify(value || source)\n }\n\n const storedSlug = originalDoc?.[name]\n const originalSource = originalDoc?.[useAsSlug]\n\n // User explicitly edited the slug (or cleared the value): respect it.\n if (value !== undefined && value !== storedSlug) {\n return value\n }\n\n // No explicit edit this save. If the stored slug doesn't match what its source\n // would generate, it was customized on an earlier save keep it frozen.\n const storedSlugIsCustom = storedSlug && storedSlug !== (await slugify(originalSource))\n\n if (storedSlugIsCustom) {\n return storedSlug\n }\n\n if (!hasAutosaveEnabled(entity)) {\n // Non-autosave: generate once while empty, then freeze.\n return storedSlug || (await slugify(source))\n }\n\n // Autosave / drafts\n const priorVersions = await countVersions({\n collectionSlug: collection?.slug,\n globalSlug: global?.slug,\n parentID: originalDoc?.id,\n req,\n })\n\n // Do not generate on the very first draft (no prior version yet).\n if (priorVersions === 0) {\n return storedSlug ?? null\n }\n\n // Stabilize after publish to protect live URLs.\n if (data?._status === 'published' || originalDoc?._status === 'published') {\n return storedSlug\n }\n\n // Still auto-tracking an unpublished draft with content.\n return source ? await slugify(source) : null\n }\n"],"names":["hasAutosaveEnabled","slugify","defaultSlugify","countVersions","generateSlug","name","customSlugify","useAsSlug","collection","data","global","operation","originalDoc","req","value","source","valueToSlugify","entity","_status","storedSlug","originalSource","undefined","storedSlugIsCustom","priorVersions","collectionSlug","slug","globalSlug","parentID","id"],"mappings":"AAIA,SAASA,kBAAkB,QAAQ,0CAAyC;AAC5E,SAASC,WAAWC,cAAc,QAAQ,gCAA+B;AACzE,SAASC,aAAa,QAAQ,qBAAoB;AAQlD;;;;;;;;CAQC,GACD,OAAO,MAAMC,eACX,CAAC,EAAEC,IAAI,EAAEJ,SAASK,aAAa,EAAEC,SAAS,EAAQ,GAClD,OAAO,EAAEC,UAAU,EAAEC,IAAI,EAAEC,MAAM,EAAEC,SAAS,EAAEC,WAAW,EAAEC,GAAG,EAAEC,KAAK,EAAE;QACrE,MAAMC,SAASN,MAAM,CAACF,UAAU;QAEhC,MAAMN,UAAU,CAACe,iBACfV,gBACIA,cAAc;gBAAEG,MAAOA,QAAQ,CAAC;gBAAkBI;gBAAKG;YAAe,KACtEd,eAAec;QAErB,MAAMC,SAAST,cAAcE;QAE7B,IAAIC,cAAc,UAAU;YAC1B,mGAAmG;YACnG,yFAAyF;YACzF,IAAIX,mBAAmBiB,WAAWR,MAAMS,YAAY,SAAS;gBAC3D,OAAOJ,SAAS;YAClB;YAEA,wEAAwE;YACxE,OAAO,MAAMb,QAAQa,SAASC;QAChC;QAEA,MAAMI,aAAaP,aAAa,CAACP,KAAK;QACtC,MAAMe,iBAAiBR,aAAa,CAACL,UAAU;QAE/C,sEAAsE;QACtE,IAAIO,UAAUO,aAAaP,UAAUK,YAAY;YAC/C,OAAOL;QACT;QAEA,+EAA+E;QAC/E,yEAAyE;QACzE,MAAMQ,qBAAqBH,cAAcA,eAAgB,MAAMlB,QAAQmB;QAEvE,IAAIE,oBAAoB;YACtB,OAAOH;QACT;QAEA,IAAI,CAACnB,mBAAmBiB,SAAS;YAC/B,wDAAwD;YACxD,OAAOE,cAAe,MAAMlB,QAAQc;QACtC;QAEA,oBAAoB;QACpB,MAAMQ,gBAAgB,MAAMpB,cAAc;YACxCqB,gBAAgBhB,YAAYiB;YAC5BC,YAAYhB,QAAQe;YACpBE,UAAUf,aAAagB;YACvBf;QACF;QAEA,kEAAkE;QAClE,IAAIU,kBAAkB,GAAG;YACvB,OAAOJ,cAAc;QACvB;QAEA,gDAAgD;QAChD,IAAIV,MAAMS,YAAY,eAAeN,aAAaM,YAAY,aAAa;YACzE,OAAOC;QACT;QAEA,yDAAyD;QACzD,OAAOJ,SAAS,MAAMd,QAAQc,UAAU;IAC1C,EAAC"}
@@ -0,0 +1,14 @@
1
+ import type { TextFieldClientProps } from '../../../admin/types.js';
2
+ import type { TypeWithID } from '../../../collections/config/types.js';
3
+ import type { PayloadRequest } from '../../../types/index.js';
4
+ export type Slugify<T extends TypeWithID = any> = (args: {
5
+ data: T;
6
+ req: PayloadRequest;
7
+ valueToSlugify?: any;
8
+ }) => Promise<string | undefined> | string | undefined;
9
+ /**
10
+ * Props the `SlugField` client component receives. The slug-specific `useAsSlug`
11
+ * arrives on the client field config (it is not a server-only property).
12
+ */
13
+ export type SlugFieldClientProps = TextFieldClientProps;
14
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/fields/baseFields/slug/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAA;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAE7D,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,UAAU,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;IACvD,IAAI,EAAE,CAAC,CAAA;IACP,GAAG,EAAE,cAAc,CAAA;IACnB,cAAc,CAAC,EAAE,GAAG,CAAA;CACrB,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAAA;AAEtD;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Props the `SlugField` client component receives. The slug-specific `useAsSlug`
3
+ * arrives on the client field config (it is not a server-only property).
4
+ */ export { };
5
+
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/fields/baseFields/slug/types.ts"],"sourcesContent":["import type { TextFieldClientProps } from '../../../admin/types.js'\nimport type { TypeWithID } from '../../../collections/config/types.js'\nimport type { PayloadRequest } from '../../../types/index.js'\n\nexport type Slugify<T extends TypeWithID = any> = (args: {\n data: T\n req: PayloadRequest\n valueToSlugify?: any\n}) => Promise<string | undefined> | string | undefined\n\n/**\n * Props the `SlugField` client component receives. The slug-specific `useAsSlug`\n * arrives on the client field config (it is not a server-only property).\n */\nexport type SlugFieldClientProps = TextFieldClientProps\n"],"names":[],"mappings":"AAUA;;;CAGC,GACD,WAAuD"}
@@ -3,7 +3,7 @@ import type { ImportMap } from '../../bin/generateImportMap/index.js';
3
3
  import type { Block, ClientBlock, ClientField, Field, FieldBase } from '../../fields/config/types.js';
4
4
  import type { Payload } from '../../types/index.js';
5
5
  export { ClientField };
6
- export type ServerOnlyFieldProperties = 'dbName' | 'editor' | 'enumName' | 'filterOptions' | 'graphQL' | 'jsonSchema' | 'label' | 'validate' | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>;
6
+ export type ServerOnlyFieldProperties = 'dbName' | 'editor' | 'enumName' | 'filterOptions' | 'graphQL' | 'jsonSchema' | 'label' | 'slugify' | 'validate' | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>;
7
7
  export type ServerOnlyFieldAdminProperties = keyof Pick<FieldBase['admin'], 'components' | 'condition'>;
8
8
  export declare const createClientBlocks: ({ blocks, defaultIDType, i18n, importMap, }: {
9
9
  blocks: (Block | string)[];
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/fields/config/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyB,UAAU,EAAa,MAAM,0BAA0B,CAAA;AAE5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAErE,OAAO,KAAK,EAGV,KAAK,EAGL,WAAW,EACX,WAAW,EAEX,KAAK,EACL,SAAS,EAOV,MAAM,8BAA8B,CAAA;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAUnD,OAAO,EAAE,WAAW,EAAE,CAAA;AAEtB,MAAM,MAAM,yBAAyB,GACjC,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,eAAe,GACf,SAAS,GACT,YAAY,GACZ,OAAO,GACP,UAAU,GACV,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC,CAAA;AAEzE,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CACrD,SAAS,CAAC,OAAO,CAAC,EAElB,YAAY,GAAG,WAAW,CAC3B,CAAA;AA+BD,eAAO,MAAM,kBAAkB,GAAI,6CAKhC;IACD,MAAM,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,CAAA;IAC1B,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAA;IACvD,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAG,CAAC,WAAW,GAAG,MAAM,CAAC,EAiFzB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,2DAK/B;IACD,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAA;IACvD,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAG,WAmSH,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,8DAMhC;IACD,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAA;IACvD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAG,WAAW,EAiCd,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/fields/config/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyB,UAAU,EAAa,MAAM,0BAA0B,CAAA;AAE5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAErE,OAAO,KAAK,EAGV,KAAK,EAGL,WAAW,EACX,WAAW,EAEX,KAAK,EACL,SAAS,EAOV,MAAM,8BAA8B,CAAA;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAUnD,OAAO,EAAE,WAAW,EAAE,CAAA;AAEtB,MAAM,MAAM,yBAAyB,GACjC,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,eAAe,GACf,SAAS,GACT,YAAY,GACZ,OAAO,GACP,SAAS,GACT,UAAU,GACV,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC,CAAA;AAEzE,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CACrD,SAAS,CAAC,OAAO,CAAC,EAElB,YAAY,GAAG,WAAW,CAC3B,CAAA;AAgCD,eAAO,MAAM,kBAAkB,GAAI,6CAKhC;IACD,MAAM,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,CAAA;IAC1B,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAA;IACvD,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAG,CAAC,WAAW,GAAG,MAAM,CAAC,EAiFzB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,2DAK/B;IACD,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAA;IACvD,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAG,WAmSH,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,8DAMhC;IACD,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAA;IACvD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAG,WAAW,EAiCd,CAAA"}
@@ -15,7 +15,8 @@ const serverOnlyFieldProperties = [
15
15
  'jsonSchema',
16
16
  'dbName',
17
17
  'enumName',
18
- 'graphQL'
18
+ 'graphQL',
19
+ 'slugify'
19
20
  ];
20
21
  const serverOnlyFieldAdminProperties = [
21
22
  'condition',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/client.ts"],"sourcesContent":["// @ts-strict-ignore\n/* eslint-disable perfectionist/sort-switch-case */\n// Keep perfectionist/sort-switch-case disabled - it incorrectly messes up the ordering of the switch cases, causing it to break\nimport type { ClientTranslationKeys, I18nClient, TFunction } from '@payloadcms/translations'\n\nimport type { ImportMap } from '../../bin/generateImportMap/index.js'\nimport type { LabelFunction } from '../../config/types.js'\nimport type {\n AdminClient,\n ArrayFieldClient,\n Block,\n BlockJSX,\n BlocksFieldClient,\n ClientBlock,\n ClientField,\n DateFieldClient,\n Field,\n FieldBase,\n JoinFieldClient,\n LabelsClient,\n RadioFieldClient,\n RowFieldClient,\n SelectFieldClient,\n TabsFieldClient,\n} from '../../fields/config/types.js'\nimport type { Payload } from '../../types/index.js'\n\nimport { getFromImportMap } from '../../bin/generateImportMap/utilities/getFromImportMap.js'\nimport { MissingEditorProp } from '../../errors/MissingEditorProp.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { flattenTopLevelFields } from '../../utilities/flattenTopLevelFields.js'\n\n// Should not be used - ClientField should be used instead. This is why we don't export ClientField, we don't want people\n// to accidentally use it instead of ClientField and get confused\n\nexport { ClientField }\n\nexport type ServerOnlyFieldProperties =\n | 'dbName' // can be a function\n | 'editor' // This is a `richText` only property\n | 'enumName' // can be a function\n | 'filterOptions' // This is a `relationship`, `upload`, and `select` only property\n | 'graphQL'\n | 'jsonSchema'\n | 'label'\n | 'validate'\n | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>\n\nexport type ServerOnlyFieldAdminProperties = keyof Pick<\n FieldBase['admin'],\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n 'components' | 'condition'\n>\n\nconst serverOnlyFieldProperties: Partial<ServerOnlyFieldProperties>[] = [\n 'hooks',\n 'access',\n 'validate',\n 'defaultValue',\n 'filterOptions', // This is a `relationship`, `upload`, and `select` only property\n 'editor', // This is a `richText` only property\n 'custom',\n 'jsonSchema',\n 'dbName', // can be a function\n 'enumName', // can be a function\n 'graphQL', // client does not need graphQL\n // the following props are handled separately (see below):\n // `label`\n // `fields`\n // `blocks`\n // `tabs`\n // `admin`\n]\n\nconst serverOnlyFieldAdminProperties: Partial<ServerOnlyFieldAdminProperties>[] = [\n 'condition',\n 'components',\n]\n\ntype FieldWithDescription = {\n admin: AdminClient\n} & ClientField\n\nexport const createClientBlocks = ({\n blocks,\n defaultIDType,\n i18n,\n importMap,\n}: {\n blocks: (Block | string)[]\n defaultIDType: Payload['config']['db']['defaultIDType']\n i18n: I18nClient\n importMap: ImportMap\n}): (ClientBlock | string)[] => {\n const clientBlocks: (ClientBlock | string)[] = []\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]!\n\n if (typeof block === 'string') {\n // Do not process blocks that are just strings - they are processed once in the client config\n clientBlocks.push(block)\n continue\n }\n\n const clientBlock: ClientBlock = {\n slug: block.slug,\n fields: [],\n }\n if (block.imageAltText) {\n clientBlock.imageAltText = block.imageAltText\n }\n if (block.imageURL) {\n clientBlock.imageURL = block.imageURL\n }\n\n if (block.admin?.custom || block.admin?.group || block.admin?.images) {\n clientBlock.admin = {}\n if (block.admin.custom) {\n clientBlock.admin.custom = block.admin.custom\n }\n if (block.admin.group) {\n clientBlock.admin.group = block.admin.group\n }\n if (block.admin.images) {\n clientBlock.admin.images = block.admin.images\n }\n }\n\n if (block?.admin?.jsx) {\n const jsxResolved = getFromImportMap<BlockJSX>({\n importMap,\n PayloadComponent: block.admin.jsx,\n schemaPath: '',\n })\n clientBlock.jsx = jsxResolved\n }\n\n if (block?.admin?.disableBlockName) {\n // Check for existing admin object, this way we don't have to spread it in\n if (clientBlock.admin) {\n clientBlock.admin.disableBlockName = block.admin.disableBlockName\n } else {\n clientBlock.admin = { disableBlockName: block.admin.disableBlockName }\n }\n }\n\n if (block.labels) {\n clientBlock.labels = {} as unknown as LabelsClient\n\n if (block.labels.singular) {\n if (typeof block.labels.singular === 'function') {\n clientBlock.labels.singular = block.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n clientBlock.labels.singular = block.labels.singular\n }\n if (typeof block.labels.plural === 'function') {\n clientBlock.labels.plural = block.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n clientBlock.labels.plural = block.labels.plural\n }\n }\n }\n\n clientBlock.fields = createClientFields({\n defaultIDType,\n fields: block.fields,\n i18n,\n importMap,\n })\n\n clientBlocks.push(clientBlock)\n }\n\n return clientBlocks\n}\n\nexport const createClientField = ({\n defaultIDType,\n field: incomingField,\n i18n,\n importMap,\n}: {\n defaultIDType: Payload['config']['db']['defaultIDType']\n field: Field\n i18n: I18nClient\n importMap: ImportMap\n}): ClientField => {\n const clientField: ClientField = {} as ClientField\n\n for (const key in incomingField) {\n if (serverOnlyFieldProperties.includes(key as any)) {\n continue\n }\n\n switch (key) {\n case 'admin':\n if (!incomingField.admin) {\n break\n }\n\n clientField.admin = {} as AdminClient\n\n for (const adminKey in incomingField.admin) {\n if (serverOnlyFieldAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if ('description' in incomingField.admin) {\n if (typeof incomingField.admin?.description !== 'function') {\n ;(clientField as FieldWithDescription).admin.description =\n incomingField.admin.description\n }\n }\n\n break\n\n default:\n ;(clientField.admin as any)[adminKey] =\n incomingField.admin[adminKey as keyof typeof incomingField.admin]\n }\n }\n\n break\n\n case 'blocks':\n case 'fields':\n case 'tabs':\n // Skip - we handle sub-fields in the switch below\n break\n\n case 'options':\n // Skip - we handle options in the radio/select switch below to avoid mutating the global config\n break\n\n case 'label':\n //@ts-expect-error - would need to type narrow\n if (typeof incomingField.label === 'function') {\n //@ts-expect-error - would need to type narrow\n clientField.label = incomingField.label({ i18n, t: i18n.t })\n } else {\n //@ts-expect-error - would need to type narrow\n clientField.label = incomingField.label\n }\n\n break\n\n default:\n ;(clientField as any)[key] = incomingField[key as keyof Field]\n }\n }\n\n switch (incomingField.type) {\n case 'array': {\n if (incomingField.labels) {\n const field = clientField as unknown as ArrayFieldClient\n\n field.labels = {} as unknown as LabelsClient\n\n if (incomingField.labels.singular) {\n if (typeof incomingField.labels.singular === 'function') {\n field.labels.singular = incomingField.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.singular = incomingField.labels.singular\n }\n if (typeof incomingField.labels.plural === 'function') {\n field.labels.plural = incomingField.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.plural = incomingField.labels.plural\n }\n }\n }\n }\n // falls through\n case 'collapsible':\n case 'group':\n case 'row': {\n const field = clientField as unknown as RowFieldClient\n\n if (!field.fields) {\n field.fields = []\n }\n\n field.fields = createClientFields({\n defaultIDType,\n disableAddingID: incomingField.type !== 'array',\n fields: incomingField.fields,\n i18n,\n importMap,\n })\n\n break\n }\n\n case 'blocks': {\n const field = clientField as unknown as BlocksFieldClient\n\n if (incomingField.labels) {\n field.labels = {} as unknown as LabelsClient\n\n if (incomingField.labels.singular) {\n if (typeof incomingField.labels.singular === 'function') {\n field.labels.singular = incomingField.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.singular = incomingField.labels.singular\n }\n if (typeof incomingField.labels.plural === 'function') {\n field.labels.plural = incomingField.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.plural = incomingField.labels.plural\n }\n }\n }\n\n if (incomingField.blocks?.length) {\n field.blocks = createClientBlocks({\n blocks: incomingField.blocks,\n defaultIDType,\n i18n,\n importMap,\n })\n }\n\n break\n }\n\n case 'date': {\n // Strip the `override` function from timezone config as it cannot be serialized\n if (\n incomingField.timezone &&\n typeof incomingField.timezone === 'object' &&\n 'override' in incomingField.timezone\n ) {\n const field = clientField as DateFieldClient\n const { override: _, ...timezoneConfigWithoutOverride } = incomingField.timezone\n field.timezone = timezoneConfigWithoutOverride\n }\n\n break\n }\n\n case 'join': {\n const field = clientField as JoinFieldClient\n\n field.targetField = {\n relationTo: field.targetField?.relationTo,\n }\n\n break\n }\n\n case 'radio':\n // falls through\n case 'select': {\n const field = clientField as RadioFieldClient | SelectFieldClient\n\n if (incomingField.options?.length) {\n field.options = [] // Create new array to avoid mutating global config\n\n for (let i = 0; i < incomingField.options.length; i++) {\n const option = incomingField.options[i]\n\n if (typeof option === 'object' && typeof option.label === 'function') {\n field.options[i] = {\n label: option.label({ i18n, t: i18n.t as TFunction }),\n value: option.value,\n }\n } else if (typeof option === 'object') {\n field.options[i] = {\n label: option.label,\n value: option.value,\n }\n } else if (typeof option === 'string') {\n field.options[i] = option\n }\n }\n }\n\n break\n }\n\n case 'richText': {\n if (!incomingField?.editor) {\n throw new MissingEditorProp(incomingField) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof incomingField?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n break\n }\n\n case 'tabs': {\n const field = clientField as unknown as TabsFieldClient\n\n if (incomingField.tabs?.length) {\n field.tabs = []\n\n for (let i = 0; i < incomingField.tabs.length; i++) {\n const tab = incomingField.tabs[i]\n const clientTab = {} as unknown as TabsFieldClient['tabs'][0]\n\n for (const key in tab) {\n if (serverOnlyFieldProperties.includes(key as any)) {\n continue\n }\n\n const tabProp = tab[key as keyof typeof tab]\n\n if (key === 'fields') {\n clientTab.fields = createClientFields({\n defaultIDType,\n disableAddingID: true,\n fields: tab.fields,\n i18n,\n importMap,\n })\n } else if (key === 'label' && typeof tabProp === 'function') {\n const label = tabProp as LabelFunction\n\n clientTab.label = label({\n i18n,\n t: i18n.t,\n })\n } else if (key === 'description' && typeof tabProp === 'function') {\n const description = tabProp as LabelFunction\n\n clientTab.description = description({\n i18n,\n t: i18n.t,\n })\n } else if (key === 'admin') {\n clientTab.admin = {} as AdminClient\n\n for (const adminKey in tab.admin) {\n if (serverOnlyFieldAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if ('description' in tab.admin) {\n if (typeof tab.admin?.description === 'function') {\n clientTab.admin.description = tab.admin.description({\n i18n,\n t: i18n.t,\n })\n } else {\n clientTab.admin.description = tab.admin.description\n }\n }\n\n break\n\n default:\n ;(clientTab.admin as any)[adminKey] =\n tab.admin[adminKey as keyof typeof tab.admin]\n }\n }\n } else {\n ;(clientTab as any)[key] = tabProp\n }\n }\n field.tabs[i] = clientTab\n }\n }\n\n break\n }\n\n default:\n break\n }\n\n return clientField\n}\n\nexport const createClientFields = ({\n defaultIDType,\n disableAddingID,\n fields,\n i18n,\n importMap,\n}: {\n defaultIDType: Payload['config']['db']['defaultIDType']\n disableAddingID?: boolean\n fields: Field[]\n i18n: I18nClient\n importMap: ImportMap\n}): ClientField[] => {\n const clientFields: ClientField[] = []\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n\n const clientField = createClientField({\n defaultIDType,\n field,\n i18n,\n importMap,\n })\n\n clientFields.push(clientField)\n }\n\n const hasID = flattenTopLevelFields(fields).some((f) => fieldAffectsData(f) && f.name === 'id')\n\n if (!disableAddingID && !hasID) {\n clientFields.push({\n name: 'id',\n type: defaultIDType,\n admin: {\n description: 'The unique identifier for this document',\n disabled: { bulkEdit: true },\n hidden: true,\n },\n hidden: true,\n label: 'ID',\n } as ClientField)\n }\n\n return clientFields\n}\n"],"names":["getFromImportMap","MissingEditorProp","fieldAffectsData","flattenTopLevelFields","serverOnlyFieldProperties","serverOnlyFieldAdminProperties","createClientBlocks","blocks","defaultIDType","i18n","importMap","clientBlocks","i","length","block","push","clientBlock","slug","fields","imageAltText","imageURL","admin","custom","group","images","jsx","jsxResolved","PayloadComponent","schemaPath","disableBlockName","labels","singular","t","plural","createClientFields","createClientField","field","incomingField","clientField","key","includes","adminKey","description","label","type","disableAddingID","timezone","override","_","timezoneConfigWithoutOverride","targetField","relationTo","options","option","value","editor","Error","tabs","tab","clientTab","tabProp","clientFields","hasID","some","f","name","disabled","bulkEdit","hidden"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/fields/config/client.ts"],"sourcesContent":["// @ts-strict-ignore\n/* eslint-disable perfectionist/sort-switch-case */\n// Keep perfectionist/sort-switch-case disabled - it incorrectly messes up the ordering of the switch cases, causing it to break\nimport type { ClientTranslationKeys, I18nClient, TFunction } from '@payloadcms/translations'\n\nimport type { ImportMap } from '../../bin/generateImportMap/index.js'\nimport type { LabelFunction } from '../../config/types.js'\nimport type {\n AdminClient,\n ArrayFieldClient,\n Block,\n BlockJSX,\n BlocksFieldClient,\n ClientBlock,\n ClientField,\n DateFieldClient,\n Field,\n FieldBase,\n JoinFieldClient,\n LabelsClient,\n RadioFieldClient,\n RowFieldClient,\n SelectFieldClient,\n TabsFieldClient,\n} from '../../fields/config/types.js'\nimport type { Payload } from '../../types/index.js'\n\nimport { getFromImportMap } from '../../bin/generateImportMap/utilities/getFromImportMap.js'\nimport { MissingEditorProp } from '../../errors/MissingEditorProp.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { flattenTopLevelFields } from '../../utilities/flattenTopLevelFields.js'\n\n// Should not be used - ClientField should be used instead. This is why we don't export ClientField, we don't want people\n// to accidentally use it instead of ClientField and get confused\n\nexport { ClientField }\n\nexport type ServerOnlyFieldProperties =\n | 'dbName' // can be a function\n | 'editor' // This is a `richText` only property\n | 'enumName' // can be a function\n | 'filterOptions' // This is a `relationship`, `upload`, and `select` only property\n | 'graphQL'\n | 'jsonSchema'\n | 'label'\n | 'slugify' // This is a `slug` only property — a function, cannot cross the RSC boundary\n | 'validate'\n | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>\n\nexport type ServerOnlyFieldAdminProperties = keyof Pick<\n FieldBase['admin'],\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n 'components' | 'condition'\n>\n\nconst serverOnlyFieldProperties: Partial<ServerOnlyFieldProperties>[] = [\n 'hooks',\n 'access',\n 'validate',\n 'defaultValue',\n 'filterOptions', // This is a `relationship`, `upload`, and `select` only property\n 'editor', // This is a `richText` only property\n 'custom',\n 'jsonSchema',\n 'dbName', // can be a function\n 'enumName', // can be a function\n 'graphQL', // client does not need graphQL\n 'slugify', // `slug` field — a function, cannot cross the RSC boundary (server resolves it via `custom.slugify`)\n // the following props are handled separately (see below):\n // `label`\n // `fields`\n // `blocks`\n // `tabs`\n // `admin`\n]\n\nconst serverOnlyFieldAdminProperties: Partial<ServerOnlyFieldAdminProperties>[] = [\n 'condition',\n 'components',\n]\n\ntype FieldWithDescription = {\n admin: AdminClient\n} & ClientField\n\nexport const createClientBlocks = ({\n blocks,\n defaultIDType,\n i18n,\n importMap,\n}: {\n blocks: (Block | string)[]\n defaultIDType: Payload['config']['db']['defaultIDType']\n i18n: I18nClient\n importMap: ImportMap\n}): (ClientBlock | string)[] => {\n const clientBlocks: (ClientBlock | string)[] = []\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]!\n\n if (typeof block === 'string') {\n // Do not process blocks that are just strings - they are processed once in the client config\n clientBlocks.push(block)\n continue\n }\n\n const clientBlock: ClientBlock = {\n slug: block.slug,\n fields: [],\n }\n if (block.imageAltText) {\n clientBlock.imageAltText = block.imageAltText\n }\n if (block.imageURL) {\n clientBlock.imageURL = block.imageURL\n }\n\n if (block.admin?.custom || block.admin?.group || block.admin?.images) {\n clientBlock.admin = {}\n if (block.admin.custom) {\n clientBlock.admin.custom = block.admin.custom\n }\n if (block.admin.group) {\n clientBlock.admin.group = block.admin.group\n }\n if (block.admin.images) {\n clientBlock.admin.images = block.admin.images\n }\n }\n\n if (block?.admin?.jsx) {\n const jsxResolved = getFromImportMap<BlockJSX>({\n importMap,\n PayloadComponent: block.admin.jsx,\n schemaPath: '',\n })\n clientBlock.jsx = jsxResolved\n }\n\n if (block?.admin?.disableBlockName) {\n // Check for existing admin object, this way we don't have to spread it in\n if (clientBlock.admin) {\n clientBlock.admin.disableBlockName = block.admin.disableBlockName\n } else {\n clientBlock.admin = { disableBlockName: block.admin.disableBlockName }\n }\n }\n\n if (block.labels) {\n clientBlock.labels = {} as unknown as LabelsClient\n\n if (block.labels.singular) {\n if (typeof block.labels.singular === 'function') {\n clientBlock.labels.singular = block.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n clientBlock.labels.singular = block.labels.singular\n }\n if (typeof block.labels.plural === 'function') {\n clientBlock.labels.plural = block.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n clientBlock.labels.plural = block.labels.plural\n }\n }\n }\n\n clientBlock.fields = createClientFields({\n defaultIDType,\n fields: block.fields,\n i18n,\n importMap,\n })\n\n clientBlocks.push(clientBlock)\n }\n\n return clientBlocks\n}\n\nexport const createClientField = ({\n defaultIDType,\n field: incomingField,\n i18n,\n importMap,\n}: {\n defaultIDType: Payload['config']['db']['defaultIDType']\n field: Field\n i18n: I18nClient\n importMap: ImportMap\n}): ClientField => {\n const clientField: ClientField = {} as ClientField\n\n for (const key in incomingField) {\n if (serverOnlyFieldProperties.includes(key as any)) {\n continue\n }\n\n switch (key) {\n case 'admin':\n if (!incomingField.admin) {\n break\n }\n\n clientField.admin = {} as AdminClient\n\n for (const adminKey in incomingField.admin) {\n if (serverOnlyFieldAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if ('description' in incomingField.admin) {\n if (typeof incomingField.admin?.description !== 'function') {\n ;(clientField as FieldWithDescription).admin.description =\n incomingField.admin.description\n }\n }\n\n break\n\n default:\n ;(clientField.admin as any)[adminKey] =\n incomingField.admin[adminKey as keyof typeof incomingField.admin]\n }\n }\n\n break\n\n case 'blocks':\n case 'fields':\n case 'tabs':\n // Skip - we handle sub-fields in the switch below\n break\n\n case 'options':\n // Skip - we handle options in the radio/select switch below to avoid mutating the global config\n break\n\n case 'label':\n //@ts-expect-error - would need to type narrow\n if (typeof incomingField.label === 'function') {\n //@ts-expect-error - would need to type narrow\n clientField.label = incomingField.label({ i18n, t: i18n.t })\n } else {\n //@ts-expect-error - would need to type narrow\n clientField.label = incomingField.label\n }\n\n break\n\n default:\n ;(clientField as any)[key] = incomingField[key as keyof Field]\n }\n }\n\n switch (incomingField.type) {\n case 'array': {\n if (incomingField.labels) {\n const field = clientField as unknown as ArrayFieldClient\n\n field.labels = {} as unknown as LabelsClient\n\n if (incomingField.labels.singular) {\n if (typeof incomingField.labels.singular === 'function') {\n field.labels.singular = incomingField.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.singular = incomingField.labels.singular\n }\n if (typeof incomingField.labels.plural === 'function') {\n field.labels.plural = incomingField.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.plural = incomingField.labels.plural\n }\n }\n }\n }\n // falls through\n case 'collapsible':\n case 'group':\n case 'row': {\n const field = clientField as unknown as RowFieldClient\n\n if (!field.fields) {\n field.fields = []\n }\n\n field.fields = createClientFields({\n defaultIDType,\n disableAddingID: incomingField.type !== 'array',\n fields: incomingField.fields,\n i18n,\n importMap,\n })\n\n break\n }\n\n case 'blocks': {\n const field = clientField as unknown as BlocksFieldClient\n\n if (incomingField.labels) {\n field.labels = {} as unknown as LabelsClient\n\n if (incomingField.labels.singular) {\n if (typeof incomingField.labels.singular === 'function') {\n field.labels.singular = incomingField.labels.singular({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.singular = incomingField.labels.singular\n }\n if (typeof incomingField.labels.plural === 'function') {\n field.labels.plural = incomingField.labels.plural({ i18n, t: i18n.t as TFunction })\n } else {\n field.labels.plural = incomingField.labels.plural\n }\n }\n }\n\n if (incomingField.blocks?.length) {\n field.blocks = createClientBlocks({\n blocks: incomingField.blocks,\n defaultIDType,\n i18n,\n importMap,\n })\n }\n\n break\n }\n\n case 'date': {\n // Strip the `override` function from timezone config as it cannot be serialized\n if (\n incomingField.timezone &&\n typeof incomingField.timezone === 'object' &&\n 'override' in incomingField.timezone\n ) {\n const field = clientField as DateFieldClient\n const { override: _, ...timezoneConfigWithoutOverride } = incomingField.timezone\n field.timezone = timezoneConfigWithoutOverride\n }\n\n break\n }\n\n case 'join': {\n const field = clientField as JoinFieldClient\n\n field.targetField = {\n relationTo: field.targetField?.relationTo,\n }\n\n break\n }\n\n case 'radio':\n // falls through\n case 'select': {\n const field = clientField as RadioFieldClient | SelectFieldClient\n\n if (incomingField.options?.length) {\n field.options = [] // Create new array to avoid mutating global config\n\n for (let i = 0; i < incomingField.options.length; i++) {\n const option = incomingField.options[i]\n\n if (typeof option === 'object' && typeof option.label === 'function') {\n field.options[i] = {\n label: option.label({ i18n, t: i18n.t as TFunction }),\n value: option.value,\n }\n } else if (typeof option === 'object') {\n field.options[i] = {\n label: option.label,\n value: option.value,\n }\n } else if (typeof option === 'string') {\n field.options[i] = option\n }\n }\n }\n\n break\n }\n\n case 'richText': {\n if (!incomingField?.editor) {\n throw new MissingEditorProp(incomingField) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof incomingField?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n break\n }\n\n case 'tabs': {\n const field = clientField as unknown as TabsFieldClient\n\n if (incomingField.tabs?.length) {\n field.tabs = []\n\n for (let i = 0; i < incomingField.tabs.length; i++) {\n const tab = incomingField.tabs[i]\n const clientTab = {} as unknown as TabsFieldClient['tabs'][0]\n\n for (const key in tab) {\n if (serverOnlyFieldProperties.includes(key as any)) {\n continue\n }\n\n const tabProp = tab[key as keyof typeof tab]\n\n if (key === 'fields') {\n clientTab.fields = createClientFields({\n defaultIDType,\n disableAddingID: true,\n fields: tab.fields,\n i18n,\n importMap,\n })\n } else if (key === 'label' && typeof tabProp === 'function') {\n const label = tabProp as LabelFunction\n\n clientTab.label = label({\n i18n,\n t: i18n.t,\n })\n } else if (key === 'description' && typeof tabProp === 'function') {\n const description = tabProp as LabelFunction\n\n clientTab.description = description({\n i18n,\n t: i18n.t,\n })\n } else if (key === 'admin') {\n clientTab.admin = {} as AdminClient\n\n for (const adminKey in tab.admin) {\n if (serverOnlyFieldAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if ('description' in tab.admin) {\n if (typeof tab.admin?.description === 'function') {\n clientTab.admin.description = tab.admin.description({\n i18n,\n t: i18n.t,\n })\n } else {\n clientTab.admin.description = tab.admin.description\n }\n }\n\n break\n\n default:\n ;(clientTab.admin as any)[adminKey] =\n tab.admin[adminKey as keyof typeof tab.admin]\n }\n }\n } else {\n ;(clientTab as any)[key] = tabProp\n }\n }\n field.tabs[i] = clientTab\n }\n }\n\n break\n }\n\n default:\n break\n }\n\n return clientField\n}\n\nexport const createClientFields = ({\n defaultIDType,\n disableAddingID,\n fields,\n i18n,\n importMap,\n}: {\n defaultIDType: Payload['config']['db']['defaultIDType']\n disableAddingID?: boolean\n fields: Field[]\n i18n: I18nClient\n importMap: ImportMap\n}): ClientField[] => {\n const clientFields: ClientField[] = []\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n\n const clientField = createClientField({\n defaultIDType,\n field,\n i18n,\n importMap,\n })\n\n clientFields.push(clientField)\n }\n\n const hasID = flattenTopLevelFields(fields).some((f) => fieldAffectsData(f) && f.name === 'id')\n\n if (!disableAddingID && !hasID) {\n clientFields.push({\n name: 'id',\n type: defaultIDType,\n admin: {\n description: 'The unique identifier for this document',\n disabled: { bulkEdit: true },\n hidden: true,\n },\n hidden: true,\n label: 'ID',\n } as ClientField)\n }\n\n return clientFields\n}\n"],"names":["getFromImportMap","MissingEditorProp","fieldAffectsData","flattenTopLevelFields","serverOnlyFieldProperties","serverOnlyFieldAdminProperties","createClientBlocks","blocks","defaultIDType","i18n","importMap","clientBlocks","i","length","block","push","clientBlock","slug","fields","imageAltText","imageURL","admin","custom","group","images","jsx","jsxResolved","PayloadComponent","schemaPath","disableBlockName","labels","singular","t","plural","createClientFields","createClientField","field","incomingField","clientField","key","includes","adminKey","description","label","type","disableAddingID","timezone","override","_","timezoneConfigWithoutOverride","targetField","relationTo","options","option","value","editor","Error","tabs","tab","clientTab","tabProp","clientFields","hasID","some","f","name","disabled","bulkEdit","hidden"],"mappings":"AAAA,oBAAoB;AACpB,iDAAiD,GACjD,gIAAgI;AAyBhI,SAASA,gBAAgB,QAAQ,4DAA2D;AAC5F,SAASC,iBAAiB,QAAQ,oCAAmC;AACrE,SAASC,gBAAgB,QAAQ,+BAA8B;AAC/D,SAASC,qBAAqB,QAAQ,2CAA0C;AAyBhF,MAAMC,4BAAkE;IACtE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CAOD;AAED,MAAMC,iCAA4E;IAChF;IACA;CACD;AAMD,OAAO,MAAMC,qBAAqB,CAAC,EACjCC,MAAM,EACNC,aAAa,EACbC,IAAI,EACJC,SAAS,EAMV;IACC,MAAMC,eAAyC,EAAE;IACjD,IAAK,IAAIC,IAAI,GAAGA,IAAIL,OAAOM,MAAM,EAAED,IAAK;QACtC,MAAME,QAAQP,MAAM,CAACK,EAAE;QAEvB,IAAI,OAAOE,UAAU,UAAU;YAC7B,6FAA6F;YAC7FH,aAAaI,IAAI,CAACD;YAClB;QACF;QAEA,MAAME,cAA2B;YAC/BC,MAAMH,MAAMG,IAAI;YAChBC,QAAQ,EAAE;QACZ;QACA,IAAIJ,MAAMK,YAAY,EAAE;YACtBH,YAAYG,YAAY,GAAGL,MAAMK,YAAY;QAC/C;QACA,IAAIL,MAAMM,QAAQ,EAAE;YAClBJ,YAAYI,QAAQ,GAAGN,MAAMM,QAAQ;QACvC;QAEA,IAAIN,MAAMO,KAAK,EAAEC,UAAUR,MAAMO,KAAK,EAAEE,SAAST,MAAMO,KAAK,EAAEG,QAAQ;YACpER,YAAYK,KAAK,GAAG,CAAC;YACrB,IAAIP,MAAMO,KAAK,CAACC,MAAM,EAAE;gBACtBN,YAAYK,KAAK,CAACC,MAAM,GAAGR,MAAMO,KAAK,CAACC,MAAM;YAC/C;YACA,IAAIR,MAAMO,KAAK,CAACE,KAAK,EAAE;gBACrBP,YAAYK,KAAK,CAACE,KAAK,GAAGT,MAAMO,KAAK,CAACE,KAAK;YAC7C;YACA,IAAIT,MAAMO,KAAK,CAACG,MAAM,EAAE;gBACtBR,YAAYK,KAAK,CAACG,MAAM,GAAGV,MAAMO,KAAK,CAACG,MAAM;YAC/C;QACF;QAEA,IAAIV,OAAOO,OAAOI,KAAK;YACrB,MAAMC,cAAc1B,iBAA2B;gBAC7CU;gBACAiB,kBAAkBb,MAAMO,KAAK,CAACI,GAAG;gBACjCG,YAAY;YACd;YACAZ,YAAYS,GAAG,GAAGC;QACpB;QAEA,IAAIZ,OAAOO,OAAOQ,kBAAkB;YAClC,0EAA0E;YAC1E,IAAIb,YAAYK,KAAK,EAAE;gBACrBL,YAAYK,KAAK,CAACQ,gBAAgB,GAAGf,MAAMO,KAAK,CAACQ,gBAAgB;YACnE,OAAO;gBACLb,YAAYK,KAAK,GAAG;oBAAEQ,kBAAkBf,MAAMO,KAAK,CAACQ,gBAAgB;gBAAC;YACvE;QACF;QAEA,IAAIf,MAAMgB,MAAM,EAAE;YAChBd,YAAYc,MAAM,GAAG,CAAC;YAEtB,IAAIhB,MAAMgB,MAAM,CAACC,QAAQ,EAAE;gBACzB,IAAI,OAAOjB,MAAMgB,MAAM,CAACC,QAAQ,KAAK,YAAY;oBAC/Cf,YAAYc,MAAM,CAACC,QAAQ,GAAGjB,MAAMgB,MAAM,CAACC,QAAQ,CAAC;wBAAEtB;wBAAMuB,GAAGvB,KAAKuB,CAAC;oBAAc;gBACrF,OAAO;oBACLhB,YAAYc,MAAM,CAACC,QAAQ,GAAGjB,MAAMgB,MAAM,CAACC,QAAQ;gBACrD;gBACA,IAAI,OAAOjB,MAAMgB,MAAM,CAACG,MAAM,KAAK,YAAY;oBAC7CjB,YAAYc,MAAM,CAACG,MAAM,GAAGnB,MAAMgB,MAAM,CAACG,MAAM,CAAC;wBAAExB;wBAAMuB,GAAGvB,KAAKuB,CAAC;oBAAc;gBACjF,OAAO;oBACLhB,YAAYc,MAAM,CAACG,MAAM,GAAGnB,MAAMgB,MAAM,CAACG,MAAM;gBACjD;YACF;QACF;QAEAjB,YAAYE,MAAM,GAAGgB,mBAAmB;YACtC1B;YACAU,QAAQJ,MAAMI,MAAM;YACpBT;YACAC;QACF;QAEAC,aAAaI,IAAI,CAACC;IACpB;IAEA,OAAOL;AACT,EAAC;AAED,OAAO,MAAMwB,oBAAoB,CAAC,EAChC3B,aAAa,EACb4B,OAAOC,aAAa,EACpB5B,IAAI,EACJC,SAAS,EAMV;IACC,MAAM4B,cAA2B,CAAC;IAElC,IAAK,MAAMC,OAAOF,cAAe;QAC/B,IAAIjC,0BAA0BoC,QAAQ,CAACD,MAAa;YAClD;QACF;QAEA,OAAQA;YACN,KAAK;gBACH,IAAI,CAACF,cAAchB,KAAK,EAAE;oBACxB;gBACF;gBAEAiB,YAAYjB,KAAK,GAAG,CAAC;gBAErB,IAAK,MAAMoB,YAAYJ,cAAchB,KAAK,CAAE;oBAC1C,IAAIhB,+BAA+BmC,QAAQ,CAACC,WAAkB;wBAC5D;oBACF;oBAEA,OAAQA;wBACN,KAAK;4BACH,IAAI,iBAAiBJ,cAAchB,KAAK,EAAE;gCACxC,IAAI,OAAOgB,cAAchB,KAAK,EAAEqB,gBAAgB,YAAY;;oCACxDJ,YAAqCjB,KAAK,CAACqB,WAAW,GACtDL,cAAchB,KAAK,CAACqB,WAAW;gCACnC;4BACF;4BAEA;wBAEF;;4BACIJ,YAAYjB,KAAK,AAAQ,CAACoB,SAAS,GACnCJ,cAAchB,KAAK,CAACoB,SAA6C;oBACvE;gBACF;gBAEA;YAEF,KAAK;YACL,KAAK;YACL,KAAK;gBAEH;YAEF,KAAK;gBAEH;YAEF,KAAK;gBACH,8CAA8C;gBAC9C,IAAI,OAAOJ,cAAcM,KAAK,KAAK,YAAY;oBAC7C,8CAA8C;oBAC9CL,YAAYK,KAAK,GAAGN,cAAcM,KAAK,CAAC;wBAAElC;wBAAMuB,GAAGvB,KAAKuB,CAAC;oBAAC;gBAC5D,OAAO;oBACL,8CAA8C;oBAC9CM,YAAYK,KAAK,GAAGN,cAAcM,KAAK;gBACzC;gBAEA;YAEF;;gBACIL,WAAmB,CAACC,IAAI,GAAGF,aAAa,CAACE,IAAmB;QAClE;IACF;IAEA,OAAQF,cAAcO,IAAI;QACxB,KAAK;YAAS;gBACZ,IAAIP,cAAcP,MAAM,EAAE;oBACxB,MAAMM,QAAQE;oBAEdF,MAAMN,MAAM,GAAG,CAAC;oBAEhB,IAAIO,cAAcP,MAAM,CAACC,QAAQ,EAAE;wBACjC,IAAI,OAAOM,cAAcP,MAAM,CAACC,QAAQ,KAAK,YAAY;4BACvDK,MAAMN,MAAM,CAACC,QAAQ,GAAGM,cAAcP,MAAM,CAACC,QAAQ,CAAC;gCAAEtB;gCAAMuB,GAAGvB,KAAKuB,CAAC;4BAAc;wBACvF,OAAO;4BACLI,MAAMN,MAAM,CAACC,QAAQ,GAAGM,cAAcP,MAAM,CAACC,QAAQ;wBACvD;wBACA,IAAI,OAAOM,cAAcP,MAAM,CAACG,MAAM,KAAK,YAAY;4BACrDG,MAAMN,MAAM,CAACG,MAAM,GAAGI,cAAcP,MAAM,CAACG,MAAM,CAAC;gCAAExB;gCAAMuB,GAAGvB,KAAKuB,CAAC;4BAAc;wBACnF,OAAO;4BACLI,MAAMN,MAAM,CAACG,MAAM,GAAGI,cAAcP,MAAM,CAACG,MAAM;wBACnD;oBACF;gBACF;YACF;QACA,gBAAgB;QAChB,KAAK;QACL,KAAK;QACL,KAAK;YAAO;gBACV,MAAMG,QAAQE;gBAEd,IAAI,CAACF,MAAMlB,MAAM,EAAE;oBACjBkB,MAAMlB,MAAM,GAAG,EAAE;gBACnB;gBAEAkB,MAAMlB,MAAM,GAAGgB,mBAAmB;oBAChC1B;oBACAqC,iBAAiBR,cAAcO,IAAI,KAAK;oBACxC1B,QAAQmB,cAAcnB,MAAM;oBAC5BT;oBACAC;gBACF;gBAEA;YACF;QAEA,KAAK;YAAU;gBACb,MAAM0B,QAAQE;gBAEd,IAAID,cAAcP,MAAM,EAAE;oBACxBM,MAAMN,MAAM,GAAG,CAAC;oBAEhB,IAAIO,cAAcP,MAAM,CAACC,QAAQ,EAAE;wBACjC,IAAI,OAAOM,cAAcP,MAAM,CAACC,QAAQ,KAAK,YAAY;4BACvDK,MAAMN,MAAM,CAACC,QAAQ,GAAGM,cAAcP,MAAM,CAACC,QAAQ,CAAC;gCAAEtB;gCAAMuB,GAAGvB,KAAKuB,CAAC;4BAAc;wBACvF,OAAO;4BACLI,MAAMN,MAAM,CAACC,QAAQ,GAAGM,cAAcP,MAAM,CAACC,QAAQ;wBACvD;wBACA,IAAI,OAAOM,cAAcP,MAAM,CAACG,MAAM,KAAK,YAAY;4BACrDG,MAAMN,MAAM,CAACG,MAAM,GAAGI,cAAcP,MAAM,CAACG,MAAM,CAAC;gCAAExB;gCAAMuB,GAAGvB,KAAKuB,CAAC;4BAAc;wBACnF,OAAO;4BACLI,MAAMN,MAAM,CAACG,MAAM,GAAGI,cAAcP,MAAM,CAACG,MAAM;wBACnD;oBACF;gBACF;gBAEA,IAAII,cAAc9B,MAAM,EAAEM,QAAQ;oBAChCuB,MAAM7B,MAAM,GAAGD,mBAAmB;wBAChCC,QAAQ8B,cAAc9B,MAAM;wBAC5BC;wBACAC;wBACAC;oBACF;gBACF;gBAEA;YACF;QAEA,KAAK;YAAQ;gBACX,gFAAgF;gBAChF,IACE2B,cAAcS,QAAQ,IACtB,OAAOT,cAAcS,QAAQ,KAAK,YAClC,cAAcT,cAAcS,QAAQ,EACpC;oBACA,MAAMV,QAAQE;oBACd,MAAM,EAAES,UAAUC,CAAC,EAAE,GAAGC,+BAA+B,GAAGZ,cAAcS,QAAQ;oBAChFV,MAAMU,QAAQ,GAAGG;gBACnB;gBAEA;YACF;QAEA,KAAK;YAAQ;gBACX,MAAMb,QAAQE;gBAEdF,MAAMc,WAAW,GAAG;oBAClBC,YAAYf,MAAMc,WAAW,EAAEC;gBACjC;gBAEA;YACF;QAEA,KAAK;QACL,gBAAgB;QAChB,KAAK;YAAU;gBACb,MAAMf,QAAQE;gBAEd,IAAID,cAAce,OAAO,EAAEvC,QAAQ;oBACjCuB,MAAMgB,OAAO,GAAG,EAAE,EAAC,mDAAmD;oBAEtE,IAAK,IAAIxC,IAAI,GAAGA,IAAIyB,cAAce,OAAO,CAACvC,MAAM,EAAED,IAAK;wBACrD,MAAMyC,SAAShB,cAAce,OAAO,CAACxC,EAAE;wBAEvC,IAAI,OAAOyC,WAAW,YAAY,OAAOA,OAAOV,KAAK,KAAK,YAAY;4BACpEP,MAAMgB,OAAO,CAACxC,EAAE,GAAG;gCACjB+B,OAAOU,OAAOV,KAAK,CAAC;oCAAElC;oCAAMuB,GAAGvB,KAAKuB,CAAC;gCAAc;gCACnDsB,OAAOD,OAAOC,KAAK;4BACrB;wBACF,OAAO,IAAI,OAAOD,WAAW,UAAU;4BACrCjB,MAAMgB,OAAO,CAACxC,EAAE,GAAG;gCACjB+B,OAAOU,OAAOV,KAAK;gCACnBW,OAAOD,OAAOC,KAAK;4BACrB;wBACF,OAAO,IAAI,OAAOD,WAAW,UAAU;4BACrCjB,MAAMgB,OAAO,CAACxC,EAAE,GAAGyC;wBACrB;oBACF;gBACF;gBAEA;YACF;QAEA,KAAK;YAAY;gBACf,IAAI,CAAChB,eAAekB,QAAQ;oBAC1B,MAAM,IAAItD,kBAAkBoC,eAAe,8HAA8H;;gBAC3K;gBAEA,IAAI,OAAOA,eAAekB,WAAW,YAAY;oBAC/C,MAAM,IAAIC,MAAM;gBAClB;gBAEA;YACF;QAEA,KAAK;YAAQ;gBACX,MAAMpB,QAAQE;gBAEd,IAAID,cAAcoB,IAAI,EAAE5C,QAAQ;oBAC9BuB,MAAMqB,IAAI,GAAG,EAAE;oBAEf,IAAK,IAAI7C,IAAI,GAAGA,IAAIyB,cAAcoB,IAAI,CAAC5C,MAAM,EAAED,IAAK;wBAClD,MAAM8C,MAAMrB,cAAcoB,IAAI,CAAC7C,EAAE;wBACjC,MAAM+C,YAAY,CAAC;wBAEnB,IAAK,MAAMpB,OAAOmB,IAAK;4BACrB,IAAItD,0BAA0BoC,QAAQ,CAACD,MAAa;gCAClD;4BACF;4BAEA,MAAMqB,UAAUF,GAAG,CAACnB,IAAwB;4BAE5C,IAAIA,QAAQ,UAAU;gCACpBoB,UAAUzC,MAAM,GAAGgB,mBAAmB;oCACpC1B;oCACAqC,iBAAiB;oCACjB3B,QAAQwC,IAAIxC,MAAM;oCAClBT;oCACAC;gCACF;4BACF,OAAO,IAAI6B,QAAQ,WAAW,OAAOqB,YAAY,YAAY;gCAC3D,MAAMjB,QAAQiB;gCAEdD,UAAUhB,KAAK,GAAGA,MAAM;oCACtBlC;oCACAuB,GAAGvB,KAAKuB,CAAC;gCACX;4BACF,OAAO,IAAIO,QAAQ,iBAAiB,OAAOqB,YAAY,YAAY;gCACjE,MAAMlB,cAAckB;gCAEpBD,UAAUjB,WAAW,GAAGA,YAAY;oCAClCjC;oCACAuB,GAAGvB,KAAKuB,CAAC;gCACX;4BACF,OAAO,IAAIO,QAAQ,SAAS;gCAC1BoB,UAAUtC,KAAK,GAAG,CAAC;gCAEnB,IAAK,MAAMoB,YAAYiB,IAAIrC,KAAK,CAAE;oCAChC,IAAIhB,+BAA+BmC,QAAQ,CAACC,WAAkB;wCAC5D;oCACF;oCAEA,OAAQA;wCACN,KAAK;4CACH,IAAI,iBAAiBiB,IAAIrC,KAAK,EAAE;gDAC9B,IAAI,OAAOqC,IAAIrC,KAAK,EAAEqB,gBAAgB,YAAY;oDAChDiB,UAAUtC,KAAK,CAACqB,WAAW,GAAGgB,IAAIrC,KAAK,CAACqB,WAAW,CAAC;wDAClDjC;wDACAuB,GAAGvB,KAAKuB,CAAC;oDACX;gDACF,OAAO;oDACL2B,UAAUtC,KAAK,CAACqB,WAAW,GAAGgB,IAAIrC,KAAK,CAACqB,WAAW;gDACrD;4CACF;4CAEA;wCAEF;;4CACIiB,UAAUtC,KAAK,AAAQ,CAACoB,SAAS,GACjCiB,IAAIrC,KAAK,CAACoB,SAAmC;oCACnD;gCACF;4BACF,OAAO;;gCACHkB,SAAiB,CAACpB,IAAI,GAAGqB;4BAC7B;wBACF;wBACAxB,MAAMqB,IAAI,CAAC7C,EAAE,GAAG+C;oBAClB;gBACF;gBAEA;YACF;QAEA;YACE;IACJ;IAEA,OAAOrB;AACT,EAAC;AAED,OAAO,MAAMJ,qBAAqB,CAAC,EACjC1B,aAAa,EACbqC,eAAe,EACf3B,MAAM,EACNT,IAAI,EACJC,SAAS,EAOV;IACC,MAAMmD,eAA8B,EAAE;IAEtC,IAAK,IAAIjD,IAAI,GAAGA,IAAIM,OAAOL,MAAM,EAAED,IAAK;QACtC,MAAMwB,QAAQlB,MAAM,CAACN,EAAE;QAEvB,MAAM0B,cAAcH,kBAAkB;YACpC3B;YACA4B;YACA3B;YACAC;QACF;QAEAmD,aAAa9C,IAAI,CAACuB;IACpB;IAEA,MAAMwB,QAAQ3D,sBAAsBe,QAAQ6C,IAAI,CAAC,CAACC,IAAM9D,iBAAiB8D,MAAMA,EAAEC,IAAI,KAAK;IAE1F,IAAI,CAACpB,mBAAmB,CAACiB,OAAO;QAC9BD,aAAa9C,IAAI,CAAC;YAChBkD,MAAM;YACNrB,MAAMpC;YACNa,OAAO;gBACLqB,aAAa;gBACbwB,UAAU;oBAAEC,UAAU;gBAAK;gBAC3BC,QAAQ;YACV;YACAA,QAAQ;YACRzB,OAAO;QACT;IACF;IAEA,OAAOkB;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACf,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AA8BvC,KAAK,kBAAkB,GAAG;IACxB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAA;IACzC;;;OAGG;IACH,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF;;;OAGG;IACH,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC,+BAA+B,EAAE,OAAO,CAAA;IACxC,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,EAAE,CAAA;CACzB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAU,4RAkBjC,iBAAiB,KAAG,OAAO,CAAC,mBAAmB,CAobjD,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,sRAiBlC,kBAAkB,KAAG,OAAO,CAAC,KAAK,EAAE,CAqCtC,CAAA"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACf,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AA+BvC,KAAK,kBAAkB,GAAG;IACxB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAA;IACzC;;;OAGG;IACH,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF;;;OAGG;IACH,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC,+BAA+B,EAAE,OAAO,CAAA;IACxC,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,EAAE,CAAA;CACzB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAU,4RAkBjC,iBAAiB,KAAG,OAAO,CAAC,mBAAmB,CA8djD,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,sRAiBlC,kBAAkB,KAAG,OAAO,CAAC,KAAK,EAAE,CAqCtC,CAAA"}
@@ -5,6 +5,7 @@ import { formatLabels, toWords } from '../../utilities/formatLabels.js';
5
5
  import { validateTimezones } from '../../utilities/validateTimezones.js';
6
6
  import { baseBlockFields } from '../baseFields/baseBlockFields.js';
7
7
  import { baseIDField } from '../baseFields/baseIDField.js';
8
+ import { generateSlug } from '../baseFields/slug/generateSlug.js';
8
9
  import { baseTimezoneField } from '../baseFields/timezone/baseField.js';
9
10
  import { defaultTimezones } from '../baseFields/timezone/defaultTimezones.js';
10
11
  import { getFieldPaths } from '../getFieldPaths.js';
@@ -111,6 +112,44 @@ import { fieldAffectsData as _fieldAffectsData, fieldIsLocalized, tabHasName } f
111
112
  };
112
113
  }
113
114
  }
115
+ // Slug field: apply defaults, attach generation hook, expose slugify to the server fn.
116
+ if (field.type === 'slug') {
117
+ const useAsSlug = field.useAsSlug;
118
+ if (!useAsSlug) {
119
+ throw new InvalidConfiguration(`The slug field "${field.name}" is missing the required "useAsSlug" property, which must name the field to generate the slug from.`);
120
+ }
121
+ if (typeof field.required === 'undefined') {
122
+ field.required = true;
123
+ }
124
+ if (typeof field.unique === 'undefined') {
125
+ field.unique = true;
126
+ }
127
+ if (typeof field.index === 'undefined') {
128
+ field.index = true;
129
+ }
130
+ field.admin = {
131
+ position: 'sidebar',
132
+ ...field.admin
133
+ };
134
+ // The slugifyHandler server function resolves the custom slugify by field path.
135
+ if (field.slugify) {
136
+ field.custom = {
137
+ ...field.custom,
138
+ slugify: field.slugify
139
+ };
140
+ }
141
+ if (!field.hooks) {
142
+ field.hooks = {};
143
+ }
144
+ field.hooks.beforeChange = [
145
+ generateSlug({
146
+ name: field.name,
147
+ slugify: field.slugify,
148
+ useAsSlug
149
+ }),
150
+ ...field.hooks.beforeChange || []
151
+ ];
152
+ }
114
153
  // Array ID field
115
154
  if (field.type === 'array' && field.fields) {
116
155
  const hasCustomID = field.fields.some((f)=>'name' in f && f.name === 'id');