payload 3.0.0-beta.127 → 3.0.0-beta.129

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 (294) hide show
  1. package/dist/admin/RichText.d.ts +8 -21
  2. package/dist/admin/RichText.d.ts.map +1 -1
  3. package/dist/admin/RichText.js.map +1 -1
  4. package/dist/admin/elements/Cell.d.ts +7 -9
  5. package/dist/admin/elements/Cell.d.ts.map +1 -1
  6. package/dist/admin/elements/Cell.js.map +1 -1
  7. package/dist/admin/fields/Array.d.ts +3 -3
  8. package/dist/admin/fields/Array.d.ts.map +1 -1
  9. package/dist/admin/fields/Array.js.map +1 -1
  10. package/dist/admin/fields/Blocks.d.ts +2 -1
  11. package/dist/admin/fields/Blocks.d.ts.map +1 -1
  12. package/dist/admin/fields/Blocks.js.map +1 -1
  13. package/dist/admin/fields/Checkbox.d.ts +1 -0
  14. package/dist/admin/fields/Checkbox.d.ts.map +1 -1
  15. package/dist/admin/fields/Checkbox.js.map +1 -1
  16. package/dist/admin/fields/Code.d.ts +2 -1
  17. package/dist/admin/fields/Code.d.ts.map +1 -1
  18. package/dist/admin/fields/Code.js.map +1 -1
  19. package/dist/admin/fields/Collapsible.d.ts +5 -2
  20. package/dist/admin/fields/Collapsible.d.ts.map +1 -1
  21. package/dist/admin/fields/Collapsible.js.map +1 -1
  22. package/dist/admin/fields/Date.d.ts +1 -0
  23. package/dist/admin/fields/Date.d.ts.map +1 -1
  24. package/dist/admin/fields/Date.js.map +1 -1
  25. package/dist/admin/fields/Email.d.ts +1 -1
  26. package/dist/admin/fields/Email.d.ts.map +1 -1
  27. package/dist/admin/fields/Email.js.map +1 -1
  28. package/dist/admin/fields/Group.d.ts +5 -2
  29. package/dist/admin/fields/Group.d.ts.map +1 -1
  30. package/dist/admin/fields/Group.js.map +1 -1
  31. package/dist/admin/fields/Hidden.d.ts +7 -6
  32. package/dist/admin/fields/Hidden.d.ts.map +1 -1
  33. package/dist/admin/fields/Hidden.js.map +1 -1
  34. package/dist/admin/fields/JSON.d.ts +1 -0
  35. package/dist/admin/fields/JSON.d.ts.map +1 -1
  36. package/dist/admin/fields/JSON.js.map +1 -1
  37. package/dist/admin/fields/Join.d.ts +3 -1
  38. package/dist/admin/fields/Join.d.ts.map +1 -1
  39. package/dist/admin/fields/Join.js.map +1 -1
  40. package/dist/admin/fields/Number.d.ts +1 -0
  41. package/dist/admin/fields/Number.d.ts.map +1 -1
  42. package/dist/admin/fields/Number.js.map +1 -1
  43. package/dist/admin/fields/Point.d.ts +1 -0
  44. package/dist/admin/fields/Point.d.ts.map +1 -1
  45. package/dist/admin/fields/Point.js.map +1 -1
  46. package/dist/admin/fields/Radio.d.ts +1 -0
  47. package/dist/admin/fields/Radio.d.ts.map +1 -1
  48. package/dist/admin/fields/Radio.js.map +1 -1
  49. package/dist/admin/fields/Relationship.d.ts +1 -0
  50. package/dist/admin/fields/Relationship.d.ts.map +1 -1
  51. package/dist/admin/fields/Relationship.js.map +1 -1
  52. package/dist/admin/fields/RichText.d.ts +3 -2
  53. package/dist/admin/fields/RichText.d.ts.map +1 -1
  54. package/dist/admin/fields/RichText.js.map +1 -1
  55. package/dist/admin/fields/Row.d.ts +1 -2
  56. package/dist/admin/fields/Row.d.ts.map +1 -1
  57. package/dist/admin/fields/Row.js.map +1 -1
  58. package/dist/admin/fields/Select.d.ts +1 -0
  59. package/dist/admin/fields/Select.d.ts.map +1 -1
  60. package/dist/admin/fields/Select.js.map +1 -1
  61. package/dist/admin/fields/Tabs.d.ts +4 -2
  62. package/dist/admin/fields/Tabs.d.ts.map +1 -1
  63. package/dist/admin/fields/Tabs.js.map +1 -1
  64. package/dist/admin/fields/Text.d.ts +1 -0
  65. package/dist/admin/fields/Text.d.ts.map +1 -1
  66. package/dist/admin/fields/Text.js.map +1 -1
  67. package/dist/admin/fields/Textarea.d.ts +1 -0
  68. package/dist/admin/fields/Textarea.d.ts.map +1 -1
  69. package/dist/admin/fields/Textarea.js.map +1 -1
  70. package/dist/admin/fields/UI.d.ts +8 -0
  71. package/dist/admin/fields/UI.d.ts.map +1 -0
  72. package/dist/admin/fields/UI.js +3 -0
  73. package/dist/admin/fields/UI.js.map +1 -0
  74. package/dist/admin/fields/Upload.d.ts +1 -0
  75. package/dist/admin/fields/Upload.d.ts.map +1 -1
  76. package/dist/admin/fields/Upload.js.map +1 -1
  77. package/dist/admin/forms/Description.d.ts +1 -2
  78. package/dist/admin/forms/Description.d.ts.map +1 -1
  79. package/dist/admin/forms/Description.js.map +1 -1
  80. package/dist/admin/forms/Error.d.ts +0 -2
  81. package/dist/admin/forms/Error.d.ts.map +1 -1
  82. package/dist/admin/forms/Error.js.map +1 -1
  83. package/dist/admin/forms/Field.d.ts +53 -29
  84. package/dist/admin/forms/Field.d.ts.map +1 -1
  85. package/dist/admin/forms/Field.js.map +1 -1
  86. package/dist/admin/forms/Form.d.ts +46 -3
  87. package/dist/admin/forms/Form.d.ts.map +1 -1
  88. package/dist/admin/forms/Form.js.map +1 -1
  89. package/dist/admin/forms/Label.d.ts +1 -2
  90. package/dist/admin/forms/Label.d.ts.map +1 -1
  91. package/dist/admin/forms/Label.js.map +1 -1
  92. package/dist/admin/functions/index.d.ts +44 -0
  93. package/dist/admin/functions/index.d.ts.map +1 -0
  94. package/dist/admin/functions/index.js +3 -0
  95. package/dist/admin/functions/index.js.map +1 -0
  96. package/dist/admin/types.d.ts +63 -20
  97. package/dist/admin/types.d.ts.map +1 -1
  98. package/dist/admin/types.js +4 -1
  99. package/dist/admin/types.js.map +1 -1
  100. package/dist/admin/views/types.d.ts +9 -6
  101. package/dist/admin/views/types.d.ts.map +1 -1
  102. package/dist/admin/views/types.js.map +1 -1
  103. package/dist/assets/images/github-banner-nextjs-native.jpg +0 -0
  104. package/dist/auth/ensureUsernameOrEmail.js +4 -4
  105. package/dist/auth/ensureUsernameOrEmail.js.map +1 -1
  106. package/dist/auth/getFieldsToSign.js +13 -13
  107. package/dist/auth/getFieldsToSign.js.map +1 -1
  108. package/dist/auth/operations/local/auth.d.ts.map +1 -1
  109. package/dist/auth/operations/local/auth.js +2 -2
  110. package/dist/auth/operations/local/auth.js.map +1 -1
  111. package/dist/auth/operations/login.js +10 -10
  112. package/dist/auth/operations/login.js.map +1 -1
  113. package/dist/auth/strategies/local/generatePasswordSaltHash.js +2 -2
  114. package/dist/auth/strategies/local/generatePasswordSaltHash.js.map +1 -1
  115. package/dist/auth/strategies/local/register.js +4 -4
  116. package/dist/auth/strategies/local/register.js.map +1 -1
  117. package/dist/bin/generateImportMap/index.d.ts.map +1 -1
  118. package/dist/bin/generateImportMap/index.js +32 -5
  119. package/dist/bin/generateImportMap/index.js.map +1 -1
  120. package/dist/bin/generateImportMap/parsePayloadComponent.d.ts +1 -1
  121. package/dist/bin/generateImportMap/parsePayloadComponent.js +5 -5
  122. package/dist/bin/generateImportMap/parsePayloadComponent.js.map +1 -1
  123. package/dist/bin/migrate.js +17 -17
  124. package/dist/bin/migrate.js.map +1 -1
  125. package/dist/collections/config/client.d.ts +23 -35
  126. package/dist/collections/config/client.d.ts.map +1 -1
  127. package/dist/collections/config/client.js +104 -1
  128. package/dist/collections/config/client.js.map +1 -1
  129. package/dist/collections/config/sanitize.d.ts.map +1 -1
  130. package/dist/collections/config/sanitize.js +4 -2
  131. package/dist/collections/config/sanitize.js.map +1 -1
  132. package/dist/collections/config/types.d.ts +3 -3
  133. package/dist/collections/config/types.d.ts.map +1 -1
  134. package/dist/collections/config/types.js.map +1 -1
  135. package/dist/collections/operations/countVersions.d.ts +14 -0
  136. package/dist/collections/operations/countVersions.d.ts.map +1 -0
  137. package/dist/collections/operations/countVersions.js +74 -0
  138. package/dist/collections/operations/countVersions.js.map +1 -0
  139. package/dist/collections/operations/local/count.d.ts.map +1 -1
  140. package/dist/collections/operations/local/count.js +1 -0
  141. package/dist/collections/operations/local/count.js.map +1 -1
  142. package/dist/collections/operations/local/countVersions.d.ts +20 -0
  143. package/dist/collections/operations/local/countVersions.d.ts.map +1 -0
  144. package/dist/collections/operations/local/countVersions.js +20 -0
  145. package/dist/collections/operations/local/countVersions.js.map +1 -0
  146. package/dist/collections/operations/local/index.d.ts +2 -0
  147. package/dist/collections/operations/local/index.d.ts.map +1 -1
  148. package/dist/collections/operations/local/index.js +2 -0
  149. package/dist/collections/operations/local/index.js.map +1 -1
  150. package/dist/collections/operations/utils.d.ts +6 -0
  151. package/dist/collections/operations/utils.d.ts.map +1 -1
  152. package/dist/collections/operations/utils.js.map +1 -1
  153. package/dist/config/client.d.ts +10 -13
  154. package/dist/config/client.d.ts.map +1 -1
  155. package/dist/config/client.js +36 -0
  156. package/dist/config/client.js.map +1 -1
  157. package/dist/config/types.d.ts +20 -15
  158. package/dist/config/types.d.ts.map +1 -1
  159. package/dist/config/types.js.map +1 -1
  160. package/dist/database/getLocalizedPaths.js +1 -1
  161. package/dist/database/getLocalizedPaths.js.map +1 -1
  162. package/dist/database/sanitizeJoinQuery.js +6 -6
  163. package/dist/database/sanitizeJoinQuery.js.map +1 -1
  164. package/dist/database/types.d.ts +14 -0
  165. package/dist/database/types.d.ts.map +1 -1
  166. package/dist/database/types.js.map +1 -1
  167. package/dist/errors/ValidationError.d.ts +1 -1
  168. package/dist/errors/ValidationError.d.ts.map +1 -1
  169. package/dist/errors/ValidationError.js +1 -1
  170. package/dist/errors/ValidationError.js.map +1 -1
  171. package/dist/exports/shared.d.ts +3 -1
  172. package/dist/exports/shared.d.ts.map +1 -1
  173. package/dist/exports/shared.js +3 -1
  174. package/dist/exports/shared.js.map +1 -1
  175. package/dist/fields/config/client.d.ts +16 -1
  176. package/dist/fields/config/client.d.ts.map +1 -1
  177. package/dist/fields/config/client.js +229 -1
  178. package/dist/fields/config/client.js.map +1 -1
  179. package/dist/fields/config/sanitize.d.ts +2 -2
  180. package/dist/fields/config/sanitize.d.ts.map +1 -1
  181. package/dist/fields/config/sanitize.js +7 -21
  182. package/dist/fields/config/sanitize.js.map +1 -1
  183. package/dist/fields/config/sanitizeJoinField.d.ts +2 -2
  184. package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
  185. package/dist/fields/config/sanitizeJoinField.js +2 -2
  186. package/dist/fields/config/sanitizeJoinField.js.map +1 -1
  187. package/dist/fields/config/types.d.ts +28 -171
  188. package/dist/fields/config/types.d.ts.map +1 -1
  189. package/dist/fields/config/types.js.map +1 -1
  190. package/dist/fields/getFieldPaths.d.ts +25 -8
  191. package/dist/fields/getFieldPaths.d.ts.map +1 -1
  192. package/dist/fields/getFieldPaths.js +9 -37
  193. package/dist/fields/getFieldPaths.js.map +1 -1
  194. package/dist/fields/hooks/afterChange/promise.d.ts +2 -1
  195. package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
  196. package/dist/fields/hooks/afterChange/promise.js +66 -62
  197. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  198. package/dist/fields/hooks/afterChange/traverseFields.d.ts.map +1 -1
  199. package/dist/fields/hooks/afterChange/traverseFields.js +2 -1
  200. package/dist/fields/hooks/afterChange/traverseFields.js.map +1 -1
  201. package/dist/fields/hooks/afterRead/promise.d.ts +2 -1
  202. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  203. package/dist/fields/hooks/afterRead/promise.js +107 -103
  204. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  205. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  206. package/dist/fields/hooks/afterRead/traverseFields.js +2 -1
  207. package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
  208. package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
  209. package/dist/fields/hooks/beforeChange/index.js.map +1 -1
  210. package/dist/fields/hooks/beforeChange/promise.d.ts +8 -5
  211. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  212. package/dist/fields/hooks/beforeChange/promise.js +99 -110
  213. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  214. package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -4
  215. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  216. package/dist/fields/hooks/beforeChange/traverseFields.js +2 -1
  217. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  218. package/dist/fields/hooks/beforeDuplicate/promise.d.ts +2 -1
  219. package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
  220. package/dist/fields/hooks/beforeDuplicate/promise.js +47 -43
  221. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  222. package/dist/fields/hooks/beforeDuplicate/traverseFields.d.ts.map +1 -1
  223. package/dist/fields/hooks/beforeDuplicate/traverseFields.js +2 -1
  224. package/dist/fields/hooks/beforeDuplicate/traverseFields.js.map +1 -1
  225. package/dist/fields/hooks/beforeValidate/promise.d.ts +2 -1
  226. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  227. package/dist/fields/hooks/beforeValidate/promise.js +105 -101
  228. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  229. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  230. package/dist/fields/hooks/beforeValidate/traverseFields.js +2 -1
  231. package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
  232. package/dist/globals/config/client.d.ts +18 -25
  233. package/dist/globals/config/client.d.ts.map +1 -1
  234. package/dist/globals/config/client.js +53 -1
  235. package/dist/globals/config/client.js.map +1 -1
  236. package/dist/globals/config/sanitize.d.ts.map +1 -1
  237. package/dist/globals/config/sanitize.js +3 -1
  238. package/dist/globals/config/sanitize.js.map +1 -1
  239. package/dist/globals/operations/countGlobalVersions.d.ts +13 -0
  240. package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -0
  241. package/dist/globals/operations/countGlobalVersions.js +49 -0
  242. package/dist/globals/operations/countGlobalVersions.js.map +1 -0
  243. package/dist/globals/operations/local/countGlobalVersions.d.ts +20 -0
  244. package/dist/globals/operations/local/countGlobalVersions.d.ts.map +1 -0
  245. package/dist/globals/operations/local/countGlobalVersions.js +20 -0
  246. package/dist/globals/operations/local/countGlobalVersions.js.map +1 -0
  247. package/dist/globals/operations/local/index.d.ts +2 -0
  248. package/dist/globals/operations/local/index.d.ts.map +1 -1
  249. package/dist/globals/operations/local/index.js +2 -0
  250. package/dist/globals/operations/local/index.js.map +1 -1
  251. package/dist/index.d.ts +28 -12
  252. package/dist/index.d.ts.map +1 -1
  253. package/dist/index.js +21 -2
  254. package/dist/index.js.map +1 -1
  255. package/dist/queues/config/jobsCollection.d.ts.map +1 -1
  256. package/dist/queues/config/jobsCollection.js +2 -11
  257. package/dist/queues/config/jobsCollection.js.map +1 -1
  258. package/dist/queues/config/types/workflowTypes.d.ts +2 -1
  259. package/dist/queues/config/types/workflowTypes.d.ts.map +1 -1
  260. package/dist/queues/config/types/workflowTypes.js.map +1 -1
  261. package/dist/queues/localAPI.d.ts +2 -0
  262. package/dist/queues/localAPI.d.ts.map +1 -1
  263. package/dist/queues/localAPI.js +13 -0
  264. package/dist/queues/localAPI.js.map +1 -1
  265. package/dist/utilities/configToJSONSchema.js +232 -232
  266. package/dist/utilities/configToJSONSchema.js.map +1 -1
  267. package/dist/utilities/createLocalReq.d.ts +1 -1
  268. package/dist/utilities/createLocalReq.d.ts.map +1 -1
  269. package/dist/utilities/createLocalReq.js +4 -4
  270. package/dist/utilities/createLocalReq.js.map +1 -1
  271. package/dist/utilities/deepCopyObject.d.ts +1 -0
  272. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  273. package/dist/utilities/deepCopyObject.js +23 -0
  274. package/dist/utilities/deepCopyObject.js.map +1 -1
  275. package/dist/utilities/fieldSchemaToJSON.js +17 -17
  276. package/dist/utilities/fieldSchemaToJSON.js.map +1 -1
  277. package/dist/utilities/formatErrors.d.ts +6 -0
  278. package/dist/utilities/formatErrors.d.ts.map +1 -0
  279. package/dist/utilities/formatErrors.js +56 -0
  280. package/dist/utilities/formatErrors.js.map +1 -0
  281. package/dist/utilities/telemetry/conf/index.js +2 -2
  282. package/dist/utilities/telemetry/conf/index.js.map +1 -1
  283. package/dist/versions/saveVersion.d.ts.map +1 -1
  284. package/dist/versions/saveVersion.js +1 -7
  285. package/dist/versions/saveVersion.js.map +1 -1
  286. package/dist/versions/types.d.ts +1 -1
  287. package/dist/versions/types.d.ts.map +1 -1
  288. package/dist/versions/types.js.map +1 -1
  289. package/license.md +22 -0
  290. package/package.json +3 -3
  291. package/dist/utilities/mergeListSearchAndWhere.d.ts +0 -12
  292. package/dist/utilities/mergeListSearchAndWhere.d.ts.map +0 -1
  293. package/dist/utilities/mergeListSearchAndWhere.js +0 -57
  294. package/dist/utilities/mergeListSearchAndWhere.js.map +0 -1
@@ -1,5 +1,20 @@
1
- import type { ClientField, FieldBase } from '../../fields/config/types.js';
1
+ import type { I18nClient } from '@payloadcms/translations';
2
+ import type { ClientField, Field, FieldBase } from '../../fields/config/types.js';
3
+ import type { Payload } from '../../types/index.js';
2
4
  export { ClientField };
3
5
  export type ServerOnlyFieldProperties = 'dbName' | 'editor' | 'enumName' | 'filterOptions' | 'label' | 'typescriptSchema' | 'validate' | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>;
4
6
  export type ServerOnlyFieldAdminProperties = keyof Pick<FieldBase['admin'], 'condition'>;
7
+ export declare const createClientField: ({ clientField, defaultIDType, field: incomingField, i18n, }: {
8
+ clientField?: ClientField;
9
+ defaultIDType: Payload["config"]["db"]["defaultIDType"];
10
+ field: Field;
11
+ i18n: I18nClient;
12
+ }) => ClientField;
13
+ export declare const createClientFields: ({ clientFields, defaultIDType, disableAddingID, fields, i18n, }: {
14
+ clientFields: ClientField[];
15
+ defaultIDType: Payload["config"]["db"]["defaultIDType"];
16
+ disableAddingID?: boolean;
17
+ fields: Field[];
18
+ i18n: I18nClient;
19
+ }) => ClientField[];
5
20
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/fields/config/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAK1E,OAAO,EAAE,WAAW,EAAE,CAAA;AAEtB,MAAM,MAAM,yBAAyB,GACjC,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,eAAe,GACf,OAAO,GACP,kBAAkB,GAClB,UAAU,GACV,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC,CAAA;AAEzE,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/fields/config/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,KAAK,EAIV,WAAW,EACX,KAAK,EACL,SAAS,EAMV,MAAM,8BAA8B,CAAA;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AASnD,OAAO,EAAE,WAAW,EAAE,CAAA;AAEtB,MAAM,MAAM,yBAAyB,GACjC,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,eAAe,GACf,OAAO,GACP,kBAAkB,GAClB,UAAU,GACV,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CAAC,CAAA;AAEzE,MAAM,MAAM,8BAA8B,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAA;AAExF,eAAO,MAAM,iBAAiB,gEAK3B;IACD,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAA;IACvD,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;CACjB,KAAG,WAyOH,CAAA;AAED,eAAO,MAAM,kBAAkB,oEAM5B;IACD,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,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;CACjB,KAAG,WAAW,EAqCd,CAAA"}
@@ -1,3 +1,231 @@
1
- export { };
1
+ import { MissingEditorProp } from '../../errors/MissingEditorProp.js';
2
+ import { fieldAffectsData } from '../../fields/config/types.js';
3
+ import { flattenTopLevelFields } from '../../index.js';
4
+ export const createClientField = ({ clientField = {}, defaultIDType, field: incomingField, i18n })=>{
5
+ const serverOnlyFieldProperties = [
6
+ 'hooks',
7
+ 'access',
8
+ 'validate',
9
+ 'defaultValue',
10
+ 'filterOptions',
11
+ 'editor',
12
+ 'custom',
13
+ 'typescriptSchema',
14
+ 'dbName',
15
+ 'enumName'
16
+ ];
17
+ clientField.admin = clientField.admin || {};
18
+ // clientField.admin.readOnly = true
19
+ serverOnlyFieldProperties.forEach((key)=>{
20
+ if (key in clientField) {
21
+ delete clientField[key];
22
+ }
23
+ });
24
+ const isHidden = 'hidden' in incomingField && incomingField?.hidden;
25
+ const disabledFromAdmin = incomingField?.admin && 'disabled' in incomingField.admin && incomingField.admin.disabled;
26
+ if (fieldAffectsData(clientField) && (isHidden || disabledFromAdmin)) {
27
+ return null;
28
+ }
29
+ if ('label' in clientField && 'label' in incomingField && typeof incomingField.label === 'function') {
30
+ clientField.label = incomingField.label({
31
+ t: i18n.t
32
+ });
33
+ }
34
+ if (!(clientField.admin instanceof Object)) {
35
+ clientField.admin = {};
36
+ }
37
+ if ('admin' in incomingField && 'width' in incomingField.admin) {
38
+ clientField.admin.style = {
39
+ ...clientField.admin.style,
40
+ '--field-width': clientField.admin.width,
41
+ width: undefined
42
+ };
43
+ } else {
44
+ if (!(clientField.admin.style instanceof Object)) {
45
+ clientField.admin.style = {};
46
+ }
47
+ clientField.admin.style.flex = '1 1 auto';
48
+ }
49
+ switch(incomingField.type){
50
+ case 'array':
51
+ case 'collapsible':
52
+ case 'group':
53
+ case 'row':
54
+ {
55
+ const field = clientField;
56
+ if (!field.fields) {
57
+ field.fields = [];
58
+ }
59
+ field.fields = createClientFields({
60
+ clientFields: field.fields,
61
+ defaultIDType,
62
+ disableAddingID: incomingField.type !== 'array',
63
+ fields: incomingField.fields,
64
+ i18n
65
+ });
66
+ break;
67
+ }
68
+ case 'blocks':
69
+ {
70
+ const field = clientField;
71
+ if (incomingField.blocks?.length) {
72
+ for(let i = 0; i < incomingField.blocks.length; i++){
73
+ const block = incomingField.blocks[i];
74
+ const clientBlock = {
75
+ slug: block.slug,
76
+ admin: {
77
+ components: {},
78
+ custom: block.admin?.custom
79
+ },
80
+ fields: field.blocks?.[i]?.fields || [],
81
+ imageAltText: block.imageAltText,
82
+ imageURL: block.imageURL
83
+ };
84
+ if (block.labels) {
85
+ clientBlock.labels = {};
86
+ if (block.labels.singular) {
87
+ if (typeof block.labels.singular === 'function') {
88
+ clientBlock.labels.singular = block.labels.singular({
89
+ t: i18n.t
90
+ });
91
+ } else {
92
+ clientBlock.labels.singular = block.labels.singular;
93
+ }
94
+ if (typeof block.labels.plural === 'function') {
95
+ clientBlock.labels.plural = block.labels.plural({
96
+ t: i18n.t
97
+ });
98
+ } else {
99
+ clientBlock.labels.plural = block.labels.plural;
100
+ }
101
+ }
102
+ }
103
+ clientBlock.fields = createClientFields({
104
+ clientFields: clientBlock.fields,
105
+ defaultIDType,
106
+ fields: block.fields,
107
+ i18n
108
+ });
109
+ if (!field.blocks) {
110
+ field.blocks = [];
111
+ }
112
+ field.blocks[i] = clientBlock;
113
+ }
114
+ }
115
+ break;
116
+ }
117
+ case 'radio':
118
+ case 'select':
119
+ {
120
+ const field = clientField;
121
+ if (incomingField.options?.length) {
122
+ for(let i = 0; i < incomingField.options.length; i++){
123
+ const option = incomingField.options[i];
124
+ if (typeof option === 'object' && typeof option.label === 'function') {
125
+ if (!field.options) {
126
+ field.options = [];
127
+ }
128
+ field.options[i] = {
129
+ label: option.label({
130
+ t: i18n.t
131
+ }),
132
+ value: option.value
133
+ };
134
+ }
135
+ }
136
+ }
137
+ break;
138
+ }
139
+ case 'richText':
140
+ {
141
+ if (!incomingField?.editor) {
142
+ 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
143
+ ;
144
+ }
145
+ if (typeof incomingField?.editor === 'function') {
146
+ throw new Error('Attempted to access unsanitized rich text editor.');
147
+ }
148
+ break;
149
+ }
150
+ case 'tabs':
151
+ {
152
+ const field = clientField;
153
+ if (incomingField.tabs?.length) {
154
+ for(let i = 0; i < incomingField.tabs.length; i++){
155
+ const tab = incomingField.tabs[i];
156
+ const clientTab = field.tabs[i];
157
+ serverOnlyFieldProperties.forEach((key)=>{
158
+ if (key in clientTab) {
159
+ delete clientTab[key];
160
+ }
161
+ });
162
+ clientTab.fields = createClientFields({
163
+ clientFields: clientTab.fields,
164
+ defaultIDType,
165
+ disableAddingID: true,
166
+ fields: tab.fields,
167
+ i18n
168
+ });
169
+ }
170
+ }
171
+ break;
172
+ }
173
+ default:
174
+ break;
175
+ }
176
+ const serverOnlyFieldAdminProperties = [
177
+ 'condition'
178
+ ];
179
+ if (!clientField.admin) {
180
+ clientField.admin = {};
181
+ }
182
+ serverOnlyFieldAdminProperties.forEach((key)=>{
183
+ if (key in clientField.admin) {
184
+ delete clientField.admin[key];
185
+ }
186
+ });
187
+ if (incomingField.admin && 'description' in incomingField.admin) {
188
+ if (typeof incomingField.admin?.description === 'string' || typeof incomingField.admin?.description === 'object') {
189
+ clientField.admin.description = incomingField.admin.description;
190
+ } else if (typeof incomingField.admin?.description === 'function') {
191
+ clientField.admin.description = incomingField.admin?.description({
192
+ t: i18n.t
193
+ });
194
+ }
195
+ }
196
+ return clientField;
197
+ };
198
+ export const createClientFields = ({ clientFields, defaultIDType, disableAddingID, fields, i18n })=>{
199
+ const newClientFields = [];
200
+ for(let i = 0; i < fields.length; i++){
201
+ const field = fields[i];
202
+ const newField = createClientField({
203
+ clientField: clientFields[i],
204
+ defaultIDType,
205
+ field,
206
+ i18n
207
+ });
208
+ if (newField) {
209
+ newClientFields.push(newField);
210
+ }
211
+ }
212
+ const hasID = flattenTopLevelFields(fields).some((f)=>fieldAffectsData(f) && f.name === 'id');
213
+ if (!disableAddingID && !hasID) {
214
+ newClientFields.push({
215
+ name: 'id',
216
+ type: defaultIDType,
217
+ admin: {
218
+ description: 'The unique identifier for this document',
219
+ disableBulkEdit: true,
220
+ disabled: true,
221
+ hidden: true
222
+ },
223
+ hidden: true,
224
+ label: 'ID',
225
+ localized: undefined
226
+ });
227
+ }
228
+ return newClientFields;
229
+ };
2
230
 
3
231
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/client.ts"],"sourcesContent":["import type { ClientField, FieldBase } from '../../fields/config/types.js'\n\n// Should not be used - ClientField should be used instead. This is why we don't export ClientField, we don't want people\n// to accidentally use it instead of ClientField and get confused\n\nexport { ClientField }\n\nexport type ServerOnlyFieldProperties =\n | 'dbName' // can be a function\n | 'editor' // This is a `richText` only property\n | 'enumName' // can be a function\n | 'filterOptions' // This is a `relationship` and `upload` only property\n | 'label'\n | 'typescriptSchema'\n | 'validate'\n | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>\n\nexport type ServerOnlyFieldAdminProperties = keyof Pick<FieldBase['admin'], 'condition'>\n"],"names":[],"mappings":"AAiBA,WAAwF"}
1
+ {"version":3,"sources":["../../../src/fields/config/client.ts"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\n\nimport type {\n AdminClient,\n BlocksFieldClient,\n ClientBlock,\n ClientField,\n Field,\n FieldBase,\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 { MissingEditorProp } from '../../errors/MissingEditorProp.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport { flattenTopLevelFields } from '../../index.js'\n\n// Should not be used - ClientField should be used instead. This is why we don't export ClientField, we don't want people\n// to accidentally use it instead of ClientField and get confused\n\nexport { ClientField }\n\nexport type ServerOnlyFieldProperties =\n | 'dbName' // can be a function\n | 'editor' // This is a `richText` only property\n | 'enumName' // can be a function\n | 'filterOptions' // This is a `relationship` and `upload` only property\n | 'label'\n | 'typescriptSchema'\n | 'validate'\n | keyof Pick<FieldBase, 'access' | 'custom' | 'defaultValue' | 'hooks'>\n\nexport type ServerOnlyFieldAdminProperties = keyof Pick<FieldBase['admin'], 'condition'>\n\nexport const createClientField = ({\n clientField = {} as ClientField,\n defaultIDType,\n field: incomingField,\n i18n,\n}: {\n clientField?: ClientField\n defaultIDType: Payload['config']['db']['defaultIDType']\n field: Field\n i18n: I18nClient\n}): ClientField => {\n const serverOnlyFieldProperties: Partial<ServerOnlyFieldProperties>[] = [\n 'hooks',\n 'access',\n 'validate',\n 'defaultValue',\n 'filterOptions', // This is a `relationship` and `upload` only property\n 'editor', // This is a `richText` only property\n 'custom',\n 'typescriptSchema',\n 'dbName', // can be a function\n 'enumName', // can be a function\n // the following props are handled separately (see below):\n // `label`\n // `fields`\n // `blocks`\n // `tabs`\n // `admin`\n ]\n\n clientField.admin = clientField.admin || {}\n // clientField.admin.readOnly = true\n\n serverOnlyFieldProperties.forEach((key) => {\n if (key in clientField) {\n delete clientField[key]\n }\n })\n\n const isHidden = 'hidden' in incomingField && incomingField?.hidden\n const disabledFromAdmin =\n incomingField?.admin && 'disabled' in incomingField.admin && incomingField.admin.disabled\n\n if (fieldAffectsData(clientField) && (isHidden || disabledFromAdmin)) {\n return null\n }\n\n if (\n 'label' in clientField &&\n 'label' in incomingField &&\n typeof incomingField.label === 'function'\n ) {\n clientField.label = incomingField.label({ t: i18n.t })\n }\n\n if (!(clientField.admin instanceof Object)) {\n clientField.admin = {} as AdminClient\n }\n\n if ('admin' in incomingField && 'width' in incomingField.admin) {\n clientField.admin.style = {\n ...clientField.admin.style,\n '--field-width': clientField.admin.width,\n width: undefined, // avoid needlessly adding this to the element's style attribute\n }\n } else {\n if (!(clientField.admin.style instanceof Object)) {\n clientField.admin.style = {}\n }\n\n clientField.admin.style.flex = '1 1 auto'\n }\n\n switch (incomingField.type) {\n case 'array':\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 clientFields: field.fields,\n defaultIDType,\n disableAddingID: incomingField.type !== 'array',\n fields: incomingField.fields,\n i18n,\n })\n\n break\n }\n\n case 'blocks': {\n const field = clientField as unknown as BlocksFieldClient\n\n if (incomingField.blocks?.length) {\n for (let i = 0; i < incomingField.blocks.length; i++) {\n const block = incomingField.blocks[i]\n const clientBlock: ClientBlock = {\n slug: block.slug,\n admin: {\n components: {},\n custom: block.admin?.custom,\n },\n fields: field.blocks?.[i]?.fields || [],\n imageAltText: block.imageAltText,\n imageURL: block.imageURL,\n }\n\n if (block.labels) {\n clientBlock.labels = {} as unknown as LabelsClient\n if (block.labels.singular) {\n if (typeof block.labels.singular === 'function') {\n clientBlock.labels.singular = block.labels.singular({ t: i18n.t })\n } else {\n clientBlock.labels.singular = block.labels.singular\n }\n if (typeof block.labels.plural === 'function') {\n clientBlock.labels.plural = block.labels.plural({ t: i18n.t })\n } else {\n clientBlock.labels.plural = block.labels.plural\n }\n }\n }\n\n clientBlock.fields = createClientFields({\n clientFields: clientBlock.fields,\n defaultIDType,\n fields: block.fields,\n i18n,\n })\n\n if (!field.blocks) {\n field.blocks = []\n }\n\n field.blocks[i] = clientBlock\n }\n }\n\n break\n }\n\n case 'radio':\n\n case 'select': {\n const field = clientField as RadioFieldClient | SelectFieldClient\n\n if (incomingField.options?.length) {\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 if (!field.options) {\n field.options = []\n }\n\n field.options[i] = {\n label: option.label({ t: i18n.t }),\n value: option.value,\n }\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 case 'tabs': {\n const field = clientField as unknown as TabsFieldClient\n\n if (incomingField.tabs?.length) {\n for (let i = 0; i < incomingField.tabs.length; i++) {\n const tab = incomingField.tabs[i]\n const clientTab = field.tabs[i]\n\n serverOnlyFieldProperties.forEach((key) => {\n if (key in clientTab) {\n delete clientTab[key]\n }\n })\n\n clientTab.fields = createClientFields({\n clientFields: clientTab.fields,\n defaultIDType,\n disableAddingID: true,\n fields: tab.fields,\n i18n,\n })\n }\n }\n\n break\n }\n\n default:\n break\n }\n\n const serverOnlyFieldAdminProperties: Partial<ServerOnlyFieldAdminProperties>[] = ['condition']\n\n if (!clientField.admin) {\n clientField.admin = {} as AdminClient\n }\n\n serverOnlyFieldAdminProperties.forEach((key) => {\n if (key in clientField.admin) {\n delete clientField.admin[key]\n }\n })\n\n type FieldWithDescription = {\n admin: AdminClient\n } & ClientField\n\n if (incomingField.admin && 'description' in incomingField.admin) {\n if (\n typeof incomingField.admin?.description === 'string' ||\n typeof incomingField.admin?.description === 'object'\n ) {\n ;(clientField as FieldWithDescription).admin.description = incomingField.admin.description\n } else if (typeof incomingField.admin?.description === 'function') {\n ;(clientField as FieldWithDescription).admin.description = incomingField.admin?.description({\n t: i18n.t,\n })\n }\n }\n\n return clientField\n}\n\nexport const createClientFields = ({\n clientFields,\n defaultIDType,\n disableAddingID,\n fields,\n i18n,\n}: {\n clientFields: ClientField[]\n defaultIDType: Payload['config']['db']['defaultIDType']\n disableAddingID?: boolean\n fields: Field[]\n i18n: I18nClient\n}): ClientField[] => {\n const newClientFields: ClientField[] = []\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]\n\n const newField = createClientField({\n clientField: clientFields[i],\n defaultIDType,\n field,\n i18n,\n })\n\n if (newField) {\n newClientFields.push(newField)\n }\n }\n\n const hasID = flattenTopLevelFields(fields).some((f) => fieldAffectsData(f) && f.name === 'id')\n\n if (!disableAddingID && !hasID) {\n newClientFields.push({\n name: 'id',\n type: defaultIDType,\n admin: {\n description: 'The unique identifier for this document',\n disableBulkEdit: true,\n disabled: true,\n hidden: true,\n },\n hidden: true,\n label: 'ID',\n localized: undefined,\n })\n }\n\n return newClientFields\n}\n"],"names":["MissingEditorProp","fieldAffectsData","flattenTopLevelFields","createClientField","clientField","defaultIDType","field","incomingField","i18n","serverOnlyFieldProperties","admin","forEach","key","isHidden","hidden","disabledFromAdmin","disabled","label","t","Object","style","width","undefined","flex","type","fields","createClientFields","clientFields","disableAddingID","blocks","length","i","block","clientBlock","slug","components","custom","imageAltText","imageURL","labels","singular","plural","options","option","value","editor","Error","tabs","tab","clientTab","serverOnlyFieldAdminProperties","description","newClientFields","newField","push","hasID","some","f","name","disableBulkEdit","localized"],"mappings":"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"}
@@ -6,6 +6,7 @@ type Args = {
6
6
  config: Config;
7
7
  existingFieldNames?: Set<string>;
8
8
  fields: Field[];
9
+ joinPath?: string;
9
10
  /**
10
11
  * When not passed in, assume that join are not supported (globals, arrays, blocks)
11
12
  */
@@ -22,13 +23,12 @@ type Args = {
22
23
  * so that you can sanitize them together, after the config has been sanitized.
23
24
  */
24
25
  richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>;
25
- schemaPath?: string;
26
26
  /**
27
27
  * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.
28
28
  * This validation will be skipped if validRelationships is null.
29
29
  */
30
30
  validRelationships: null | string[];
31
31
  };
32
- export declare const sanitizeFields: ({ config, existingFieldNames, fields, joins, parentIsLocalized, requireFieldLevelRichTextEditor, richTextSanitizationPromises, schemaPath, validRelationships, }: Args) => Promise<Field[]>;
32
+ export declare const sanitizeFields: ({ config, existingFieldNames, fields, joinPath, joins, parentIsLocalized, requireFieldLevelRichTextEditor, richTextSanitizationPromises, validRelationships, }: Args) => Promise<Field[]>;
33
33
  export {};
34
34
  //# sourceMappingURL=sanitize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACzF,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAiBvC,KAAK,IAAI,GAAG;IACV,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAA;IAEzC;;;OAGG;IACH,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AASD,eAAO,MAAM,cAAc,qKAUxB,IAAI,KAAG,OAAO,CAAC,KAAK,EAAE,CAiPxB,CAAA"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACzF,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAiBvC,KAAK,IAAI,GAAG;IACV,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;IAE1B;;;;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,eAAO,MAAM,cAAc,mKAUxB,IAAI,KAAG,OAAO,CAAC,KAAK,EAAE,CA2OxB,CAAA"}
@@ -7,13 +7,7 @@ import { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js';
7
7
  import validations from '../validations.js';
8
8
  import { sanitizeJoinField } from './sanitizeJoinField.js';
9
9
  import { fieldAffectsData, tabHasName } from './types.js';
10
- function generateSchemaPath({ name, path = '' }) {
11
- if (!name) {
12
- return path;
13
- }
14
- return path ? `${path}.${name}` : name;
15
- }
16
- export const sanitizeFields = async ({ config, existingFieldNames = new Set(), fields, joins, parentIsLocalized, requireFieldLevelRichTextEditor = false, richTextSanitizationPromises, schemaPath = '', validRelationships })=>{
10
+ export const sanitizeFields = async ({ config, existingFieldNames = new Set(), fields, joinPath = '', joins, parentIsLocalized, requireFieldLevelRichTextEditor = false, richTextSanitizationPromises, validRelationships })=>{
17
11
  if (!fields) {
18
12
  return [];
19
13
  }
@@ -40,8 +34,8 @@ export const sanitizeFields = async ({ config, existingFieldNames = new Set(), f
40
34
  sanitizeJoinField({
41
35
  config,
42
36
  field,
43
- joins,
44
- schemaPath
37
+ joinPath,
38
+ joins
45
39
  });
46
40
  }
47
41
  if (field.type === 'relationship' || field.type === 'upload') {
@@ -174,37 +168,29 @@ export const sanitizeFields = async ({ config, existingFieldNames = new Set(), f
174
168
  config,
175
169
  existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames,
176
170
  fields: field.fields,
171
+ joinPath: fieldAffectsData(field) ? `${joinPath ? joinPath + '.' : ''}${field.name}` : joinPath,
177
172
  joins,
178
173
  parentIsLocalized: parentIsLocalized || field.localized,
179
174
  requireFieldLevelRichTextEditor,
180
175
  richTextSanitizationPromises,
181
- schemaPath: generateSchemaPath({
182
- name: 'name' in field ? field.name : undefined,
183
- path: schemaPath
184
- }),
185
176
  validRelationships
186
177
  });
187
178
  }
188
179
  if (field.type === 'tabs') {
189
180
  for(let j = 0; j < field.tabs.length; j++){
190
181
  const tab = field.tabs[j];
191
- if (tabHasName(tab)) {
192
- if (typeof tab.label === 'undefined') {
193
- tab.label = toWords(tab.name);
194
- }
182
+ if (tabHasName(tab) && typeof tab.label === 'undefined') {
183
+ tab.label = toWords(tab.name);
195
184
  }
196
185
  tab.fields = await sanitizeFields({
197
186
  config,
198
187
  existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames,
199
188
  fields: tab.fields,
189
+ joinPath: tabHasName(tab) ? `${joinPath ? joinPath + '.' : ''}${tab.name}` : joinPath,
200
190
  joins,
201
191
  parentIsLocalized: parentIsLocalized || tabHasName(tab) && tab.localized,
202
192
  requireFieldLevelRichTextEditor,
203
193
  richTextSanitizationPromises,
204
- schemaPath: generateSchemaPath({
205
- name: 'name' in tab ? tab.name : undefined,
206
- path: schemaPath
207
- }),
208
194
  validRelationships
209
195
  });
210
196
  field.tabs[j] = tab;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type { CollectionConfig, SanitizedJoins } from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingEditorProp,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport validations from '../validations.js'\nimport { sanitizeJoinField } from './sanitizeJoinField.js'\nimport { fieldAffectsData, tabHasName } from './types.js'\n\ntype Args = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n /**\n * When not passed in, assume that join are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n parentIsLocalized: boolean\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n schemaPath?: string\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nfunction generateSchemaPath({ name, path = '' }: { name?: string; path?: string }): string {\n if (!name) {\n return path\n }\n return path ? `${path}.${name}` : name\n}\n\nexport const sanitizeFields = async ({\n config,\n existingFieldNames = new Set(),\n fields,\n joins,\n parentIsLocalized,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n schemaPath = '',\n validRelationships,\n}: Args): Promise<Field[]> => {\n if (!fields) {\n return []\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]\n\n if ('_sanitized' in field && field._sanitized === true) {\n continue\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n // assert that field names do not contain forbidden characters\n if (fieldAffectsData(field) && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n typeof field.label !== 'function' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n if (field.type === 'join') {\n sanitizeJoinField({ config, field, joins, schemaPath })\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n }\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n }\n field.minRows = field.minRows || field.min\n field.maxRows = field.maxRows || field.max\n }\n\n if (field.type === 'upload') {\n if (!field.admin || !('isSortable' in field.admin)) {\n field.admin = {\n isSortable: true,\n ...field.admin,\n }\n }\n }\n\n if (field.type === 'array' && field.fields) {\n field.fields.push(baseIDField)\n }\n\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData(field)) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (typeof field.localized !== 'undefined') {\n let shouldDisableLocalized = !config.localization\n\n if (!config.compatibility?.allowLocalizedWithinLocalized && parentIsLocalized) {\n shouldDisableLocalized = true\n }\n\n if (shouldDisableLocalized) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n const defaultValidate = validations[field.type]\n if (defaultValidate) {\n field.validate = (val, options) => defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = (): true => true\n }\n }\n\n if (typeof field.virtual === 'undefined') {\n field.virtual = false\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n const sanitizeRichText = async (_config: SanitizedConfig) => {\n if (!field.editor) {\n if (_config.editor && !requireFieldLevelRichTextEditor) {\n // config.editor should be sanitized at this point\n field.editor = _config.editor\n } else {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n }\n\n if (typeof field.editor === 'function') {\n field.editor = await field.editor({\n config: _config,\n isRoot: requireFieldLevelRichTextEditor,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n }\n\n if (field.editor.i18n && Object.keys(field.editor.i18n).length >= 0) {\n config.i18n.translations = deepMergeSimple(config.i18n.translations, field.editor.i18n)\n }\n }\n if (richTextSanitizationPromises) {\n richTextSanitizationPromises.push(sanitizeRichText)\n } else {\n await sanitizeRichText(config as unknown as SanitizedConfig)\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n for (const block of field.blocks) {\n if (block._sanitized === true) {\n continue\n }\n block._sanitized = true\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n block.fields = await sanitizeFields({\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n field.fields = await sanitizeFields({\n config,\n existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames,\n fields: field.fields,\n joins,\n parentIsLocalized: parentIsLocalized || field.localized,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n schemaPath: generateSchemaPath({\n name: 'name' in field ? field.name : undefined,\n path: schemaPath,\n }),\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n for (let j = 0; j < field.tabs.length; j++) {\n const tab = field.tabs[j]\n if (tabHasName(tab)) {\n if (typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n }\n\n tab.fields = await sanitizeFields({\n config,\n existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames,\n fields: tab.fields,\n joins,\n parentIsLocalized: parentIsLocalized || (tabHasName(tab) && tab.localized),\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n schemaPath: generateSchemaPath({\n name: 'name' in tab ? tab.name : undefined,\n path: schemaPath,\n }),\n validRelationships,\n })\n field.tabs[j] = tab\n }\n }\n\n if (field.type === 'ui' && typeof field.admin.disableBulkEdit === 'undefined') {\n field.admin.disableBulkEdit = true\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n fields[i] = field\n }\n\n return fields\n}\n"],"names":["deepMergeSimple","DuplicateFieldName","InvalidFieldName","InvalidFieldRelationship","MissingEditorProp","MissingFieldType","formatLabels","toWords","baseBlockFields","baseIDField","setDefaultBeforeDuplicate","validations","sanitizeJoinField","fieldAffectsData","tabHasName","generateSchemaPath","name","path","sanitizeFields","config","existingFieldNames","Set","fields","joins","parentIsLocalized","requireFieldLevelRichTextEditor","richTextSanitizationPromises","schemaPath","validRelationships","i","length","field","_sanitized","type","includes","label","defaultValue","required","relationships","Array","isArray","relationTo","forEach","relationship","min","minRows","console","warn","max","maxRows","admin","isSortable","push","labels","has","add","localized","shouldDisableLocalized","localization","compatibility","allowLocalizedWithinLocalized","validate","defaultValidate","val","options","virtual","hooks","access","sanitizeRichText","_config","editor","isRoot","i18n","Object","keys","translations","blocks","block","concat","slug","undefined","j","tabs","tab","disableBulkEdit"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type { CollectionConfig, SanitizedJoins } from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingEditorProp,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport validations from '../validations.js'\nimport { sanitizeJoinField } from './sanitizeJoinField.js'\nimport { fieldAffectsData, tabHasName } from './types.js'\n\ntype Args = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n joinPath?: string\n /**\n * When not passed in, assume that join are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n parentIsLocalized: boolean\n\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nexport const sanitizeFields = async ({\n config,\n existingFieldNames = new Set(),\n fields,\n joinPath = '',\n joins,\n parentIsLocalized,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n validRelationships,\n}: Args): Promise<Field[]> => {\n if (!fields) {\n return []\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]\n\n if ('_sanitized' in field && field._sanitized === true) {\n continue\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n // assert that field names do not contain forbidden characters\n if (fieldAffectsData(field) && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n typeof field.label !== 'function' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n if (field.type === 'join') {\n sanitizeJoinField({ config, field, joinPath, joins })\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n }\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n }\n field.minRows = field.minRows || field.min\n field.maxRows = field.maxRows || field.max\n }\n\n if (field.type === 'upload') {\n if (!field.admin || !('isSortable' in field.admin)) {\n field.admin = {\n isSortable: true,\n ...field.admin,\n }\n }\n }\n\n if (field.type === 'array' && field.fields) {\n field.fields.push(baseIDField)\n }\n\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData(field)) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (typeof field.localized !== 'undefined') {\n let shouldDisableLocalized = !config.localization\n\n if (!config.compatibility?.allowLocalizedWithinLocalized && parentIsLocalized) {\n shouldDisableLocalized = true\n }\n\n if (shouldDisableLocalized) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n const defaultValidate = validations[field.type]\n if (defaultValidate) {\n field.validate = (val, options) => defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = (): true => true\n }\n }\n\n if (typeof field.virtual === 'undefined') {\n field.virtual = false\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n const sanitizeRichText = async (_config: SanitizedConfig) => {\n if (!field.editor) {\n if (_config.editor && !requireFieldLevelRichTextEditor) {\n // config.editor should be sanitized at this point\n field.editor = _config.editor\n } else {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n }\n\n if (typeof field.editor === 'function') {\n field.editor = await field.editor({\n config: _config,\n isRoot: requireFieldLevelRichTextEditor,\n parentIsLocalized: parentIsLocalized || field.localized,\n })\n }\n\n if (field.editor.i18n && Object.keys(field.editor.i18n).length >= 0) {\n config.i18n.translations = deepMergeSimple(config.i18n.translations, field.editor.i18n)\n }\n }\n if (richTextSanitizationPromises) {\n richTextSanitizationPromises.push(sanitizeRichText)\n } else {\n await sanitizeRichText(config as unknown as SanitizedConfig)\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n for (const block of field.blocks) {\n if (block._sanitized === true) {\n continue\n }\n block._sanitized = true\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n block.fields = await sanitizeFields({\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n parentIsLocalized: parentIsLocalized || field.localized,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n field.fields = await sanitizeFields({\n config,\n existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames,\n fields: field.fields,\n joinPath: fieldAffectsData(field)\n ? `${joinPath ? joinPath + '.' : ''}${field.name}`\n : joinPath,\n joins,\n parentIsLocalized: parentIsLocalized || field.localized,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n for (let j = 0; j < field.tabs.length; j++) {\n const tab = field.tabs[j]\n if (tabHasName(tab) && typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n\n tab.fields = await sanitizeFields({\n config,\n existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames,\n fields: tab.fields,\n joinPath: tabHasName(tab) ? `${joinPath ? joinPath + '.' : ''}${tab.name}` : joinPath,\n joins,\n parentIsLocalized: parentIsLocalized || (tabHasName(tab) && tab.localized),\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n field.tabs[j] = tab\n }\n }\n\n if (field.type === 'ui' && typeof field.admin.disableBulkEdit === 'undefined') {\n field.admin.disableBulkEdit = true\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n fields[i] = field\n }\n\n return fields\n}\n"],"names":["deepMergeSimple","DuplicateFieldName","InvalidFieldName","InvalidFieldRelationship","MissingEditorProp","MissingFieldType","formatLabels","toWords","baseBlockFields","baseIDField","setDefaultBeforeDuplicate","validations","sanitizeJoinField","fieldAffectsData","tabHasName","sanitizeFields","config","existingFieldNames","Set","fields","joinPath","joins","parentIsLocalized","requireFieldLevelRichTextEditor","richTextSanitizationPromises","validRelationships","i","length","field","_sanitized","type","name","includes","label","defaultValue","required","relationships","Array","isArray","relationTo","forEach","relationship","min","minRows","console","warn","max","maxRows","admin","isSortable","push","labels","has","add","localized","shouldDisableLocalized","localization","compatibility","allowLocalizedWithinLocalized","validate","defaultValidate","val","options","virtual","hooks","access","sanitizeRichText","_config","editor","isRoot","i18n","Object","keys","translations","blocks","block","concat","slug","j","tabs","tab","disableBulkEdit"],"mappings":"AAAA,SAASA,eAAe,QAAQ,qCAAoC;AAMpE,SACEC,kBAAkB,EAClBC,gBAAgB,EAChBC,wBAAwB,EACxBC,iBAAiB,EACjBC,gBAAgB,QACX,wBAAuB;AAC9B,SAASC,YAAY,EAAEC,OAAO,QAAQ,kCAAiC;AACvE,SAASC,eAAe,QAAQ,mCAAkC;AAClE,SAASC,WAAW,QAAQ,+BAA8B;AAC1D,SAASC,yBAAyB,QAAQ,kCAAiC;AAC3E,OAAOC,iBAAiB,oBAAmB;AAC3C,SAASC,iBAAiB,QAAQ,yBAAwB;AAC1D,SAASC,gBAAgB,EAAEC,UAAU,QAAQ,aAAY;AAgCzD,OAAO,MAAMC,iBAAiB,OAAO,EACnCC,MAAM,EACNC,qBAAqB,IAAIC,KAAK,EAC9BC,MAAM,EACNC,WAAW,EAAE,EACbC,KAAK,EACLC,iBAAiB,EACjBC,kCAAkC,KAAK,EACvCC,4BAA4B,EAC5BC,kBAAkB,EACb;IACL,IAAI,CAACN,QAAQ;QACX,OAAO,EAAE;IACX;IAEA,IAAK,IAAIO,IAAI,GAAGA,IAAIP,OAAOQ,MAAM,EAAED,IAAK;QACtC,MAAME,QAAQT,MAAM,CAACO,EAAE;QAEvB,IAAI,gBAAgBE,SAASA,MAAMC,UAAU,KAAK,MAAM;YACtD;QACF;QAEA,IAAI,CAACD,MAAME,IAAI,EAAE;YACf,MAAM,IAAIzB,iBAAiBuB;QAC7B;QAEA,8DAA8D;QAC9D,IAAIf,iBAAiBe,UAAUA,MAAMG,IAAI,CAACC,QAAQ,CAAC,MAAM;YACvD,MAAM,IAAI9B,iBAAiB0B,OAAOA,MAAMG,IAAI;QAC9C;QAEA,aAAa;QACb,IACE,UAAUH,SACVA,MAAMG,IAAI,IACV,OAAOH,MAAMK,KAAK,KAAK,YACvB,OAAOL,MAAMK,KAAK,KAAK,YACvB,OAAOL,MAAMK,KAAK,KAAK,cACvBL,MAAMK,KAAK,KAAK,OAChB;YACAL,MAAMK,KAAK,GAAG1B,QAAQqB,MAAMG,IAAI;QAClC;QAEA,IACEH,MAAME,IAAI,KAAK,cACf,OAAOF,MAAMM,YAAY,KAAK,eAC9BN,MAAMO,QAAQ,KAAK,MACnB;YACAP,MAAMM,YAAY,GAAG;QACvB;QAEA,IAAIN,MAAME,IAAI,KAAK,QAAQ;YACzBlB,kBAAkB;gBAAEI;gBAAQY;gBAAOR;gBAAUC;YAAM;QACrD;QAEA,IAAIO,MAAME,IAAI,KAAK,kBAAkBF,MAAME,IAAI,KAAK,UAAU;YAC5D,IAAIL,oBAAoB;gBACtB,MAAMW,gBAAgBC,MAAMC,OAAO,CAACV,MAAMW,UAAU,IAChDX,MAAMW,UAAU,GAChB;oBAACX,MAAMW,UAAU;iBAAC;gBACtBH,cAAcI,OAAO,CAAC,CAACC;oBACrB,IAAI,CAAChB,mBAAmBO,QAAQ,CAACS,eAAe;wBAC9C,MAAM,IAAItC,yBAAyByB,OAAOa;oBAC5C;gBACF;YACF;YAEA,IAAIb,MAAMc,GAAG,IAAI,CAACd,MAAMe,OAAO,EAAE;gBAC/BC,QAAQC,IAAI,CACV,CAAC,wEAAwE,EAAEjB,MAAMG,IAAI,CAAC,wEAAwE,CAAC;YAEnK;YACA,IAAIH,MAAMkB,GAAG,IAAI,CAAClB,MAAMmB,OAAO,EAAE;gBAC/BH,QAAQC,IAAI,CACV,CAAC,wEAAwE,EAAEjB,MAAMG,IAAI,CAAC,wEAAwE,CAAC;YAEnK;YACAH,MAAMe,OAAO,GAAGf,MAAMe,OAAO,IAAIf,MAAMc,GAAG;YAC1Cd,MAAMmB,OAAO,GAAGnB,MAAMmB,OAAO,IAAInB,MAAMkB,GAAG;QAC5C;QAEA,IAAIlB,MAAME,IAAI,KAAK,UAAU;YAC3B,IAAI,CAACF,MAAMoB,KAAK,IAAI,CAAE,CAAA,gBAAgBpB,MAAMoB,KAAK,AAAD,GAAI;gBAClDpB,MAAMoB,KAAK,GAAG;oBACZC,YAAY;oBACZ,GAAGrB,MAAMoB,KAAK;gBAChB;YACF;QACF;QAEA,IAAIpB,MAAME,IAAI,KAAK,WAAWF,MAAMT,MAAM,EAAE;YAC1CS,MAAMT,MAAM,CAAC+B,IAAI,CAACzC;QACpB;QAEA,IAAI,AAACmB,CAAAA,MAAME,IAAI,KAAK,YAAYF,MAAME,IAAI,KAAK,OAAM,KAAMF,MAAMK,KAAK,EAAE;YACtEL,MAAMuB,MAAM,GAAGvB,MAAMuB,MAAM,IAAI7C,aAAasB,MAAMG,IAAI;QACxD;QAEA,IAAIlB,iBAAiBe,QAAQ;YAC3B,IAAIX,mBAAmBmC,GAAG,CAACxB,MAAMG,IAAI,GAAG;gBACtC,MAAM,IAAI9B,mBAAmB2B,MAAMG,IAAI;YACzC,OAAO,IAAI,CAAC;gBAAC;gBAAa;aAAK,CAACC,QAAQ,CAACJ,MAAMG,IAAI,GAAG;gBACpDd,mBAAmBoC,GAAG,CAACzB,MAAMG,IAAI;YACnC;YAEA,IAAI,OAAOH,MAAM0B,SAAS,KAAK,aAAa;gBAC1C,IAAIC,yBAAyB,CAACvC,OAAOwC,YAAY;gBAEjD,IAAI,CAACxC,OAAOyC,aAAa,EAAEC,iCAAiCpC,mBAAmB;oBAC7EiC,yBAAyB;gBAC3B;gBAEA,IAAIA,wBAAwB;oBAC1B,OAAO3B,MAAM0B,SAAS;gBACxB;YACF;YAEA,IAAI,OAAO1B,MAAM+B,QAAQ,KAAK,aAAa;gBACzC,MAAMC,kBAAkBjD,WAAW,CAACiB,MAAME,IAAI,CAAC;gBAC/C,IAAI8B,iBAAiB;oBACnBhC,MAAM+B,QAAQ,GAAG,CAACE,KAAKC,UAAYF,gBAAgBC,KAAK;4BAAE,GAAGjC,KAAK;4BAAE,GAAGkC,OAAO;wBAAC;gBACjF,OAAO;oBACLlC,MAAM+B,QAAQ,GAAG,IAAY;gBAC/B;YACF;YAEA,IAAI,OAAO/B,MAAMmC,OAAO,KAAK,aAAa;gBACxCnC,MAAMmC,OAAO,GAAG;YAClB;YAEA,IAAI,CAACnC,MAAMoC,KAAK,EAAE;gBAChBpC,MAAMoC,KAAK,GAAG,CAAC;YACjB;YACA,IAAI,CAACpC,MAAMqC,MAAM,EAAE;gBACjBrC,MAAMqC,MAAM,GAAG,CAAC;YAClB;YAEAvD,0BAA0BkB;QAC5B;QAEA,IAAI,CAACA,MAAMoB,KAAK,EAAE;YAChBpB,MAAMoB,KAAK,GAAG,CAAC;QACjB;QAEA,kDAAkD;QAClD,IAAIpB,MAAME,IAAI,KAAK,YAAY;YAC7B,MAAMoC,mBAAmB,OAAOC;gBAC9B,IAAI,CAACvC,MAAMwC,MAAM,EAAE;oBACjB,IAAID,QAAQC,MAAM,IAAI,CAAC7C,iCAAiC;wBACtD,kDAAkD;wBAClDK,MAAMwC,MAAM,GAAGD,QAAQC,MAAM;oBAC/B,OAAO;wBACL,MAAM,IAAIhE,kBAAkBwB,OAAO,8HAA8H;;oBACnK;gBACF;gBAEA,IAAI,OAAOA,MAAMwC,MAAM,KAAK,YAAY;oBACtCxC,MAAMwC,MAAM,GAAG,MAAMxC,MAAMwC,MAAM,CAAC;wBAChCpD,QAAQmD;wBACRE,QAAQ9C;wBACRD,mBAAmBA,qBAAqBM,MAAM0B,SAAS;oBACzD;gBACF;gBAEA,IAAI1B,MAAMwC,MAAM,CAACE,IAAI,IAAIC,OAAOC,IAAI,CAAC5C,MAAMwC,MAAM,CAACE,IAAI,EAAE3C,MAAM,IAAI,GAAG;oBACnEX,OAAOsD,IAAI,CAACG,YAAY,GAAGzE,gBAAgBgB,OAAOsD,IAAI,CAACG,YAAY,EAAE7C,MAAMwC,MAAM,CAACE,IAAI;gBACxF;YACF;YACA,IAAI9C,8BAA8B;gBAChCA,6BAA6B0B,IAAI,CAACgB;YACpC,OAAO;gBACL,MAAMA,iBAAiBlD;YACzB;QACF;QAEA,IAAIY,MAAME,IAAI,KAAK,YAAYF,MAAM8C,MAAM,EAAE;YAC3C,KAAK,MAAMC,SAAS/C,MAAM8C,MAAM,CAAE;gBAChC,IAAIC,MAAM9C,UAAU,KAAK,MAAM;oBAC7B;gBACF;gBACA8C,MAAM9C,UAAU,GAAG;gBACnB8C,MAAMxD,MAAM,GAAGwD,MAAMxD,MAAM,CAACyD,MAAM,CAACpE;gBACnCmE,MAAMxB,MAAM,GAAG,CAACwB,MAAMxB,MAAM,GAAG7C,aAAaqE,MAAME,IAAI,IAAIF,MAAMxB,MAAM;gBACtEwB,MAAMxD,MAAM,GAAG,MAAMJ,eAAe;oBAClCC;oBACAC,oBAAoB,IAAIC;oBACxBC,QAAQwD,MAAMxD,MAAM;oBACpBG,mBAAmBA,qBAAqBM,MAAM0B,SAAS;oBACvD/B;oBACAC;oBACAC;gBACF;YACF;QACF;QAEA,IAAI,YAAYG,SAASA,MAAMT,MAAM,EAAE;YACrCS,MAAMT,MAAM,GAAG,MAAMJ,eAAe;gBAClCC;gBACAC,oBAAoBJ,iBAAiBe,SAAS,IAAIV,QAAQD;gBAC1DE,QAAQS,MAAMT,MAAM;gBACpBC,UAAUP,iBAAiBe,SACvB,CAAC,EAAER,WAAWA,WAAW,MAAM,GAAG,EAAEQ,MAAMG,IAAI,CAAC,CAAC,GAChDX;gBACJC;gBACAC,mBAAmBA,qBAAqBM,MAAM0B,SAAS;gBACvD/B;gBACAC;gBACAC;YACF;QACF;QAEA,IAAIG,MAAME,IAAI,KAAK,QAAQ;YACzB,IAAK,IAAIgD,IAAI,GAAGA,IAAIlD,MAAMmD,IAAI,CAACpD,MAAM,EAAEmD,IAAK;gBAC1C,MAAME,MAAMpD,MAAMmD,IAAI,CAACD,EAAE;gBACzB,IAAIhE,WAAWkE,QAAQ,OAAOA,IAAI/C,KAAK,KAAK,aAAa;oBACvD+C,IAAI/C,KAAK,GAAG1B,QAAQyE,IAAIjD,IAAI;gBAC9B;gBAEAiD,IAAI7D,MAAM,GAAG,MAAMJ,eAAe;oBAChCC;oBACAC,oBAAoBH,WAAWkE,OAAO,IAAI9D,QAAQD;oBAClDE,QAAQ6D,IAAI7D,MAAM;oBAClBC,UAAUN,WAAWkE,OAAO,CAAC,EAAE5D,WAAWA,WAAW,MAAM,GAAG,EAAE4D,IAAIjD,IAAI,CAAC,CAAC,GAAGX;oBAC7EC;oBACAC,mBAAmBA,qBAAsBR,WAAWkE,QAAQA,IAAI1B,SAAS;oBACzE/B;oBACAC;oBACAC;gBACF;gBACAG,MAAMmD,IAAI,CAACD,EAAE,GAAGE;YAClB;QACF;QAEA,IAAIpD,MAAME,IAAI,KAAK,QAAQ,OAAOF,MAAMoB,KAAK,CAACiC,eAAe,KAAK,aAAa;YAC7ErD,MAAMoB,KAAK,CAACiC,eAAe,GAAG;QAChC;QAEA,IAAI,gBAAgBrD,OAAO;YACzBA,MAAMC,UAAU,GAAG;QACrB;QAEAV,MAAM,CAACO,EAAE,GAAGE;IACd;IAEA,OAAOT;AACT,EAAC"}
@@ -1,10 +1,10 @@
1
1
  import type { SanitizedJoins } from '../../collections/config/types.js';
2
2
  import type { Config } from '../../config/types.js';
3
3
  import type { JoinField } from './types.js';
4
- export declare const sanitizeJoinField: ({ config, field, joins, schemaPath, }: {
4
+ export declare const sanitizeJoinField: ({ config, field, joinPath, joins, }: {
5
5
  config: Config;
6
6
  field: JoinField;
7
+ joinPath?: string;
7
8
  joins?: SanitizedJoins;
8
- schemaPath?: string;
9
9
  }) => void;
10
10
  //# sourceMappingURL=sanitizeJoinField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeJoinField.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitizeJoinField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAkC,MAAM,YAAY,CAAA;AAK3E,eAAO,MAAM,iBAAiB,0CAK3B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,SA2EA,CAAA"}
1
+ {"version":3,"file":"sanitizeJoinField.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitizeJoinField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAkC,MAAM,YAAY,CAAA;AAK3E,eAAO,MAAM,iBAAiB,wCAK3B;IACD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,SAAS,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,cAAc,CAAA;CACvB,SA2EA,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { APIError } from '../../errors/index.js';
2
2
  import { InvalidFieldJoin } from '../../errors/InvalidFieldJoin.js';
3
3
  import { traverseFields } from '../../utilities/traverseFields.js';
4
- export const sanitizeJoinField = ({ config, field, joins, schemaPath })=>{
4
+ export const sanitizeJoinField = ({ config, field, joinPath, joins })=>{
5
5
  // the `joins` arg is not passed for globals or when recursing on fields that do not allow a join field
6
6
  if (typeof joins === 'undefined') {
7
7
  throw new APIError('Join fields cannot be added to arrays, blocks or globals.');
@@ -11,7 +11,7 @@ export const sanitizeJoinField = ({ config, field, joins, schemaPath })=>{
11
11
  }
12
12
  const join = {
13
13
  field,
14
- schemaPath: `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}`,
14
+ joinPath: `${joinPath ? joinPath + '.' : ''}${field.name}`,
15
15
  targetField: undefined
16
16
  };
17
17
  const joinCollection = config.collections.find((collection)=>collection.slug === field.collection);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/sanitizeJoinField.ts"],"sourcesContent":["import type { SanitizedJoin, SanitizedJoins } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { JoinField, RelationshipField, UploadField } from './types.js'\n\nimport { APIError } from '../../errors/index.js'\nimport { InvalidFieldJoin } from '../../errors/InvalidFieldJoin.js'\nimport { traverseFields } from '../../utilities/traverseFields.js'\nexport const sanitizeJoinField = ({\n config,\n field,\n joins,\n schemaPath,\n}: {\n config: Config\n field: JoinField\n joins?: SanitizedJoins\n schemaPath?: string\n}) => {\n // the `joins` arg is not passed for globals or when recursing on fields that do not allow a join field\n if (typeof joins === 'undefined') {\n throw new APIError('Join fields cannot be added to arrays, blocks or globals.')\n }\n if (!field.maxDepth) {\n field.maxDepth = 1\n }\n const join: SanitizedJoin = {\n field,\n schemaPath: `${schemaPath || ''}${schemaPath ? '.' : ''}${field.name}`,\n targetField: undefined,\n }\n const joinCollection = config.collections.find(\n (collection) => collection.slug === field.collection,\n )\n if (!joinCollection) {\n throw new InvalidFieldJoin(field)\n }\n let joinRelationship: RelationshipField | UploadField\n\n const pathSegments = field.on.split('.') // Split the schema path into segments\n let currentSegmentIndex = 0\n\n // Traverse fields and match based on the schema path\n traverseFields({\n callback: ({ field, next }) => {\n if (!('name' in field) || !field.name) {\n return\n }\n const currentSegment = pathSegments[currentSegmentIndex]\n // match field on path segments\n if ('name' in field && field.name === currentSegment) {\n // Check if this is the last segment in the path\n if (\n (currentSegmentIndex === pathSegments.length - 1 &&\n 'type' in field &&\n field.type === 'relationship') ||\n field.type === 'upload'\n ) {\n joinRelationship = field // Return the matched field\n next()\n return true\n } else {\n // Move to the next path segment and continue traversal\n currentSegmentIndex++\n }\n } else {\n // skip fields in non-matching path segments\n next()\n return\n }\n },\n fields: joinCollection.fields,\n })\n\n if (!joinRelationship) {\n throw new InvalidFieldJoin(join.field)\n }\n if (Array.isArray(joinRelationship.relationTo)) {\n throw new APIError('Join fields cannot be used with polymorphic relationships.')\n }\n\n join.targetField = joinRelationship\n\n // override the join field localized property to use whatever the relationship field has\n field.localized = joinRelationship.localized\n // override the join field hasMany property to use whatever the relationship field has\n field.hasMany = joinRelationship.hasMany\n\n if (!joins[field.collection]) {\n joins[field.collection] = [join]\n } else {\n joins[field.collection].push(join)\n }\n}\n"],"names":["APIError","InvalidFieldJoin","traverseFields","sanitizeJoinField","config","field","joins","schemaPath","maxDepth","join","name","targetField","undefined","joinCollection","collections","find","collection","slug","joinRelationship","pathSegments","on","split","currentSegmentIndex","callback","next","currentSegment","length","type","fields","Array","isArray","relationTo","localized","hasMany","push"],"mappings":"AAIA,SAASA,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,cAAc,QAAQ,oCAAmC;AAClE,OAAO,MAAMC,oBAAoB,CAAC,EAChCC,MAAM,EACNC,KAAK,EACLC,KAAK,EACLC,UAAU,EAMX;IACC,uGAAuG;IACvG,IAAI,OAAOD,UAAU,aAAa;QAChC,MAAM,IAAIN,SAAS;IACrB;IACA,IAAI,CAACK,MAAMG,QAAQ,EAAE;QACnBH,MAAMG,QAAQ,GAAG;IACnB;IACA,MAAMC,OAAsB;QAC1BJ;QACAE,YAAY,CAAC,EAAEA,cAAc,GAAG,EAAEA,aAAa,MAAM,GAAG,EAAEF,MAAMK,IAAI,CAAC,CAAC;QACtEC,aAAaC;IACf;IACA,MAAMC,iBAAiBT,OAAOU,WAAW,CAACC,IAAI,CAC5C,CAACC,aAAeA,WAAWC,IAAI,KAAKZ,MAAMW,UAAU;IAEtD,IAAI,CAACH,gBAAgB;QACnB,MAAM,IAAIZ,iBAAiBI;IAC7B;IACA,IAAIa;IAEJ,MAAMC,eAAed,MAAMe,EAAE,CAACC,KAAK,CAAC,KAAK,sCAAsC;;IAC/E,IAAIC,sBAAsB;IAE1B,qDAAqD;IACrDpB,eAAe;QACbqB,UAAU,CAAC,EAAElB,KAAK,EAAEmB,IAAI,EAAE;YACxB,IAAI,CAAE,CAAA,UAAUnB,KAAI,KAAM,CAACA,MAAMK,IAAI,EAAE;gBACrC;YACF;YACA,MAAMe,iBAAiBN,YAAY,CAACG,oBAAoB;YACxD,+BAA+B;YAC/B,IAAI,UAAUjB,SAASA,MAAMK,IAAI,KAAKe,gBAAgB;gBACpD,gDAAgD;gBAChD,IACE,AAACH,wBAAwBH,aAAaO,MAAM,GAAG,KAC7C,UAAUrB,SACVA,MAAMsB,IAAI,KAAK,kBACjBtB,MAAMsB,IAAI,KAAK,UACf;oBACAT,mBAAmBb,MAAM,2BAA2B;;oBACpDmB;oBACA,OAAO;gBACT,OAAO;oBACL,uDAAuD;oBACvDF;gBACF;YACF,OAAO;gBACL,4CAA4C;gBAC5CE;gBACA;YACF;QACF;QACAI,QAAQf,eAAee,MAAM;IAC/B;IAEA,IAAI,CAACV,kBAAkB;QACrB,MAAM,IAAIjB,iBAAiBQ,KAAKJ,KAAK;IACvC;IACA,IAAIwB,MAAMC,OAAO,CAACZ,iBAAiBa,UAAU,GAAG;QAC9C,MAAM,IAAI/B,SAAS;IACrB;IAEAS,KAAKE,WAAW,GAAGO;IAEnB,wFAAwF;IACxFb,MAAM2B,SAAS,GAAGd,iBAAiBc,SAAS;IAC5C,sFAAsF;IACtF3B,MAAM4B,OAAO,GAAGf,iBAAiBe,OAAO;IAExC,IAAI,CAAC3B,KAAK,CAACD,MAAMW,UAAU,CAAC,EAAE;QAC5BV,KAAK,CAACD,MAAMW,UAAU,CAAC,GAAG;YAACP;SAAK;IAClC,OAAO;QACLH,KAAK,CAACD,MAAMW,UAAU,CAAC,CAACkB,IAAI,CAACzB;IAC/B;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/fields/config/sanitizeJoinField.ts"],"sourcesContent":["import type { SanitizedJoin, SanitizedJoins } from '../../collections/config/types.js'\nimport type { Config } from '../../config/types.js'\nimport type { JoinField, RelationshipField, UploadField } from './types.js'\n\nimport { APIError } from '../../errors/index.js'\nimport { InvalidFieldJoin } from '../../errors/InvalidFieldJoin.js'\nimport { traverseFields } from '../../utilities/traverseFields.js'\nexport const sanitizeJoinField = ({\n config,\n field,\n joinPath,\n joins,\n}: {\n config: Config\n field: JoinField\n joinPath?: string\n joins?: SanitizedJoins\n}) => {\n // the `joins` arg is not passed for globals or when recursing on fields that do not allow a join field\n if (typeof joins === 'undefined') {\n throw new APIError('Join fields cannot be added to arrays, blocks or globals.')\n }\n if (!field.maxDepth) {\n field.maxDepth = 1\n }\n const join: SanitizedJoin = {\n field,\n joinPath: `${joinPath ? joinPath + '.' : ''}${field.name}`,\n targetField: undefined,\n }\n const joinCollection = config.collections.find(\n (collection) => collection.slug === field.collection,\n )\n if (!joinCollection) {\n throw new InvalidFieldJoin(field)\n }\n let joinRelationship: RelationshipField | UploadField\n\n const pathSegments = field.on.split('.') // Split the schema path into segments\n let currentSegmentIndex = 0\n\n // Traverse fields and match based on the schema path\n traverseFields({\n callback: ({ field, next }) => {\n if (!('name' in field) || !field.name) {\n return\n }\n const currentSegment = pathSegments[currentSegmentIndex]\n // match field on path segments\n if ('name' in field && field.name === currentSegment) {\n // Check if this is the last segment in the path\n if (\n (currentSegmentIndex === pathSegments.length - 1 &&\n 'type' in field &&\n field.type === 'relationship') ||\n field.type === 'upload'\n ) {\n joinRelationship = field // Return the matched field\n next()\n return true\n } else {\n // Move to the next path segment and continue traversal\n currentSegmentIndex++\n }\n } else {\n // skip fields in non-matching path segments\n next()\n return\n }\n },\n fields: joinCollection.fields,\n })\n\n if (!joinRelationship) {\n throw new InvalidFieldJoin(join.field)\n }\n if (Array.isArray(joinRelationship.relationTo)) {\n throw new APIError('Join fields cannot be used with polymorphic relationships.')\n }\n\n join.targetField = joinRelationship\n\n // override the join field localized property to use whatever the relationship field has\n field.localized = joinRelationship.localized\n // override the join field hasMany property to use whatever the relationship field has\n field.hasMany = joinRelationship.hasMany\n\n if (!joins[field.collection]) {\n joins[field.collection] = [join]\n } else {\n joins[field.collection].push(join)\n }\n}\n"],"names":["APIError","InvalidFieldJoin","traverseFields","sanitizeJoinField","config","field","joinPath","joins","maxDepth","join","name","targetField","undefined","joinCollection","collections","find","collection","slug","joinRelationship","pathSegments","on","split","currentSegmentIndex","callback","next","currentSegment","length","type","fields","Array","isArray","relationTo","localized","hasMany","push"],"mappings":"AAIA,SAASA,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,cAAc,QAAQ,oCAAmC;AAClE,OAAO,MAAMC,oBAAoB,CAAC,EAChCC,MAAM,EACNC,KAAK,EACLC,QAAQ,EACRC,KAAK,EAMN;IACC,uGAAuG;IACvG,IAAI,OAAOA,UAAU,aAAa;QAChC,MAAM,IAAIP,SAAS;IACrB;IACA,IAAI,CAACK,MAAMG,QAAQ,EAAE;QACnBH,MAAMG,QAAQ,GAAG;IACnB;IACA,MAAMC,OAAsB;QAC1BJ;QACAC,UAAU,CAAC,EAAEA,WAAWA,WAAW,MAAM,GAAG,EAAED,MAAMK,IAAI,CAAC,CAAC;QAC1DC,aAAaC;IACf;IACA,MAAMC,iBAAiBT,OAAOU,WAAW,CAACC,IAAI,CAC5C,CAACC,aAAeA,WAAWC,IAAI,KAAKZ,MAAMW,UAAU;IAEtD,IAAI,CAACH,gBAAgB;QACnB,MAAM,IAAIZ,iBAAiBI;IAC7B;IACA,IAAIa;IAEJ,MAAMC,eAAed,MAAMe,EAAE,CAACC,KAAK,CAAC,KAAK,sCAAsC;;IAC/E,IAAIC,sBAAsB;IAE1B,qDAAqD;IACrDpB,eAAe;QACbqB,UAAU,CAAC,EAAElB,KAAK,EAAEmB,IAAI,EAAE;YACxB,IAAI,CAAE,CAAA,UAAUnB,KAAI,KAAM,CAACA,MAAMK,IAAI,EAAE;gBACrC;YACF;YACA,MAAMe,iBAAiBN,YAAY,CAACG,oBAAoB;YACxD,+BAA+B;YAC/B,IAAI,UAAUjB,SAASA,MAAMK,IAAI,KAAKe,gBAAgB;gBACpD,gDAAgD;gBAChD,IACE,AAACH,wBAAwBH,aAAaO,MAAM,GAAG,KAC7C,UAAUrB,SACVA,MAAMsB,IAAI,KAAK,kBACjBtB,MAAMsB,IAAI,KAAK,UACf;oBACAT,mBAAmBb,MAAM,2BAA2B;;oBACpDmB;oBACA,OAAO;gBACT,OAAO;oBACL,uDAAuD;oBACvDF;gBACF;YACF,OAAO;gBACL,4CAA4C;gBAC5CE;gBACA;YACF;QACF;QACAI,QAAQf,eAAee,MAAM;IAC/B;IAEA,IAAI,CAACV,kBAAkB;QACrB,MAAM,IAAIjB,iBAAiBQ,KAAKJ,KAAK;IACvC;IACA,IAAIwB,MAAMC,OAAO,CAACZ,iBAAiBa,UAAU,GAAG;QAC9C,MAAM,IAAI/B,SAAS;IACrB;IAEAS,KAAKE,WAAW,GAAGO;IAEnB,wFAAwF;IACxFb,MAAM2B,SAAS,GAAGd,iBAAiBc,SAAS;IAC5C,sFAAsF;IACtF3B,MAAM4B,OAAO,GAAGf,iBAAiBe,OAAO;IAExC,IAAI,CAAC1B,KAAK,CAACF,MAAMW,UAAU,CAAC,EAAE;QAC5BT,KAAK,CAACF,MAAMW,UAAU,CAAC,GAAG;YAACP;SAAK;IAClC,OAAO;QACLF,KAAK,CAACF,MAAMW,UAAU,CAAC,CAACkB,IAAI,CAACzB;IAC/B;AACF,EAAC"}