payload 4.0.0-internal.293e026 → 4.0.0-internal.2fddfc0

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 (205) hide show
  1. package/dist/admin/fields/Row.d.ts +2 -2
  2. package/dist/admin/fields/Row.d.ts.map +1 -1
  3. package/dist/admin/fields/Row.js.map +1 -1
  4. package/dist/admin/forms/Description.d.ts +2 -2
  5. package/dist/admin/forms/Description.d.ts.map +1 -1
  6. package/dist/admin/forms/Description.js.map +1 -1
  7. package/dist/admin/forms/Field.d.ts +1 -3
  8. package/dist/admin/forms/Field.d.ts.map +1 -1
  9. package/dist/admin/forms/Field.js.map +1 -1
  10. package/dist/admin/types.d.ts +1 -1
  11. package/dist/admin/types.d.ts.map +1 -1
  12. package/dist/admin/types.js.map +1 -1
  13. package/dist/admin/views/document.d.ts +0 -4
  14. package/dist/admin/views/document.d.ts.map +1 -1
  15. package/dist/admin/views/document.js.map +1 -1
  16. package/dist/admin/views/list.d.ts +5 -0
  17. package/dist/admin/views/list.d.ts.map +1 -1
  18. package/dist/admin/views/list.js.map +1 -1
  19. package/dist/auth/baseFields/apiKey.d.ts +10 -2
  20. package/dist/auth/baseFields/apiKey.d.ts.map +1 -1
  21. package/dist/auth/baseFields/apiKey.js +35 -24
  22. package/dist/auth/baseFields/apiKey.js.map +1 -1
  23. package/dist/auth/getAuthFields.js +2 -2
  24. package/dist/auth/getAuthFields.js.map +1 -1
  25. package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
  26. package/dist/bin/generateImportMap/iterateCollections.js +1 -0
  27. package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
  28. package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
  29. package/dist/bin/generateImportMap/iterateConfig.js +12 -0
  30. package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
  31. package/dist/collections/config/sanitize.d.ts.map +1 -1
  32. package/dist/collections/config/sanitize.js +1 -11
  33. package/dist/collections/config/sanitize.js.map +1 -1
  34. package/dist/collections/config/types.d.ts +1 -0
  35. package/dist/collections/config/types.d.ts.map +1 -1
  36. package/dist/collections/config/types.js.map +1 -1
  37. package/dist/collections/endpoints/create.d.ts.map +1 -1
  38. package/dist/collections/endpoints/create.js +0 -2
  39. package/dist/collections/endpoints/create.js.map +1 -1
  40. package/dist/collections/endpoints/updateByID.d.ts.map +1 -1
  41. package/dist/collections/endpoints/updateByID.js +1 -2
  42. package/dist/collections/endpoints/updateByID.js.map +1 -1
  43. package/dist/collections/operations/count.d.ts.map +1 -1
  44. package/dist/collections/operations/count.js +1 -0
  45. package/dist/collections/operations/count.js.map +1 -1
  46. package/dist/collections/operations/create.d.ts +0 -1
  47. package/dist/collections/operations/create.d.ts.map +1 -1
  48. package/dist/collections/operations/create.js +14 -6
  49. package/dist/collections/operations/create.js.map +1 -1
  50. package/dist/collections/operations/local/update.d.ts +4 -8
  51. package/dist/collections/operations/local/update.d.ts.map +1 -1
  52. package/dist/collections/operations/local/update.js +1 -2
  53. package/dist/collections/operations/local/update.js.map +1 -1
  54. package/dist/collections/operations/update.d.ts +0 -1
  55. package/dist/collections/operations/update.d.ts.map +1 -1
  56. package/dist/collections/operations/update.js +8 -4
  57. package/dist/collections/operations/update.js.map +1 -1
  58. package/dist/collections/operations/updateByID.d.ts +0 -1
  59. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  60. package/dist/collections/operations/updateByID.js +1 -5
  61. package/dist/collections/operations/updateByID.js.map +1 -1
  62. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts +9 -0
  63. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts.map +1 -0
  64. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js +170 -0
  65. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js.map +1 -0
  66. package/dist/collections/operations/utilities/update.d.ts +1 -2
  67. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  68. package/dist/collections/operations/utilities/update.js +48 -57
  69. package/dist/collections/operations/utilities/update.js.map +1 -1
  70. package/dist/config/orderable/index.d.ts.map +1 -1
  71. package/dist/config/orderable/index.js +23 -0
  72. package/dist/config/orderable/index.js.map +1 -1
  73. package/dist/config/types.d.ts +14 -17
  74. package/dist/config/types.d.ts.map +1 -1
  75. package/dist/config/types.js +1 -0
  76. package/dist/config/types.js.map +1 -1
  77. package/dist/errors/ValidationError.d.ts +1 -0
  78. package/dist/errors/ValidationError.d.ts.map +1 -1
  79. package/dist/errors/ValidationError.js.map +1 -1
  80. package/dist/exports/migrations.d.ts +5 -13
  81. package/dist/exports/migrations.d.ts.map +1 -1
  82. package/dist/exports/migrations.js +5 -13
  83. package/dist/exports/migrations.js.map +1 -1
  84. package/dist/exports/shared.d.ts +1 -1
  85. package/dist/exports/shared.d.ts.map +1 -1
  86. package/dist/exports/shared.js +1 -1
  87. package/dist/exports/shared.js.map +1 -1
  88. package/dist/fields/config/client.d.ts.map +1 -1
  89. package/dist/fields/config/client.js +10 -3
  90. package/dist/fields/config/client.js.map +1 -1
  91. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  92. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  93. package/dist/globals/config/sanitize.d.ts.map +1 -1
  94. package/dist/globals/config/sanitize.js +1 -6
  95. package/dist/globals/config/sanitize.js.map +1 -1
  96. package/dist/globals/endpoints/update.d.ts.map +1 -1
  97. package/dist/globals/endpoints/update.js +0 -2
  98. package/dist/globals/endpoints/update.js.map +1 -1
  99. package/dist/globals/operations/local/update.d.ts +4 -6
  100. package/dist/globals/operations/local/update.d.ts.map +1 -1
  101. package/dist/globals/operations/local/update.js +1 -2
  102. package/dist/globals/operations/local/update.js.map +1 -1
  103. package/dist/globals/operations/update.d.ts +0 -1
  104. package/dist/globals/operations/update.d.ts.map +1 -1
  105. package/dist/globals/operations/update.js +52 -58
  106. package/dist/globals/operations/update.js.map +1 -1
  107. package/dist/index.bundled.d.ts +123 -107
  108. package/dist/index.d.ts +5 -3
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +3 -2
  111. package/dist/index.js.map +1 -1
  112. package/dist/query-presets/config.d.ts.map +1 -1
  113. package/dist/query-presets/config.js +73 -34
  114. package/dist/query-presets/config.js.map +1 -1
  115. package/dist/query-presets/constraints.d.ts.map +1 -1
  116. package/dist/query-presets/constraints.js +2 -1
  117. package/dist/query-presets/constraints.js.map +1 -1
  118. package/dist/utilities/deepCopyObject.d.ts.map +1 -1
  119. package/dist/utilities/deepCopyObject.js +8 -0
  120. package/dist/utilities/deepCopyObject.js.map +1 -1
  121. package/dist/utilities/getFieldByPath.d.ts.map +1 -1
  122. package/dist/utilities/getFieldByPath.js.map +1 -1
  123. package/dist/utilities/getVersionsConfig.js.map +1 -1
  124. package/dist/utilities/mergeLocalizedData.d.ts +14 -4
  125. package/dist/utilities/mergeLocalizedData.d.ts.map +1 -1
  126. package/dist/utilities/mergeLocalizedData.js +49 -34
  127. package/dist/utilities/mergeLocalizedData.js.map +1 -1
  128. package/dist/utilities/mergeLocalizedData.spec.js +23 -23
  129. package/dist/utilities/mergeLocalizedData.spec.js.map +1 -1
  130. package/dist/utilities/parseParams/index.d.ts +2 -5
  131. package/dist/utilities/parseParams/index.d.ts.map +1 -1
  132. package/dist/utilities/parseParams/index.js.map +1 -1
  133. package/dist/utilities/parseParams/index.spec.js +0 -9
  134. package/dist/utilities/parseParams/index.spec.js.map +1 -1
  135. package/dist/utilities/traverseFields.d.ts.map +1 -1
  136. package/dist/utilities/traverseFields.js.map +1 -1
  137. package/dist/versions/baseFields.d.ts +1 -2
  138. package/dist/versions/baseFields.d.ts.map +1 -1
  139. package/dist/versions/baseFields.js +0 -13
  140. package/dist/versions/baseFields.js.map +1 -1
  141. package/dist/versions/buildCollectionFields.d.ts.map +1 -1
  142. package/dist/versions/buildCollectionFields.js +0 -2
  143. package/dist/versions/buildCollectionFields.js.map +1 -1
  144. package/dist/versions/buildGlobalFields.d.ts.map +1 -1
  145. package/dist/versions/buildGlobalFields.js +0 -2
  146. package/dist/versions/buildGlobalFields.js.map +1 -1
  147. package/dist/versions/buildSingleLocalePublishData.d.ts +32 -0
  148. package/dist/versions/buildSingleLocalePublishData.d.ts.map +1 -0
  149. package/dist/versions/buildSingleLocalePublishData.js +37 -0
  150. package/dist/versions/buildSingleLocalePublishData.js.map +1 -0
  151. package/dist/versions/saveVersion.d.ts +0 -2
  152. package/dist/versions/saveVersion.d.ts.map +1 -1
  153. package/dist/versions/saveVersion.js +12 -17
  154. package/dist/versions/saveVersion.js.map +1 -1
  155. package/dist/versions/schedule/job.d.ts.map +1 -1
  156. package/dist/versions/schedule/job.js +2 -9
  157. package/dist/versions/schedule/job.js.map +1 -1
  158. package/dist/versions/types.d.ts +2 -15
  159. package/dist/versions/types.d.ts.map +1 -1
  160. package/dist/versions/types.js.map +1 -1
  161. package/package.json +2 -2
  162. package/dist/database/migrations/templates/localizeStatus.d.ts +0 -10
  163. package/dist/database/migrations/templates/localizeStatus.d.ts.map +0 -1
  164. package/dist/database/migrations/templates/localizeStatus.js +0 -54
  165. package/dist/database/migrations/templates/localizeStatus.js.map +0 -1
  166. package/dist/versions/migrations/localizeStatus/index.d.ts +0 -12
  167. package/dist/versions/migrations/localizeStatus/index.d.ts.map +0 -1
  168. package/dist/versions/migrations/localizeStatus/index.js +0 -33
  169. package/dist/versions/migrations/localizeStatus/index.js.map +0 -1
  170. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts +0 -9
  171. package/dist/versions/migrations/localizeStatus/mongo/down.d.ts.map +0 -1
  172. package/dist/versions/migrations/localizeStatus/mongo/down.js +0 -112
  173. package/dist/versions/migrations/localizeStatus/mongo/down.js.map +0 -1
  174. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts +0 -8
  175. package/dist/versions/migrations/localizeStatus/mongo/index.d.ts.map +0 -1
  176. package/dist/versions/migrations/localizeStatus/mongo/index.js +0 -8
  177. package/dist/versions/migrations/localizeStatus/mongo/index.js.map +0 -1
  178. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts +0 -9
  179. package/dist/versions/migrations/localizeStatus/mongo/up.d.ts.map +0 -1
  180. package/dist/versions/migrations/localizeStatus/mongo/up.js +0 -220
  181. package/dist/versions/migrations/localizeStatus/mongo/up.js.map +0 -1
  182. package/dist/versions/migrations/localizeStatus/sql/down.d.ts +0 -11
  183. package/dist/versions/migrations/localizeStatus/sql/down.d.ts.map +0 -1
  184. package/dist/versions/migrations/localizeStatus/sql/down.js +0 -213
  185. package/dist/versions/migrations/localizeStatus/sql/down.js.map +0 -1
  186. package/dist/versions/migrations/localizeStatus/sql/index.d.ts +0 -8
  187. package/dist/versions/migrations/localizeStatus/sql/index.d.ts.map +0 -1
  188. package/dist/versions/migrations/localizeStatus/sql/index.js +0 -8
  189. package/dist/versions/migrations/localizeStatus/sql/index.js.map +0 -1
  190. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts +0 -13
  191. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.d.ts.map +0 -1
  192. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js +0 -51
  193. package/dist/versions/migrations/localizeStatus/sql/migrateMainCollection.js.map +0 -1
  194. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts +0 -13
  195. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.d.ts.map +0 -1
  196. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js +0 -54
  197. package/dist/versions/migrations/localizeStatus/sql/migrateMainGlobal.js.map +0 -1
  198. package/dist/versions/migrations/localizeStatus/sql/up.d.ts +0 -11
  199. package/dist/versions/migrations/localizeStatus/sql/up.d.ts.map +0 -1
  200. package/dist/versions/migrations/localizeStatus/sql/up.js +0 -277
  201. package/dist/versions/migrations/localizeStatus/sql/up.js.map +0 -1
  202. package/dist/versions/saveSnapshot.d.ts +0 -18
  203. package/dist/versions/saveSnapshot.d.ts.map +0 -1
  204. package/dist/versions/saveSnapshot.js +0 -38
  205. package/dist/versions/saveSnapshot.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/mergeLocalizedData.spec.ts"],"sourcesContent":["import type { Field } from '../fields/config/types.js'\n\nimport { describe, expect, it } from 'vitest'\n\nimport { mergeLocalizedData } from './mergeLocalizedData.js'\n\ndescribe('mergeLocalizedData', () => {\n const selectedLocales = ['en']\n const configBlockReferences = []\n\n describe('simple fields', () => {\n it('should merge localized field values for selected locales', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'English Title',\n es: 'Spanish Title',\n de: 'German Title',\n },\n }\n\n const dataWithLocales = {\n title: {\n en: 'Updated English Title',\n es: 'Updated Spanish Title',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.title).toEqual({\n en: 'Updated English Title',\n es: 'Spanish Title',\n de: 'German Title',\n })\n })\n\n it('should keep doc value for non-localized fields', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: false,\n },\n ]\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales: {\n title: 'New Title',\n },\n docWithLocales: {\n title: 'Old Title',\n },\n fields,\n selectedLocales,\n })\n\n expect(result.title).toBe('New Title')\n\n const missingData = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales: {},\n docWithLocales: {\n title: 'Old Title',\n },\n fields,\n selectedLocales,\n })\n\n expect(missingData.title).toBe('Old Title')\n\n const updatedData = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales: {\n title: 'Updated Title',\n },\n docWithLocales: {},\n fields,\n selectedLocales,\n })\n\n expect(updatedData.title).toBe('Updated Title')\n })\n })\n\n describe('groups', () => {\n it('should merge localized group with locale keys at top level', () => {\n const fields: Field[] = [\n {\n name: 'meta',\n type: 'group',\n localized: true,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'description',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n meta: {\n en: {\n title: 'EN Title',\n description: 'EN Desc',\n },\n es: {\n title: 'ES Title',\n description: 'ES Desc',\n },\n },\n }\n\n const dataWithLocales = {\n meta: {\n en: {\n title: 'Updated EN Title',\n description: 'Updated EN Desc',\n },\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.meta).toEqual({\n en: {\n title: 'Updated EN Title',\n description: 'Updated EN Desc',\n },\n es: {\n title: 'ES Title',\n description: 'ES Desc',\n },\n })\n })\n\n it('should handle non-localized group with localized children', () => {\n const fields: Field[] = [\n {\n name: 'meta',\n type: 'group',\n localized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n {\n name: 'version',\n type: 'number',\n localized: false,\n },\n ],\n },\n ]\n\n const docWithLocales = {\n meta: {\n title: {\n en: 'EN Title',\n es: 'ES Title',\n },\n version: 1,\n },\n }\n\n const dataWithLocales = {\n meta: {\n title: {\n en: 'Updated EN Title',\n },\n version: 2,\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.meta).toEqual({\n title: {\n en: 'Updated EN Title',\n es: 'ES Title',\n },\n version: 2,\n })\n })\n })\n\n describe('arrays', () => {\n it('should merge localized array with locale keys at top level', () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n localized: true,\n fields: [\n {\n name: 'name',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n items: {\n en: [{ name: 'EN Item 1' }, { name: 'EN Item 2' }],\n es: [{ name: 'ES Item 1' }],\n },\n }\n\n const dataWithLocales = {\n items: {\n en: [{ name: 'Updated EN Item 1' }, { name: 'Updated EN Item 2' }],\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.items).toEqual({\n en: [{ name: 'Updated EN Item 1' }, { name: 'Updated EN Item 2' }],\n es: [{ name: 'ES Item 1' }],\n })\n })\n\n it('should handle non-localized array with localized children', () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n localized: false,\n fields: [\n {\n name: 'name',\n type: 'text',\n localized: true,\n },\n ],\n },\n ]\n\n const docWithLocales = {\n items: [\n {\n name: {\n en: 'EN Item 1',\n es: 'ES Item 1',\n },\n },\n {\n name: {\n en: 'EN Item 2',\n es: 'ES Item 2',\n },\n },\n ],\n }\n\n const dataWithLocales = {\n items: [\n {\n name: {\n en: 'Updated EN Item 1',\n },\n },\n {\n name: {\n en: 'Updated EN Item 2',\n },\n },\n ],\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.items).toEqual([\n {\n name: {\n en: 'Updated EN Item 1',\n es: 'ES Item 1',\n },\n },\n {\n name: {\n en: 'Updated EN Item 2',\n es: 'ES Item 2',\n },\n },\n ])\n })\n })\n\n describe('blocks', () => {\n it('should merge localized blocks with locale keys at top level', () => {\n const fields: Field[] = [\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'text',\n fields: [\n {\n name: 'text',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n content: {\n en: [{ blockType: 'text', text: 'EN Text' }],\n es: [{ blockType: 'text', text: 'ES Text' }],\n },\n }\n\n const dataWithLocales = {\n content: {\n en: [{ blockType: 'text', text: 'Updated EN Text' }],\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.content).toEqual({\n en: [{ blockType: 'text', text: 'Updated EN Text' }],\n es: [{ blockType: 'text', text: 'ES Text' }],\n })\n })\n\n it('should handle blocks with nested arrays', () => {\n const fields: Field[] = [\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'nested',\n fields: [\n {\n name: 'items',\n type: 'array',\n fields: [\n {\n name: 'name',\n type: 'text',\n },\n ],\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n content: {\n en: [\n {\n blockType: 'nested',\n items: [{ name: 'EN Item 1' }],\n },\n ],\n es: [\n {\n blockType: 'nested',\n items: [{ name: 'ES Item 1' }],\n },\n ],\n },\n }\n\n const dataWithLocales = {\n content: {\n en: [\n {\n blockType: 'nested',\n items: [{ name: 'Updated EN Item 1' }],\n },\n ],\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.content).toEqual({\n en: [\n {\n blockType: 'nested',\n items: [{ name: 'Updated EN Item 1' }],\n },\n ],\n es: [\n {\n blockType: 'nested',\n items: [{ name: 'ES Item 1' }],\n },\n ],\n })\n })\n })\n\n describe('tabs', () => {\n it('should merge localized named tabs with locale keys at top level', () => {\n const fields: Field[] = [\n {\n type: 'tabs',\n tabs: [\n {\n name: 'meta',\n localized: true,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n meta: {\n en: {\n title: 'EN Title',\n },\n es: {\n title: 'ES Title',\n },\n },\n }\n\n const dataWithLocales = {\n meta: {\n en: {\n title: 'Updated EN Title',\n },\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.meta).toEqual({\n en: {\n title: 'Updated EN Title',\n },\n es: {\n title: 'ES Title',\n },\n })\n })\n\n it('should handle unnamed tabs with localized fields', () => {\n const fields: Field[] = [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'tab1',\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'EN Title',\n es: 'ES Title',\n },\n }\n\n const dataWithLocales = {\n title: {\n en: 'Updated EN Title',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.title).toEqual({\n en: 'Updated EN Title',\n es: 'ES Title',\n })\n })\n })\n\n describe('deeply nested structures', () => {\n it('should handle multiple levels of nesting with locale keys only at topmost localized field', () => {\n const fields: Field[] = [\n {\n name: 'outer',\n type: 'group',\n localized: true,\n fields: [\n {\n name: 'inner',\n type: 'group',\n localized: false,\n fields: [\n {\n name: 'items',\n type: 'array',\n localized: false,\n fields: [\n {\n name: 'text',\n type: 'text',\n localized: false,\n },\n ],\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n outer: {\n en: {\n inner: {\n items: [{ text: 'EN Item 1' }],\n },\n },\n es: {\n inner: {\n items: [{ text: 'ES Item 1' }],\n },\n },\n },\n }\n\n const dataWithLocales = {\n outer: {\n en: {\n inner: {\n items: [{ text: 'Updated EN Item 1' }],\n },\n },\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales,\n })\n\n expect(result.outer).toEqual({\n en: {\n inner: {\n items: [{ text: 'Updated EN Item 1' }],\n },\n },\n es: {\n inner: {\n items: [{ text: 'ES Item 1' }],\n },\n },\n })\n })\n })\n\n describe('multiple selected locales', () => {\n it('should merge multiple locales when selected', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'EN Title',\n es: 'ES Title',\n de: 'DE Title',\n fr: 'FR Title',\n },\n }\n\n const dataWithLocales = {\n title: {\n en: 'Updated EN Title',\n es: 'Updated ES Title',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales: ['en', 'es'],\n })\n\n expect(result.title).toEqual({\n en: 'Updated EN Title',\n es: 'Updated ES Title',\n de: 'DE Title',\n fr: 'FR Title',\n })\n })\n })\n\n describe('pass through fields, rows, collapsibles, unnamed tabs, unnamed groups', () => {\n it('should not lose merged locale data when processing unnamed tabs', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n {\n type: 'tabs',\n tabs: [\n {\n label: 'Other Fields',\n fields: [\n {\n name: 'description',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'English Title',\n },\n description: {\n en: 'English Description',\n },\n }\n\n const dataWithLocales = {\n title: {\n en: 'English Title',\n es: 'Spanish Title',\n },\n description: {\n en: 'English Description',\n es: 'Spanish Description',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales: ['es'],\n })\n\n expect(result.title).toEqual({\n en: 'English Title',\n es: 'Spanish Title',\n })\n\n expect(result.description).toEqual({\n en: 'English Description',\n es: 'Spanish Description',\n })\n })\n\n it('should not lose other locale data when processing unnamed groups', () => {\n // https://github.com/payloadcms/payload/issues/15642\n const fields: Field[] = [\n {\n name: 'textFieldRoot',\n type: 'text',\n },\n {\n name: 'textFieldRootLocalized',\n type: 'text',\n localized: true,\n },\n // Unnamed group - fields at same data level as root\n {\n type: 'group',\n fields: [\n {\n name: 'textFieldNested',\n type: 'text',\n },\n {\n name: 'textFieldNestedLocalized',\n type: 'text',\n localized: true,\n },\n ],\n },\n ]\n\n // Document already has English data published\n const docWithLocales = {\n textFieldRoot: 'Root Value',\n textFieldRootLocalized: {\n en: 'English Root Localized',\n es: 'Spanish Root Localized',\n },\n textFieldNested: 'Nested Value',\n textFieldNestedLocalized: {\n en: 'English Nested Localized',\n es: 'Spanish Nested Localized',\n },\n }\n\n // Publishing only English locale with updated data\n const dataWithLocales = {\n textFieldRoot: 'Updated Root Value',\n textFieldRootLocalized: {\n en: 'Updated English Root Localized',\n },\n textFieldNested: 'Updated Nested Value',\n textFieldNestedLocalized: {\n en: 'Updated English Nested Localized',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales: ['en'],\n })\n\n // Root non-localized field should be updated\n expect(result.textFieldRoot).toBe('Updated Root Value')\n\n // Root localized field should merge: update en, preserve es\n expect(result.textFieldRootLocalized).toEqual({\n en: 'Updated English Root Localized',\n es: 'Spanish Root Localized',\n })\n\n // Nested non-localized field should be updated\n expect(result.textFieldNested).toBe('Updated Nested Value')\n\n // Nested localized field should merge: update en, preserve es\n // This is the bug - es data is lost\n expect(result.textFieldNestedLocalized).toEqual({\n en: 'Updated English Nested Localized',\n es: 'Spanish Nested Localized',\n })\n })\n\n it('should not lose other locale data when processing row fields', () => {\n const fields: Field[] = [\n {\n type: 'row',\n fields: [\n {\n name: 'rowFieldLocalized',\n type: 'text',\n localized: true,\n },\n ],\n },\n ]\n\n const docWithLocales = {\n rowFieldLocalized: {\n en: 'English Value',\n es: 'Spanish Value',\n },\n }\n\n const dataWithLocales = {\n rowFieldLocalized: {\n en: 'Updated English Value',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales: ['en'],\n })\n\n expect(result.rowFieldLocalized).toEqual({\n en: 'Updated English Value',\n es: 'Spanish Value',\n })\n })\n\n it('should preserve other locale data when updating through unnamed tabs', () => {\n const fields: Field[] = [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'Tab 1',\n fields: [\n {\n name: 'tabFieldLocalized',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n // Document has both en and es data\n const docWithLocales = {\n tabFieldLocalized: {\n en: 'English Value',\n es: 'Spanish Value',\n },\n }\n\n // Only updating en\n const dataWithLocales = {\n tabFieldLocalized: {\n en: 'Updated English Value',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales: ['en'],\n })\n\n // es should be preserved\n expect(result.tabFieldLocalized).toEqual({\n en: 'Updated English Value',\n es: 'Spanish Value',\n })\n })\n })\n\n describe('block metadata preservation', () => {\n it('should preserve blockType, id, and blockName when existing doc has no blocks', () => {\n // Reproduces the bug where autosave creates a doc without blocks,\n // then blocks are added and publishSpecificLocale drops metadata\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'content',\n fields: [\n {\n name: 'richText',\n type: 'richText',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n // Main doc has no blocks (autosave wrote before blocks were added)\n const docWithLocales = {}\n\n const dataWithLocales = {\n layout: [\n {\n blockType: 'content',\n id: 'abc123',\n blockName: 'My Content Block',\n richText: { en: 'Hello' },\n },\n ],\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales: ['en'],\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('content')\n expect(result.layout[0].id).toBe('abc123')\n expect(result.layout[0].blockName).toBe('My Content Block')\n })\n\n it('should preserve blockType and id when existing doc has undefined for block field', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'text',\n fields: [\n {\n name: 'text',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n // existingValue is undefined (field not present in existing doc)\n const docWithLocales = {\n layout: undefined,\n }\n\n const dataWithLocales = {\n layout: [\n {\n blockType: 'text',\n id: 'def456',\n text: { en: 'English text', es: 'Spanish text' },\n },\n ],\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales: ['en'],\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('text')\n expect(result.layout[0].id).toBe('def456')\n expect(result.layout[0].text).toEqual({ en: 'English text' })\n })\n\n it('should preserve blockType when existing doc already has blocks', () => {\n // Ensures the fix doesn't break the happy path\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'content',\n fields: [\n {\n name: 'body',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: [\n {\n blockType: 'content',\n id: 'existing-id',\n body: { en: 'Old English', es: 'Old Spanish' },\n },\n ],\n }\n\n const dataWithLocales = {\n layout: [\n {\n blockType: 'content',\n id: 'existing-id',\n body: { en: 'New English', es: 'New Spanish' },\n },\n ],\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n selectedLocales: ['en'],\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('content')\n expect(result.layout[0].id).toBe('existing-id')\n expect(result.layout[0].body).toEqual({ en: 'New English', es: 'Old Spanish' })\n })\n })\n})\n"],"names":["describe","expect","it","mergeLocalizedData","selectedLocales","configBlockReferences","fields","name","type","localized","docWithLocales","title","en","es","de","dataWithLocales","result","toEqual","toBe","missingData","updatedData","meta","description","version","items","blocks","slug","content","blockType","text","tabs","label","outer","inner","fr","textFieldRoot","textFieldRootLocalized","textFieldNested","textFieldNestedLocalized","rowFieldLocalized","tabFieldLocalized","layout","id","blockName","richText","toHaveLength","undefined","body"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/mergeLocalizedData.spec.ts"],"sourcesContent":["import type { Field } from '../fields/config/types.js'\n\nimport { describe, expect, it } from 'vitest'\n\nimport { mergeLocalizedData } from './mergeLocalizedData.js'\n\ndescribe('mergeLocalizedData', () => {\n const localesToUpdate = ['en']\n const configBlockReferences = []\n\n describe('simple fields', () => {\n it('should merge localized field values for selected locales', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'English Title',\n es: 'Spanish Title',\n de: 'German Title',\n },\n }\n\n const dataWithLocales = {\n title: {\n en: 'Updated English Title',\n es: 'Updated Spanish Title',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.title).toEqual({\n en: 'Updated English Title',\n es: 'Spanish Title',\n de: 'German Title',\n })\n })\n\n it('should keep doc value for non-localized fields', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: false,\n },\n ]\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales: {\n title: 'New Title',\n },\n docWithLocales: {\n title: 'Old Title',\n },\n fields,\n localesToUpdate,\n })\n\n expect(result.title).toBe('New Title')\n\n const missingData = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales: {},\n docWithLocales: {\n title: 'Old Title',\n },\n fields,\n localesToUpdate,\n })\n\n expect(missingData.title).toBe('Old Title')\n\n const updatedData = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales: {\n title: 'Updated Title',\n },\n docWithLocales: {},\n fields,\n localesToUpdate,\n })\n\n expect(updatedData.title).toBe('Updated Title')\n })\n })\n\n describe('groups', () => {\n it('should merge localized group with locale keys at top level', () => {\n const fields: Field[] = [\n {\n name: 'meta',\n type: 'group',\n localized: true,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n {\n name: 'description',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n meta: {\n en: {\n title: 'EN Title',\n description: 'EN Desc',\n },\n es: {\n title: 'ES Title',\n description: 'ES Desc',\n },\n },\n }\n\n const dataWithLocales = {\n meta: {\n en: {\n title: 'Updated EN Title',\n description: 'Updated EN Desc',\n },\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.meta).toEqual({\n en: {\n title: 'Updated EN Title',\n description: 'Updated EN Desc',\n },\n es: {\n title: 'ES Title',\n description: 'ES Desc',\n },\n })\n })\n\n it('should handle non-localized group with localized children', () => {\n const fields: Field[] = [\n {\n name: 'meta',\n type: 'group',\n localized: false,\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n {\n name: 'version',\n type: 'number',\n localized: false,\n },\n ],\n },\n ]\n\n const docWithLocales = {\n meta: {\n title: {\n en: 'EN Title',\n es: 'ES Title',\n },\n version: 1,\n },\n }\n\n const dataWithLocales = {\n meta: {\n title: {\n en: 'Updated EN Title',\n },\n version: 2,\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.meta).toEqual({\n title: {\n en: 'Updated EN Title',\n es: 'ES Title',\n },\n version: 2,\n })\n })\n })\n\n describe('arrays', () => {\n it('should merge localized array with locale keys at top level', () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n localized: true,\n fields: [\n {\n name: 'name',\n type: 'text',\n },\n ],\n },\n ]\n\n const docWithLocales = {\n items: {\n en: [{ name: 'EN Item 1' }, { name: 'EN Item 2' }],\n es: [{ name: 'ES Item 1' }],\n },\n }\n\n const dataWithLocales = {\n items: {\n en: [{ name: 'Updated EN Item 1' }, { name: 'Updated EN Item 2' }],\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.items).toEqual({\n en: [{ name: 'Updated EN Item 1' }, { name: 'Updated EN Item 2' }],\n es: [{ name: 'ES Item 1' }],\n })\n })\n\n it('should handle non-localized array with localized children', () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n localized: false,\n fields: [\n {\n name: 'name',\n type: 'text',\n localized: true,\n },\n ],\n },\n ]\n\n const docWithLocales = {\n items: [\n {\n name: {\n en: 'EN Item 1',\n es: 'ES Item 1',\n },\n },\n {\n name: {\n en: 'EN Item 2',\n es: 'ES Item 2',\n },\n },\n ],\n }\n\n const dataWithLocales = {\n items: [\n {\n name: {\n en: 'Updated EN Item 1',\n },\n },\n {\n name: {\n en: 'Updated EN Item 2',\n },\n },\n ],\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.items).toEqual([\n {\n name: {\n en: 'Updated EN Item 1',\n es: 'ES Item 1',\n },\n },\n {\n name: {\n en: 'Updated EN Item 2',\n es: 'ES Item 2',\n },\n },\n ])\n })\n })\n\n describe('blocks', () => {\n it('should merge localized blocks with locale keys at top level', () => {\n const fields: Field[] = [\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'text',\n fields: [\n {\n name: 'text',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n content: {\n en: [{ blockType: 'text', text: 'EN Text' }],\n es: [{ blockType: 'text', text: 'ES Text' }],\n },\n }\n\n const dataWithLocales = {\n content: {\n en: [{ blockType: 'text', text: 'Updated EN Text' }],\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.content).toEqual({\n en: [{ blockType: 'text', text: 'Updated EN Text' }],\n es: [{ blockType: 'text', text: 'ES Text' }],\n })\n })\n\n it('should handle blocks with nested arrays', () => {\n const fields: Field[] = [\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: [\n {\n slug: 'nested',\n fields: [\n {\n name: 'items',\n type: 'array',\n fields: [\n {\n name: 'name',\n type: 'text',\n },\n ],\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n content: {\n en: [\n {\n blockType: 'nested',\n items: [{ name: 'EN Item 1' }],\n },\n ],\n es: [\n {\n blockType: 'nested',\n items: [{ name: 'ES Item 1' }],\n },\n ],\n },\n }\n\n const dataWithLocales = {\n content: {\n en: [\n {\n blockType: 'nested',\n items: [{ name: 'Updated EN Item 1' }],\n },\n ],\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.content).toEqual({\n en: [\n {\n blockType: 'nested',\n items: [{ name: 'Updated EN Item 1' }],\n },\n ],\n es: [\n {\n blockType: 'nested',\n items: [{ name: 'ES Item 1' }],\n },\n ],\n })\n })\n })\n\n describe('tabs', () => {\n it('should merge localized named tabs with locale keys at top level', () => {\n const fields: Field[] = [\n {\n type: 'tabs',\n tabs: [\n {\n name: 'meta',\n localized: true,\n fields: [\n {\n name: 'title',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n meta: {\n en: {\n title: 'EN Title',\n },\n es: {\n title: 'ES Title',\n },\n },\n }\n\n const dataWithLocales = {\n meta: {\n en: {\n title: 'Updated EN Title',\n },\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.meta).toEqual({\n en: {\n title: 'Updated EN Title',\n },\n es: {\n title: 'ES Title',\n },\n })\n })\n\n it('should handle unnamed tabs with localized fields', () => {\n const fields: Field[] = [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'tab1',\n fields: [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'EN Title',\n es: 'ES Title',\n },\n }\n\n const dataWithLocales = {\n title: {\n en: 'Updated EN Title',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.title).toEqual({\n en: 'Updated EN Title',\n es: 'ES Title',\n })\n })\n })\n\n describe('deeply nested structures', () => {\n it('should handle multiple levels of nesting with locale keys only at topmost localized field', () => {\n const fields: Field[] = [\n {\n name: 'outer',\n type: 'group',\n localized: true,\n fields: [\n {\n name: 'inner',\n type: 'group',\n localized: false,\n fields: [\n {\n name: 'items',\n type: 'array',\n localized: false,\n fields: [\n {\n name: 'text',\n type: 'text',\n localized: false,\n },\n ],\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n outer: {\n en: {\n inner: {\n items: [{ text: 'EN Item 1' }],\n },\n },\n es: {\n inner: {\n items: [{ text: 'ES Item 1' }],\n },\n },\n },\n }\n\n const dataWithLocales = {\n outer: {\n en: {\n inner: {\n items: [{ text: 'Updated EN Item 1' }],\n },\n },\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate,\n })\n\n expect(result.outer).toEqual({\n en: {\n inner: {\n items: [{ text: 'Updated EN Item 1' }],\n },\n },\n es: {\n inner: {\n items: [{ text: 'ES Item 1' }],\n },\n },\n })\n })\n })\n\n describe('multiple selected locales', () => {\n it('should merge multiple locales when selected', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'EN Title',\n es: 'ES Title',\n de: 'DE Title',\n fr: 'FR Title',\n },\n }\n\n const dataWithLocales = {\n title: {\n en: 'Updated EN Title',\n es: 'Updated ES Title',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate: ['en', 'es'],\n })\n\n expect(result.title).toEqual({\n en: 'Updated EN Title',\n es: 'Updated ES Title',\n de: 'DE Title',\n fr: 'FR Title',\n })\n })\n })\n\n describe('pass through fields, rows, collapsibles, unnamed tabs, unnamed groups', () => {\n it('should not lose merged locale data when processing unnamed tabs', () => {\n const fields: Field[] = [\n {\n name: 'title',\n type: 'text',\n localized: true,\n },\n {\n type: 'tabs',\n tabs: [\n {\n label: 'Other Fields',\n fields: [\n {\n name: 'description',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n title: {\n en: 'English Title',\n },\n description: {\n en: 'English Description',\n },\n }\n\n const dataWithLocales = {\n title: {\n en: 'English Title',\n es: 'Spanish Title',\n },\n description: {\n en: 'English Description',\n es: 'Spanish Description',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate: ['es'],\n })\n\n expect(result.title).toEqual({\n en: 'English Title',\n es: 'Spanish Title',\n })\n\n expect(result.description).toEqual({\n en: 'English Description',\n es: 'Spanish Description',\n })\n })\n\n it('should not lose other locale data when processing unnamed groups', () => {\n // https://github.com/payloadcms/payload/issues/15642\n const fields: Field[] = [\n {\n name: 'textFieldRoot',\n type: 'text',\n },\n {\n name: 'textFieldRootLocalized',\n type: 'text',\n localized: true,\n },\n // Unnamed group - fields at same data level as root\n {\n type: 'group',\n fields: [\n {\n name: 'textFieldNested',\n type: 'text',\n },\n {\n name: 'textFieldNestedLocalized',\n type: 'text',\n localized: true,\n },\n ],\n },\n ]\n\n // Document already has English data published\n const docWithLocales = {\n textFieldRoot: 'Root Value',\n textFieldRootLocalized: {\n en: 'English Root Localized',\n es: 'Spanish Root Localized',\n },\n textFieldNested: 'Nested Value',\n textFieldNestedLocalized: {\n en: 'English Nested Localized',\n es: 'Spanish Nested Localized',\n },\n }\n\n // Publishing only English locale with updated data\n const dataWithLocales = {\n textFieldRoot: 'Updated Root Value',\n textFieldRootLocalized: {\n en: 'Updated English Root Localized',\n },\n textFieldNested: 'Updated Nested Value',\n textFieldNestedLocalized: {\n en: 'Updated English Nested Localized',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate: ['en'],\n })\n\n // Root non-localized field should be updated\n expect(result.textFieldRoot).toBe('Updated Root Value')\n\n // Root localized field should merge: update en, preserve es\n expect(result.textFieldRootLocalized).toEqual({\n en: 'Updated English Root Localized',\n es: 'Spanish Root Localized',\n })\n\n // Nested non-localized field should be updated\n expect(result.textFieldNested).toBe('Updated Nested Value')\n\n // Nested localized field should merge: update en, preserve es\n // This is the bug - es data is lost\n expect(result.textFieldNestedLocalized).toEqual({\n en: 'Updated English Nested Localized',\n es: 'Spanish Nested Localized',\n })\n })\n\n it('should not lose other locale data when processing row fields', () => {\n const fields: Field[] = [\n {\n type: 'row',\n fields: [\n {\n name: 'rowFieldLocalized',\n type: 'text',\n localized: true,\n },\n ],\n },\n ]\n\n const docWithLocales = {\n rowFieldLocalized: {\n en: 'English Value',\n es: 'Spanish Value',\n },\n }\n\n const dataWithLocales = {\n rowFieldLocalized: {\n en: 'Updated English Value',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate: ['en'],\n })\n\n expect(result.rowFieldLocalized).toEqual({\n en: 'Updated English Value',\n es: 'Spanish Value',\n })\n })\n\n it('should preserve other locale data when updating through unnamed tabs', () => {\n const fields: Field[] = [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'Tab 1',\n fields: [\n {\n name: 'tabFieldLocalized',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n // Document has both en and es data\n const docWithLocales = {\n tabFieldLocalized: {\n en: 'English Value',\n es: 'Spanish Value',\n },\n }\n\n // Only updating en\n const dataWithLocales = {\n tabFieldLocalized: {\n en: 'Updated English Value',\n },\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate: ['en'],\n })\n\n // es should be preserved\n expect(result.tabFieldLocalized).toEqual({\n en: 'Updated English Value',\n es: 'Spanish Value',\n })\n })\n })\n\n describe('block metadata preservation', () => {\n it('should preserve blockType, id, and blockName when existing doc has no blocks', () => {\n // Reproduces the bug where autosave creates a doc without blocks,\n // then blocks are added and publishing a specific locale drops metadata\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'content',\n fields: [\n {\n name: 'richText',\n type: 'richText',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n // Main doc has no blocks (autosave wrote before blocks were added)\n const docWithLocales = {}\n\n const dataWithLocales = {\n layout: [\n {\n blockType: 'content',\n id: 'abc123',\n blockName: 'My Content Block',\n richText: { en: 'Hello' },\n },\n ],\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate: ['en'],\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('content')\n expect(result.layout[0].id).toBe('abc123')\n expect(result.layout[0].blockName).toBe('My Content Block')\n })\n\n it('should preserve blockType and id when existing doc has undefined for block field', () => {\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'text',\n fields: [\n {\n name: 'text',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n // existingValue is undefined (field not present in existing doc)\n const docWithLocales = {\n layout: undefined,\n }\n\n const dataWithLocales = {\n layout: [\n {\n blockType: 'text',\n id: 'def456',\n text: { en: 'English text', es: 'Spanish text' },\n },\n ],\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate: ['en'],\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('text')\n expect(result.layout[0].id).toBe('def456')\n expect(result.layout[0].text).toEqual({ en: 'English text' })\n })\n\n it('should preserve blockType when existing doc already has blocks', () => {\n // Ensures the fix doesn't break the happy path\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'content',\n fields: [\n {\n name: 'body',\n type: 'text',\n localized: true,\n },\n ],\n },\n ],\n },\n ]\n\n const docWithLocales = {\n layout: [\n {\n blockType: 'content',\n id: 'existing-id',\n body: { en: 'Old English', es: 'Old Spanish' },\n },\n ],\n }\n\n const dataWithLocales = {\n layout: [\n {\n blockType: 'content',\n id: 'existing-id',\n body: { en: 'New English', es: 'New Spanish' },\n },\n ],\n }\n\n const result = mergeLocalizedData({\n configBlockReferences: [],\n dataWithLocales,\n docWithLocales,\n fields,\n localesToUpdate: ['en'],\n })\n\n expect(result.layout).toHaveLength(1)\n expect(result.layout[0].blockType).toBe('content')\n expect(result.layout[0].id).toBe('existing-id')\n expect(result.layout[0].body).toEqual({ en: 'New English', es: 'Old Spanish' })\n })\n })\n})\n"],"names":["describe","expect","it","mergeLocalizedData","localesToUpdate","configBlockReferences","fields","name","type","localized","docWithLocales","title","en","es","de","dataWithLocales","result","toEqual","toBe","missingData","updatedData","meta","description","version","items","blocks","slug","content","blockType","text","tabs","label","outer","inner","fr","textFieldRoot","textFieldRootLocalized","textFieldNested","textFieldNestedLocalized","rowFieldLocalized","tabFieldLocalized","layout","id","blockName","richText","toHaveLength","undefined","body"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { JoinQuery, PopulateType, SelectType, Where } from '../../types/index.js';
2
2
  import type { JoinParams } from '../sanitizeJoinParams.js';
3
- type RawParams = {
3
+ export type RawParams = {
4
4
  [key: string]: unknown;
5
5
  autosave?: string;
6
6
  data?: string;
@@ -15,7 +15,6 @@ type RawParams = {
15
15
  pagination?: string;
16
16
  populate?: unknown;
17
17
  publishAllLocales?: string;
18
- publishSpecificLocale?: string;
19
18
  select?: unknown;
20
19
  selectedLocales?: string;
21
20
  sort?: string | string[];
@@ -23,7 +22,7 @@ type RawParams = {
23
22
  unpublishAllLocales?: string;
24
23
  where?: string | Where;
25
24
  };
26
- type ParsedParams = {
25
+ export type ParsedParams = {
27
26
  autosave?: boolean;
28
27
  data?: Record<string, unknown>;
29
28
  depth?: number;
@@ -37,7 +36,6 @@ type ParsedParams = {
37
36
  pagination?: boolean;
38
37
  populate?: PopulateType;
39
38
  publishAllLocales?: boolean;
40
- publishSpecificLocale?: string;
41
39
  select?: SelectType;
42
40
  selectedLocales?: string[];
43
41
  sort?: string[];
@@ -55,5 +53,4 @@ export declare const numberParams: string[];
55
53
  * c. `sort` provided as a comma-separated string or array is converted to an array of strings
56
54
  */
57
55
  export declare const parseParams: (params: RawParams) => ParsedParams;
58
- export {};
59
56
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/parseParams/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAS1D,KAAK,SAAS,GAAG;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CACvB,CAAA;AAED,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3B,eAAO,MAAM,aAAa,UAOzB,CAAA;AAED,eAAO,MAAM,YAAY,UAA6B,CAAA;AAEtD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,SAAS,KAAG,YA2C/C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/parseParams/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAS1D,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3B,eAAO,MAAM,aAAa,UAOzB,CAAA;AAED,eAAO,MAAM,YAAY,UAA6B,CAAA;AAEtD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,SAAS,KAAG,YA2C/C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utilities/parseParams/index.ts"],"sourcesContent":["import type { JoinQuery, PopulateType, SelectType, Where } from '../../types/index.js'\nimport type { JoinParams } from '../sanitizeJoinParams.js'\n\nimport { isNumber } from '../isNumber.js'\nimport { parseBooleanString } from '../parseBooleanString.js'\nimport { sanitizeJoinParams } from '../sanitizeJoinParams.js'\nimport { sanitizePopulateParam } from '../sanitizePopulateParam.js'\nimport { sanitizeSelectParam } from '../sanitizeSelectParam.js'\nimport { sanitizeSortParams } from '../sanitizeSortParams.js'\n\ntype RawParams = {\n [key: string]: unknown\n autosave?: string\n data?: string\n depth?: string\n draft?: string\n field?: string\n flattenLocales?: string\n joins?: JoinParams\n limit?: string\n overrideLock?: string\n page?: string\n pagination?: string\n populate?: unknown\n publishAllLocales?: string\n publishSpecificLocale?: string\n select?: unknown\n selectedLocales?: string\n sort?: string | string[]\n trash?: string\n unpublishAllLocales?: string\n where?: string | Where\n}\n\ntype ParsedParams = {\n autosave?: boolean\n data?: Record<string, unknown>\n depth?: number\n draft?: boolean\n field?: string\n flattenLocales?: boolean\n joins?: JoinQuery\n limit?: number\n overrideLock?: boolean\n page?: number\n pagination?: boolean\n populate?: PopulateType\n publishAllLocales?: boolean\n publishSpecificLocale?: string\n select?: SelectType\n selectedLocales?: string[]\n sort?: string[]\n trash?: boolean\n unpublishAllLocales?: boolean\n where?: Where\n} & Record<string, unknown>\n\nexport const booleanParams = [\n 'autosave',\n 'draft',\n 'trash',\n 'overrideLock',\n 'pagination',\n 'flattenLocales',\n]\n\nexport const numberParams = ['depth', 'limit', 'page']\n\n/**\n * Takes raw query parameters and parses them into the correct types that Payload expects.\n * Examples:\n * a. `draft` provided as a string of \"true\" is converted to a boolean\n * b. `depth` provided as a string of \"0\" is converted to a number\n * c. `sort` provided as a comma-separated string or array is converted to an array of strings\n */\nexport const parseParams = (params: RawParams): ParsedParams => {\n const parsedParams = (params || {}) as ParsedParams\n\n // iterate through known params to make this very fast\n for (const key of booleanParams) {\n if (key in params) {\n parsedParams[key] = parseBooleanString(params[key] as boolean | string)\n }\n }\n\n for (const key of numberParams) {\n if (key in params) {\n if (isNumber(params[key])) {\n parsedParams[key] = Number(params[key])\n }\n }\n }\n\n if ('populate' in params) {\n parsedParams.populate = sanitizePopulateParam(params.populate)\n }\n\n if ('select' in params) {\n parsedParams.select = sanitizeSelectParam(params.select)\n }\n\n if ('joins' in params) {\n parsedParams.joins = sanitizeJoinParams(params.joins as JoinParams)\n }\n\n if ('sort' in params) {\n parsedParams.sort = sanitizeSortParams(params.sort)\n }\n\n if ('data' in params && typeof params.data === 'string' && params.data.length > 0) {\n parsedParams.data = JSON.parse(params.data)\n }\n\n if ('where' in params && typeof params.where === 'string' && params.where.length > 0) {\n parsedParams.where = JSON.parse(params.where) as Where\n }\n\n return parsedParams\n}\n"],"names":["isNumber","parseBooleanString","sanitizeJoinParams","sanitizePopulateParam","sanitizeSelectParam","sanitizeSortParams","booleanParams","numberParams","parseParams","params","parsedParams","key","Number","populate","select","joins","sort","data","length","JSON","parse","where"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,SAASC,kBAAkB,QAAQ,2BAA0B;AAC7D,SAASC,kBAAkB,QAAQ,2BAA0B;AAC7D,SAASC,qBAAqB,QAAQ,8BAA6B;AACnE,SAASC,mBAAmB,QAAQ,4BAA2B;AAC/D,SAASC,kBAAkB,QAAQ,2BAA0B;AAiD7D,OAAO,MAAMC,gBAAgB;IAC3B;IACA;IACA;IACA;IACA;IACA;CACD,CAAA;AAED,OAAO,MAAMC,eAAe;IAAC;IAAS;IAAS;CAAO,CAAA;AAEtD;;;;;;CAMC,GACD,OAAO,MAAMC,cAAc,CAACC;IAC1B,MAAMC,eAAgBD,UAAU,CAAC;IAEjC,sDAAsD;IACtD,KAAK,MAAME,OAAOL,cAAe;QAC/B,IAAIK,OAAOF,QAAQ;YACjBC,YAAY,CAACC,IAAI,GAAGV,mBAAmBQ,MAAM,CAACE,IAAI;QACpD;IACF;IAEA,KAAK,MAAMA,OAAOJ,aAAc;QAC9B,IAAII,OAAOF,QAAQ;YACjB,IAAIT,SAASS,MAAM,CAACE,IAAI,GAAG;gBACzBD,YAAY,CAACC,IAAI,GAAGC,OAAOH,MAAM,CAACE,IAAI;YACxC;QACF;IACF;IAEA,IAAI,cAAcF,QAAQ;QACxBC,aAAaG,QAAQ,GAAGV,sBAAsBM,OAAOI,QAAQ;IAC/D;IAEA,IAAI,YAAYJ,QAAQ;QACtBC,aAAaI,MAAM,GAAGV,oBAAoBK,OAAOK,MAAM;IACzD;IAEA,IAAI,WAAWL,QAAQ;QACrBC,aAAaK,KAAK,GAAGb,mBAAmBO,OAAOM,KAAK;IACtD;IAEA,IAAI,UAAUN,QAAQ;QACpBC,aAAaM,IAAI,GAAGX,mBAAmBI,OAAOO,IAAI;IACpD;IAEA,IAAI,UAAUP,UAAU,OAAOA,OAAOQ,IAAI,KAAK,YAAYR,OAAOQ,IAAI,CAACC,MAAM,GAAG,GAAG;QACjFR,aAAaO,IAAI,GAAGE,KAAKC,KAAK,CAACX,OAAOQ,IAAI;IAC5C;IAEA,IAAI,WAAWR,UAAU,OAAOA,OAAOY,KAAK,KAAK,YAAYZ,OAAOY,KAAK,CAACH,MAAM,GAAG,GAAG;QACpFR,aAAaW,KAAK,GAAGF,KAAKC,KAAK,CAACX,OAAOY,KAAK;IAC9C;IAEA,OAAOX;AACT,EAAC"}
1
+ {"version":3,"sources":["../../../src/utilities/parseParams/index.ts"],"sourcesContent":["import type { JoinQuery, PopulateType, SelectType, Where } from '../../types/index.js'\nimport type { JoinParams } from '../sanitizeJoinParams.js'\n\nimport { isNumber } from '../isNumber.js'\nimport { parseBooleanString } from '../parseBooleanString.js'\nimport { sanitizeJoinParams } from '../sanitizeJoinParams.js'\nimport { sanitizePopulateParam } from '../sanitizePopulateParam.js'\nimport { sanitizeSelectParam } from '../sanitizeSelectParam.js'\nimport { sanitizeSortParams } from '../sanitizeSortParams.js'\n\nexport type RawParams = {\n [key: string]: unknown\n autosave?: string\n data?: string\n depth?: string\n draft?: string\n field?: string\n flattenLocales?: string\n joins?: JoinParams\n limit?: string\n overrideLock?: string\n page?: string\n pagination?: string\n populate?: unknown\n publishAllLocales?: string\n select?: unknown\n selectedLocales?: string\n sort?: string | string[]\n trash?: string\n unpublishAllLocales?: string\n where?: string | Where\n}\n\nexport type ParsedParams = {\n autosave?: boolean\n data?: Record<string, unknown>\n depth?: number\n draft?: boolean\n field?: string\n flattenLocales?: boolean\n joins?: JoinQuery\n limit?: number\n overrideLock?: boolean\n page?: number\n pagination?: boolean\n populate?: PopulateType\n publishAllLocales?: boolean\n select?: SelectType\n selectedLocales?: string[]\n sort?: string[]\n trash?: boolean\n unpublishAllLocales?: boolean\n where?: Where\n} & Record<string, unknown>\n\nexport const booleanParams = [\n 'autosave',\n 'draft',\n 'trash',\n 'overrideLock',\n 'pagination',\n 'flattenLocales',\n]\n\nexport const numberParams = ['depth', 'limit', 'page']\n\n/**\n * Takes raw query parameters and parses them into the correct types that Payload expects.\n * Examples:\n * a. `draft` provided as a string of \"true\" is converted to a boolean\n * b. `depth` provided as a string of \"0\" is converted to a number\n * c. `sort` provided as a comma-separated string or array is converted to an array of strings\n */\nexport const parseParams = (params: RawParams): ParsedParams => {\n const parsedParams = (params || {}) as ParsedParams\n\n // iterate through known params to make this very fast\n for (const key of booleanParams) {\n if (key in params) {\n parsedParams[key] = parseBooleanString(params[key] as boolean | string)\n }\n }\n\n for (const key of numberParams) {\n if (key in params) {\n if (isNumber(params[key])) {\n parsedParams[key] = Number(params[key])\n }\n }\n }\n\n if ('populate' in params) {\n parsedParams.populate = sanitizePopulateParam(params.populate)\n }\n\n if ('select' in params) {\n parsedParams.select = sanitizeSelectParam(params.select)\n }\n\n if ('joins' in params) {\n parsedParams.joins = sanitizeJoinParams(params.joins as JoinParams)\n }\n\n if ('sort' in params) {\n parsedParams.sort = sanitizeSortParams(params.sort)\n }\n\n if ('data' in params && typeof params.data === 'string' && params.data.length > 0) {\n parsedParams.data = JSON.parse(params.data)\n }\n\n if ('where' in params && typeof params.where === 'string' && params.where.length > 0) {\n parsedParams.where = JSON.parse(params.where) as Where\n }\n\n return parsedParams\n}\n"],"names":["isNumber","parseBooleanString","sanitizeJoinParams","sanitizePopulateParam","sanitizeSelectParam","sanitizeSortParams","booleanParams","numberParams","parseParams","params","parsedParams","key","Number","populate","select","joins","sort","data","length","JSON","parse","where"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,SAASC,kBAAkB,QAAQ,2BAA0B;AAC7D,SAASC,kBAAkB,QAAQ,2BAA0B;AAC7D,SAASC,qBAAqB,QAAQ,8BAA6B;AACnE,SAASC,mBAAmB,QAAQ,4BAA2B;AAC/D,SAASC,kBAAkB,QAAQ,2BAA0B;AA+C7D,OAAO,MAAMC,gBAAgB;IAC3B;IACA;IACA;IACA;IACA;IACA;CACD,CAAA;AAED,OAAO,MAAMC,eAAe;IAAC;IAAS;IAAS;CAAO,CAAA;AAEtD;;;;;;CAMC,GACD,OAAO,MAAMC,cAAc,CAACC;IAC1B,MAAMC,eAAgBD,UAAU,CAAC;IAEjC,sDAAsD;IACtD,KAAK,MAAME,OAAOL,cAAe;QAC/B,IAAIK,OAAOF,QAAQ;YACjBC,YAAY,CAACC,IAAI,GAAGV,mBAAmBQ,MAAM,CAACE,IAAI;QACpD;IACF;IAEA,KAAK,MAAMA,OAAOJ,aAAc;QAC9B,IAAII,OAAOF,QAAQ;YACjB,IAAIT,SAASS,MAAM,CAACE,IAAI,GAAG;gBACzBD,YAAY,CAACC,IAAI,GAAGC,OAAOH,MAAM,CAACE,IAAI;YACxC;QACF;IACF;IAEA,IAAI,cAAcF,QAAQ;QACxBC,aAAaG,QAAQ,GAAGV,sBAAsBM,OAAOI,QAAQ;IAC/D;IAEA,IAAI,YAAYJ,QAAQ;QACtBC,aAAaI,MAAM,GAAGV,oBAAoBK,OAAOK,MAAM;IACzD;IAEA,IAAI,WAAWL,QAAQ;QACrBC,aAAaK,KAAK,GAAGb,mBAAmBO,OAAOM,KAAK;IACtD;IAEA,IAAI,UAAUN,QAAQ;QACpBC,aAAaM,IAAI,GAAGX,mBAAmBI,OAAOO,IAAI;IACpD;IAEA,IAAI,UAAUP,UAAU,OAAOA,OAAOQ,IAAI,KAAK,YAAYR,OAAOQ,IAAI,CAACC,MAAM,GAAG,GAAG;QACjFR,aAAaO,IAAI,GAAGE,KAAKC,KAAK,CAACX,OAAOQ,IAAI;IAC5C;IAEA,IAAI,WAAWR,UAAU,OAAOA,OAAOY,KAAK,KAAK,YAAYZ,OAAOY,KAAK,CAACH,MAAM,GAAG,GAAG;QACpFR,aAAaW,KAAK,GAAGF,KAAKC,KAAK,CAACX,OAAOY,KAAK;IAC9C;IAEA,OAAOX;AACT,EAAC"}
@@ -270,15 +270,6 @@ describe('parseParams', ()=>{
270
270
  expect(result.selectedLocales).toBe(selectedLocales);
271
271
  });
272
272
  });
273
- describe('publishSpecificLocale parameter', ()=>{
274
- it('should pass through publishSpecificLocale as-is', ()=>{
275
- const publishSpecificLocale = 'en';
276
- const result = parseParams({
277
- publishSpecificLocale
278
- });
279
- expect(result.publishSpecificLocale).toBe(publishSpecificLocale);
280
- });
281
- });
282
273
  describe('field parameter', ()=>{
283
274
  it('should pass through field as-is', ()=>{
284
275
  const field = 'myField';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utilities/parseParams/index.spec.ts"],"sourcesContent":["import * as qs from 'qs-esm'\nimport { describe, it, expect } from 'vitest'\nimport { parseParams, booleanParams, numberParams } from './index.js'\n\ndescribe('parseParams', () => {\n describe('boolean parameters', () => {\n booleanParams.forEach((param) => {\n describe(param, () => {\n it('should parse string \"true\" to boolean true', () => {\n const result = parseParams({ [param]: 'true' })\n expect(result[param]).toBe(true)\n })\n\n it('should parse string \"false\" to boolean false', () => {\n const result = parseParams({ [param]: 'false' })\n expect(result[param]).toBe(false)\n })\n\n it('should parse boolean true to boolean true', () => {\n const result = parseParams({ [param]: true })\n expect(result[param]).toBe(true)\n })\n\n it('should parse boolean false to boolean false', () => {\n const result = parseParams({ [param]: false })\n expect(result[param]).toBe(false)\n })\n\n it('should return undefined for truthy strings (not exact \"true\")', () => {\n const result = parseParams({ [param]: '1' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for falsy strings (not exact \"false\")', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBeUndefined()\n })\n })\n })\n })\n\n describe('number parameters', () => {\n numberParams.forEach((param) => {\n describe(param, () => {\n it('should parse valid number string to number', () => {\n const result = parseParams({ [param]: '42' })\n expect(result[param]).toBe(42)\n })\n\n it('should parse zero string to zero', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBe(0)\n })\n\n it('should parse negative number string to negative number', () => {\n const result = parseParams({ [param]: '-5' })\n expect(result[param]).toBe(-5)\n })\n\n it('should parse decimal number string to decimal number', () => {\n const result = parseParams({ [param]: '3.14' })\n expect(result[param]).toBe(3.14)\n })\n\n it('should not parse invalid number strings', () => {\n const result = parseParams({ [param]: 'not-a-number' })\n expect(result[param]).toBe('not-a-number') // remains as string\n })\n\n it('should not parse empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBe('') // remains as string\n })\n\n it('should handle already numeric values', () => {\n const result = parseParams({ [param]: 123 })\n expect(result[param]).toBe(123)\n })\n })\n })\n })\n\n describe('sort parameter', () => {\n it('should parse comma-separated string to array', () => {\n const result = parseParams({ sort: 'name,createdAt,-updatedAt' })\n expect(result.sort).toEqual(['name', 'createdAt', '-updatedAt'])\n })\n\n it('should parse single value string to array with one element', () => {\n const result = parseParams({ sort: 'name' })\n expect(result.sort).toEqual(['name'])\n })\n\n it('should handle empty string', () => {\n const result = parseParams({ sort: '' })\n expect(result.sort).toEqual([''])\n })\n\n it('should handle comma-separated string with spaces', () => {\n const result = parseParams({ sort: 'name, createdAt , -updatedAt' })\n expect(result.sort).toEqual(['name', ' createdAt ', ' -updatedAt'])\n })\n\n it('should parse array of strings', () => {\n const result = parseParams({ sort: ['name', '-createdAt'] })\n expect(result.sort).toEqual(['name', '-createdAt'])\n })\n\n it('should return undefined for non-string sort values', () => {\n const result = parseParams({ sort: 123 as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should return undefined for array with non-string sort values', () => {\n const result = parseParams({ sort: ['name', 123] as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should handle qs-esm array sort parsing', () => {\n const query = qs.stringify({ sort: ['title', '-createdAt'] })\n const parsed = qs.parse(query)\n const result = parseParams(parsed)\n expect(result.sort).toEqual(['title', '-createdAt'])\n })\n\n it('should return undefined for null sort values', () => {\n const result = parseParams({ sort: null as any })\n expect(result.sort).toBeUndefined()\n })\n })\n\n describe('data parameter', () => {\n it('should parse valid JSON string', () => {\n const data = { name: 'test', value: 42 }\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should parse empty object JSON string', () => {\n const result = parseParams({ data: '{}' })\n expect(result.data).toEqual({})\n })\n\n it('should parse array JSON string', () => {\n const data = [1, 2, 3]\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should not process empty string', () => {\n const result = parseParams({ data: '' })\n expect(result.data).toBe('') // empty string is not processed, remains as string\n })\n\n it('should throw error for invalid JSON', () => {\n expect(() => {\n parseParams({ data: 'invalid-json' })\n }).toThrow()\n })\n\n it('should not process non-string data values', () => {\n const result = parseParams({ data: { already: 'parsed' } as any })\n expect(result.data).toEqual({ already: 'parsed' })\n })\n })\n\n describe('special parameters', () => {\n it('should handle populate parameter', () => {\n const result = parseParams({ populate: 'field1,field2' })\n expect(result).toHaveProperty('populate')\n // Note: actual sanitization logic is tested in sanitizePopulateParam tests\n })\n\n it('should handle select parameter', () => {\n const result = parseParams({ select: 'field1,field2' })\n expect(result).toHaveProperty('select')\n // Note: actual sanitization logic is tested in sanitizeSelectParam tests\n })\n\n it('should handle joins parameter', () => {\n const joins = { collection: 'posts' }\n const result = parseParams({ joins })\n expect(result).toHaveProperty('joins')\n // Note: actual sanitization logic is tested in sanitizeJoinParams tests\n })\n })\n\n describe('selectedLocales parameter', () => {\n it('should pass through selectedLocales as-is', () => {\n const selectedLocales = 'en,es,fr'\n const result = parseParams({ selectedLocales })\n expect(result.selectedLocales).toBe(selectedLocales)\n })\n })\n\n describe('publishSpecificLocale parameter', () => {\n it('should pass through publishSpecificLocale as-is', () => {\n const publishSpecificLocale = 'en'\n const result = parseParams({ publishSpecificLocale })\n expect(result.publishSpecificLocale).toBe(publishSpecificLocale)\n })\n })\n\n describe('field parameter', () => {\n it('should pass through field as-is', () => {\n const field = 'myField'\n const result = parseParams({ field })\n expect(result.field).toBe(field)\n })\n })\n\n describe('where parameter', () => {\n it('should pass through where as-is', () => {\n const where = { name: { equals: 'test' } }\n const result = parseParams({ where })\n expect(result.where).toBe(where)\n })\n\n it('should parse where when it is a JSON string', () => {\n const where = { read: { equals: false } }\n const result = parseParams({ where: JSON.stringify(where) })\n expect(result.where).toEqual(where)\n })\n\n it('should not process empty string where', () => {\n const result = parseParams({ where: '' })\n expect(result.where).toBe('')\n })\n\n it('should throw error for invalid JSON where', () => {\n expect(() => {\n parseParams({ where: 'invalid-json' })\n }).toThrow()\n })\n })\n\n describe('edge cases', () => {\n it('should handle empty params object', () => {\n const result = parseParams({})\n expect(result).toEqual({})\n })\n\n it('should throw error for null params (current implementation bug)', () => {\n expect(() => {\n parseParams(null as any)\n }).toThrow(TypeError)\n })\n\n it('should throw error for undefined params (current implementation bug)', () => {\n expect(() => {\n parseParams(undefined as any)\n }).toThrow(TypeError)\n })\n\n it('should preserve unknown parameters', () => {\n const result = parseParams({ customParam: 'customValue' })\n expect(result.customParam).toBe('customValue')\n })\n\n it('should handle mixed parameter types', () => {\n const result = parseParams({\n draft: 'true',\n depth: '5',\n sort: 'name,createdAt',\n data: '{\"test\": true}',\n customParam: 'custom',\n })\n\n expect(result.draft).toBe(true)\n expect(result.depth).toBe(5)\n expect(result.sort).toEqual(['name', 'createdAt'])\n expect(result.data).toEqual({ test: true })\n expect(result.customParam).toBe('custom')\n })\n })\n\n describe('parameter preservation', () => {\n it('should not modify parameters that are not in known lists', () => {\n const params = {\n unknownBoolean: 'true',\n unknownNumber: '42',\n unknownString: 'test',\n }\n const result = parseParams(params)\n\n expect(result.unknownBoolean).toBe('true') // should remain string\n expect(result.unknownNumber).toBe('42') // should remain string\n expect(result.unknownString).toBe('test')\n })\n\n it('should only process parameters that exist in the input', () => {\n const result = parseParams({ draft: 'true' })\n\n expect(result.draft).toBe(true)\n expect(result).not.toHaveProperty('autosave')\n expect(result).not.toHaveProperty('depth')\n expect(result).not.toHaveProperty('sort')\n })\n })\n})\n"],"names":["qs","describe","it","expect","parseParams","booleanParams","numberParams","forEach","param","result","toBe","toBeUndefined","sort","toEqual","query","stringify","parsed","parse","data","name","value","JSON","toThrow","already","populate","toHaveProperty","select","joins","collection","selectedLocales","publishSpecificLocale","field","where","equals","read","TypeError","undefined","customParam","draft","depth","test","params","unknownBoolean","unknownNumber","unknownString","not"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utilities/parseParams/index.spec.ts"],"sourcesContent":["import * as qs from 'qs-esm'\nimport { describe, it, expect } from 'vitest'\nimport { parseParams, booleanParams, numberParams } from './index.js'\n\ndescribe('parseParams', () => {\n describe('boolean parameters', () => {\n booleanParams.forEach((param) => {\n describe(param, () => {\n it('should parse string \"true\" to boolean true', () => {\n const result = parseParams({ [param]: 'true' })\n expect(result[param]).toBe(true)\n })\n\n it('should parse string \"false\" to boolean false', () => {\n const result = parseParams({ [param]: 'false' })\n expect(result[param]).toBe(false)\n })\n\n it('should parse boolean true to boolean true', () => {\n const result = parseParams({ [param]: true })\n expect(result[param]).toBe(true)\n })\n\n it('should parse boolean false to boolean false', () => {\n const result = parseParams({ [param]: false })\n expect(result[param]).toBe(false)\n })\n\n it('should return undefined for truthy strings (not exact \"true\")', () => {\n const result = parseParams({ [param]: '1' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for falsy strings (not exact \"false\")', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBeUndefined()\n })\n })\n })\n })\n\n describe('number parameters', () => {\n numberParams.forEach((param) => {\n describe(param, () => {\n it('should parse valid number string to number', () => {\n const result = parseParams({ [param]: '42' })\n expect(result[param]).toBe(42)\n })\n\n it('should parse zero string to zero', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBe(0)\n })\n\n it('should parse negative number string to negative number', () => {\n const result = parseParams({ [param]: '-5' })\n expect(result[param]).toBe(-5)\n })\n\n it('should parse decimal number string to decimal number', () => {\n const result = parseParams({ [param]: '3.14' })\n expect(result[param]).toBe(3.14)\n })\n\n it('should not parse invalid number strings', () => {\n const result = parseParams({ [param]: 'not-a-number' })\n expect(result[param]).toBe('not-a-number') // remains as string\n })\n\n it('should not parse empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBe('') // remains as string\n })\n\n it('should handle already numeric values', () => {\n const result = parseParams({ [param]: 123 })\n expect(result[param]).toBe(123)\n })\n })\n })\n })\n\n describe('sort parameter', () => {\n it('should parse comma-separated string to array', () => {\n const result = parseParams({ sort: 'name,createdAt,-updatedAt' })\n expect(result.sort).toEqual(['name', 'createdAt', '-updatedAt'])\n })\n\n it('should parse single value string to array with one element', () => {\n const result = parseParams({ sort: 'name' })\n expect(result.sort).toEqual(['name'])\n })\n\n it('should handle empty string', () => {\n const result = parseParams({ sort: '' })\n expect(result.sort).toEqual([''])\n })\n\n it('should handle comma-separated string with spaces', () => {\n const result = parseParams({ sort: 'name, createdAt , -updatedAt' })\n expect(result.sort).toEqual(['name', ' createdAt ', ' -updatedAt'])\n })\n\n it('should parse array of strings', () => {\n const result = parseParams({ sort: ['name', '-createdAt'] })\n expect(result.sort).toEqual(['name', '-createdAt'])\n })\n\n it('should return undefined for non-string sort values', () => {\n const result = parseParams({ sort: 123 as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should return undefined for array with non-string sort values', () => {\n const result = parseParams({ sort: ['name', 123] as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should handle qs-esm array sort parsing', () => {\n const query = qs.stringify({ sort: ['title', '-createdAt'] })\n const parsed = qs.parse(query)\n const result = parseParams(parsed)\n expect(result.sort).toEqual(['title', '-createdAt'])\n })\n\n it('should return undefined for null sort values', () => {\n const result = parseParams({ sort: null as any })\n expect(result.sort).toBeUndefined()\n })\n })\n\n describe('data parameter', () => {\n it('should parse valid JSON string', () => {\n const data = { name: 'test', value: 42 }\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should parse empty object JSON string', () => {\n const result = parseParams({ data: '{}' })\n expect(result.data).toEqual({})\n })\n\n it('should parse array JSON string', () => {\n const data = [1, 2, 3]\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should not process empty string', () => {\n const result = parseParams({ data: '' })\n expect(result.data).toBe('') // empty string is not processed, remains as string\n })\n\n it('should throw error for invalid JSON', () => {\n expect(() => {\n parseParams({ data: 'invalid-json' })\n }).toThrow()\n })\n\n it('should not process non-string data values', () => {\n const result = parseParams({ data: { already: 'parsed' } as any })\n expect(result.data).toEqual({ already: 'parsed' })\n })\n })\n\n describe('special parameters', () => {\n it('should handle populate parameter', () => {\n const result = parseParams({ populate: 'field1,field2' })\n expect(result).toHaveProperty('populate')\n // Note: actual sanitization logic is tested in sanitizePopulateParam tests\n })\n\n it('should handle select parameter', () => {\n const result = parseParams({ select: 'field1,field2' })\n expect(result).toHaveProperty('select')\n // Note: actual sanitization logic is tested in sanitizeSelectParam tests\n })\n\n it('should handle joins parameter', () => {\n const joins = { collection: 'posts' }\n const result = parseParams({ joins })\n expect(result).toHaveProperty('joins')\n // Note: actual sanitization logic is tested in sanitizeJoinParams tests\n })\n })\n\n describe('selectedLocales parameter', () => {\n it('should pass through selectedLocales as-is', () => {\n const selectedLocales = 'en,es,fr'\n const result = parseParams({ selectedLocales })\n expect(result.selectedLocales).toBe(selectedLocales)\n })\n })\n\n describe('field parameter', () => {\n it('should pass through field as-is', () => {\n const field = 'myField'\n const result = parseParams({ field })\n expect(result.field).toBe(field)\n })\n })\n\n describe('where parameter', () => {\n it('should pass through where as-is', () => {\n const where = { name: { equals: 'test' } }\n const result = parseParams({ where })\n expect(result.where).toBe(where)\n })\n\n it('should parse where when it is a JSON string', () => {\n const where = { read: { equals: false } }\n const result = parseParams({ where: JSON.stringify(where) })\n expect(result.where).toEqual(where)\n })\n\n it('should not process empty string where', () => {\n const result = parseParams({ where: '' })\n expect(result.where).toBe('')\n })\n\n it('should throw error for invalid JSON where', () => {\n expect(() => {\n parseParams({ where: 'invalid-json' })\n }).toThrow()\n })\n })\n\n describe('edge cases', () => {\n it('should handle empty params object', () => {\n const result = parseParams({})\n expect(result).toEqual({})\n })\n\n it('should throw error for null params (current implementation bug)', () => {\n expect(() => {\n parseParams(null as any)\n }).toThrow(TypeError)\n })\n\n it('should throw error for undefined params (current implementation bug)', () => {\n expect(() => {\n parseParams(undefined as any)\n }).toThrow(TypeError)\n })\n\n it('should preserve unknown parameters', () => {\n const result = parseParams({ customParam: 'customValue' })\n expect(result.customParam).toBe('customValue')\n })\n\n it('should handle mixed parameter types', () => {\n const result = parseParams({\n draft: 'true',\n depth: '5',\n sort: 'name,createdAt',\n data: '{\"test\": true}',\n customParam: 'custom',\n })\n\n expect(result.draft).toBe(true)\n expect(result.depth).toBe(5)\n expect(result.sort).toEqual(['name', 'createdAt'])\n expect(result.data).toEqual({ test: true })\n expect(result.customParam).toBe('custom')\n })\n })\n\n describe('parameter preservation', () => {\n it('should not modify parameters that are not in known lists', () => {\n const params = {\n unknownBoolean: 'true',\n unknownNumber: '42',\n unknownString: 'test',\n }\n const result = parseParams(params)\n\n expect(result.unknownBoolean).toBe('true') // should remain string\n expect(result.unknownNumber).toBe('42') // should remain string\n expect(result.unknownString).toBe('test')\n })\n\n it('should only process parameters that exist in the input', () => {\n const result = parseParams({ draft: 'true' })\n\n expect(result.draft).toBe(true)\n expect(result).not.toHaveProperty('autosave')\n expect(result).not.toHaveProperty('depth')\n expect(result).not.toHaveProperty('sort')\n })\n })\n})\n"],"names":["qs","describe","it","expect","parseParams","booleanParams","numberParams","forEach","param","result","toBe","toBeUndefined","sort","toEqual","query","stringify","parsed","parse","data","name","value","JSON","toThrow","already","populate","toHaveProperty","select","joins","collection","selectedLocales","field","where","equals","read","TypeError","undefined","customParam","draft","depth","test","params","unknownBoolean","unknownNumber","unknownString","not"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,KAAK,EAAkC,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAmGlG,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,KAAK,OAAO,GAAG,IAAI,CAAA;AAEpB,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,aAAa,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAA;IAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAA;IACjC,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAI,iJAY5B,kBAAkB,KAAG,IA0WvB,CAAA"}
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,KAAK,EAAkC,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAiGlG,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,KAAK,OAAO,GAAG,IAAI,CAAA;AAEpB,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,aAAa,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAA;IAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAA;IACjC,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAI,iJAY5B,kBAAkB,KAAG,IA0WvB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/traverseFields.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../config/types.js'\nimport type { ArrayField, Block, BlocksField, Field, TabAsField } from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldShouldBeLocalized,\n tabHasName,\n} from '../fields/config/types.js'\n\nconst traverseArrayOrBlocksField = ({\n callback,\n callbackStack,\n config,\n data,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n}: {\n callback: TraverseFieldsCallback\n callbackStack: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n data: Record<string, unknown>[]\n field: ArrayField | BlocksField\n fillEmpty: boolean\n leavesFirst: boolean\n parentIsLocalized: boolean\n parentPath: string\n parentRef?: unknown\n}) => {\n if (fillEmpty) {\n if (field.type === 'array') {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n if (field.type === 'blocks') {\n for (const _block of field.blocks) {\n const block =\n typeof _block === 'string' ? config?.blocks?.find((b) => b.slug === _block) : _block\n if (block) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: block.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n }\n }\n return\n }\n for (const ref of data) {\n let fields!: Field[]\n if (field.type === 'blocks' && typeof ref?.blockType === 'string') {\n const block =\n config?.blocks?.find((b) => b.slug === ref.blockType) ??\n field.blocks.find(\n (b): b is Block => typeof b !== 'string' && b.slug === ref.blockType,\n )\n\n fields = block?.fields as Field[]\n } else if (field.type === 'array') {\n fields = field.fields\n }\n\n if (fields) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n ref,\n })\n }\n }\n}\n\nexport type TraverseFieldsCallback = (args: {\n /**\n * The current field\n */\n field: Field | TabAsField\n /**\n * Function that when called will skip the current field and continue to the next\n */\n next?: () => void\n parentIsLocalized: boolean\n parentPath: string\n /**\n * The parent reference object\n */\n parentRef?: Record<string, unknown> | unknown\n /**\n * The current reference object\n */\n ref?: Record<string, unknown> | unknown\n}) => boolean | void\n\ntype TraverseFieldsArgs = {\n callback: TraverseFieldsCallback\n callbackStack?: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n fields: (Field | TabAsField)[]\n fillEmpty?: boolean\n isTopLevel?: boolean\n /**\n * @default false\n *\n * if this is `true`, the callback functions of the leaf fields will be called before the parent fields.\n * The return value of the callback function will be ignored.\n */\n leavesFirst?: boolean\n parentIsLocalized?: boolean\n parentPath?: string\n parentRef?: Record<string, unknown> | unknown\n ref?: Record<string, unknown> | unknown\n}\n\n/**\n * Iterate a recurse an array of fields, calling a callback for each field\n *\n * @param fields\n * @param callback callback called for each field, discontinue looping if callback returns truthy\n * @param fillEmpty fill empty properties to use this without data\n * @param ref the data or any artifacts assigned in the callback during field recursion\n * @param parentRef the data or any artifacts assigned in the callback during field recursion one level up\n */\nexport const traverseFields = ({\n callback,\n callbackStack: _callbackStack = [],\n config,\n fields,\n fillEmpty = true,\n isTopLevel = true,\n leavesFirst = false,\n parentIsLocalized,\n parentPath = '',\n parentRef = {},\n ref = {},\n}: TraverseFieldsArgs): void => {\n const fieldsMatched = fields.some((field) => {\n let callbackStack: (() => ReturnType<TraverseFieldsCallback>)[] = []\n if (!isTopLevel) {\n callbackStack = _callbackStack\n }\n let skip = false\n const next = () => {\n skip = true\n }\n\n if (!ref || typeof ref !== 'object') {\n return\n }\n\n if (\n !leavesFirst &&\n callback &&\n callback({ field, next, parentIsLocalized: parentIsLocalized!, parentPath, parentRef, ref })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field,\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef,\n ref,\n }),\n )\n }\n\n if (skip) {\n return false\n }\n\n // avoid mutation of ref for all fields\n let currentRef = ref\n let currentParentRef = parentRef\n\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n let tabRef = ref\n\n if (skip) {\n return false\n }\n\n if ('name' in tab && tab.name) {\n if (\n !ref[tab.name as keyof typeof ref] ||\n typeof ref[tab.name as keyof typeof ref] !== 'object'\n ) {\n if (fillEmpty) {\n if (tab.localized) {\n ;(ref as Record<string, any>)[tab.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[tab.name] = {}\n }\n } else {\n continue\n }\n }\n\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n\n tabRef = tabRef[tab.name as keyof typeof tabRef]\n\n if (tab.localized) {\n for (const key in tabRef as Record<string, unknown>) {\n if (\n tabRef[key as keyof typeof tabRef] &&\n typeof tabRef[key as keyof typeof tabRef] === 'object'\n ) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: `${parentPath}${tab.name}.`,\n parentRef: currentParentRef,\n ref: tabRef[key as keyof typeof tabRef],\n })\n }\n }\n }\n } else {\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n }\n\n if (!tab.localized) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: false,\n parentPath: tabHasName(tab) ? `${parentPath}${tab.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n }\n\n if (skip) {\n return false\n }\n }\n\n return\n }\n\n if (field.type === 'tab' || fieldHasSubFields(field) || field.type === 'blocks') {\n if ('name' in field && field.name) {\n currentParentRef = currentRef\n if (!ref[field.name as keyof typeof ref]) {\n if (fillEmpty) {\n if (field.type === 'group' || field.type === 'tab') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! })) {\n ;(ref as Record<string, any>)[field.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[field.name] = {}\n }\n } else if (field.type === 'array' || field.type === 'blocks') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! })) {\n ;(ref as Record<string, any>)[field.name] = { en: [] }\n } else {\n ;(ref as Record<string, any>)[field.name] = []\n }\n }\n } else {\n return\n }\n }\n currentRef = ref[field.name as keyof typeof ref]\n }\n\n if (\n (field.type === 'tab' || field.type === 'group') &&\n fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! }) &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (fieldAffectsData(field)) {\n for (const key in currentRef as Record<string, unknown>) {\n if (currentRef[key as keyof typeof currentRef]) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef[key as keyof typeof currentRef],\n })\n }\n }\n } else {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n\n return\n }\n\n if (\n (field.type === 'blocks' || field.type === 'array') &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n // TODO: `?? field.localized ?? false` shouldn't be necessary, but right now it\n // is so that all fields are correctly traversed in copyToLocale and\n // therefore pass the localization integration tests.\n // I tried replacing the `!parentIsLocalized` condition with `parentIsLocalized === false`\n // in `fieldShouldBeLocalized`, but several tests failed. We must be calling it with incorrect\n // parameters somewhere.\n if (\n fieldShouldBeLocalized({\n field,\n parentIsLocalized: parentIsLocalized ?? false,\n })\n ) {\n if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n } else {\n for (const key in currentRef as Record<string, unknown>) {\n const localeData = currentRef[key as keyof typeof currentRef]\n if (!Array.isArray(localeData)) {\n continue\n }\n\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: localeData,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n }\n } else if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef as Record<string, unknown>[],\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n } else if (currentRef && typeof currentRef === 'object' && 'fields' in field) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath: 'name' in field && field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n }\n\n if (isTopLevel) {\n callbackStack.reverse().forEach((cb) => {\n cb()\n })\n }\n })\n\n // Fallback: Handle dot-notation paths when no fields matched\n if (!fieldsMatched && ref && typeof ref === 'object') {\n Object.keys(ref).forEach((key) => {\n if (key.includes('.')) {\n // Split on first dot only\n const firstDotIndex = key.indexOf('.')\n const fieldName = key.substring(0, firstDotIndex)\n const remainingPath = key.substring(firstDotIndex + 1)\n\n // Create nested structure for this field\n if (!ref[fieldName as keyof typeof ref]) {\n ;(ref as Record<string, unknown>)[fieldName] = {}\n }\n\n const nestedRef = ref[fieldName as keyof typeof ref] as Record<string, unknown>\n\n // Move the value to the nested structure\n nestedRef[remainingPath] = (ref as Record<string, unknown>)[key]\n delete (ref as Record<string, unknown>)[key]\n\n // Recursively process the newly created nested structure\n // The field traversal will naturally handle it if the field exists in the schema\n traverseFields({\n callback,\n callbackStack: _callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n ref,\n })\n }\n })\n }\n}\n"],"names":["fieldAffectsData","fieldHasSubFields","fieldShouldBeLocalized","tabHasName","traverseArrayOrBlocksField","callback","callbackStack","config","data","field","fillEmpty","leavesFirst","parentIsLocalized","parentPath","parentRef","type","traverseFields","fields","isTopLevel","localized","name","_block","blocks","block","find","b","slug","ref","blockType","_callbackStack","fieldsMatched","some","skip","next","push","currentRef","currentParentRef","tab","tabs","tabRef","en","key","Array","isArray","localeData","reverse","forEach","cb","Object","keys","includes","firstDotIndex","indexOf","fieldName","substring","remainingPath","nestedRef"],"mappings":"AAGA,SACEA,gBAAgB,EAChBC,iBAAiB,EACjBC,sBAAsB,EACtBC,UAAU,QACL,4BAA2B;AAElC,MAAMC,6BAA6B,CAAC,EAClCC,QAAQ,EACRC,aAAa,EACbC,MAAM,EACNC,IAAI,EACJC,KAAK,EACLC,SAAS,EACTC,WAAW,EACXC,iBAAiB,EACjBC,UAAU,EACVC,SAAS,EAYV;IACC,IAAIJ,WAAW;QACb,IAAID,MAAMM,IAAI,KAAK,SAAS;YAC1BC,eAAe;gBACbX;gBACAC;gBACAC;gBACAU,QAAQR,MAAMQ,MAAM;gBACpBC,YAAY;gBACZP;gBACAC,mBAAmBA,qBAAqBH,MAAMU,SAAS;gBACvDN,YAAY,GAAGA,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC;gBACzCN;YACF;QACF;QACA,IAAIL,MAAMM,IAAI,KAAK,UAAU;YAC3B,KAAK,MAAMM,UAAUZ,MAAMa,MAAM,CAAE;gBACjC,MAAMC,QACJ,OAAOF,WAAW,WAAWd,QAAQe,QAAQE,KAAK,CAACC,IAAMA,EAAEC,IAAI,KAAKL,UAAUA;gBAChF,IAAIE,OAAO;oBACTP,eAAe;wBACbX;wBACAC;wBACAC;wBACAU,QAAQM,MAAMN,MAAM;wBACpBC,YAAY;wBACZP;wBACAC,mBAAmBA,qBAAqBH,MAAMU,SAAS;wBACvDN,YAAY,GAAGA,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC;wBACzCN;oBACF;gBACF;YACF;QACF;QACA;IACF;IACA,KAAK,MAAMa,OAAOnB,KAAM;QACtB,IAAIS;QACJ,IAAIR,MAAMM,IAAI,KAAK,YAAY,OAAOY,KAAKC,cAAc,UAAU;YACjE,MAAML,QACJhB,QAAQe,QAAQE,KAAK,CAACC,IAAMA,EAAEC,IAAI,KAAKC,IAAIC,SAAS,KACpDnB,MAAMa,MAAM,CAACE,IAAI,CACf,CAACC,IAAkB,OAAOA,MAAM,YAAYA,EAAEC,IAAI,KAAKC,IAAIC,SAAS;YAGxEX,SAASM,OAAON;QAClB,OAAO,IAAIR,MAAMM,IAAI,KAAK,SAAS;YACjCE,SAASR,MAAMQ,MAAM;QACvB;QAEA,IAAIA,QAAQ;YACVD,eAAe;gBACbX;gBACAC;gBACAC;gBACAU;gBACAP;gBACAQ,YAAY;gBACZP;gBACAC,mBAAmBA,qBAAqBH,MAAMU,SAAS;gBACvDN,YAAY,GAAGA,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC;gBACzCN;gBACAa;YACF;QACF;IACF;AACF;AA2CA;;;;;;;;CAQC,GACD,OAAO,MAAMX,iBAAiB,CAAC,EAC7BX,QAAQ,EACRC,eAAeuB,iBAAiB,EAAE,EAClCtB,MAAM,EACNU,MAAM,EACNP,YAAY,IAAI,EAChBQ,aAAa,IAAI,EACjBP,cAAc,KAAK,EACnBC,iBAAiB,EACjBC,aAAa,EAAE,EACfC,YAAY,CAAC,CAAC,EACda,MAAM,CAAC,CAAC,EACW;IACnB,MAAMG,gBAAgBb,OAAOc,IAAI,CAAC,CAACtB;QACjC,IAAIH,gBAA8D,EAAE;QACpE,IAAI,CAACY,YAAY;YACfZ,gBAAgBuB;QAClB;QACA,IAAIG,OAAO;QACX,MAAMC,OAAO;YACXD,OAAO;QACT;QAEA,IAAI,CAACL,OAAO,OAAOA,QAAQ,UAAU;YACnC;QACF;QAEA,IACE,CAAChB,eACDN,YACAA,SAAS;YAAEI;YAAOwB;YAAMrB,mBAAmBA;YAAoBC;YAAYC;YAAWa;QAAI,IAC1F;YACA,OAAO;QACT,OAAO,IAAIhB,aAAa;YACtBL,cAAc4B,IAAI,CAAC,IACjB7B,SAAS;oBACPI;oBACAwB;oBACArB,mBAAmBA;oBACnBC;oBACAC;oBACAa;gBACF;QAEJ;QAEA,IAAIK,MAAM;YACR,OAAO;QACT;QAEA,uCAAuC;QACvC,IAAIG,aAAaR;QACjB,IAAIS,mBAAmBtB;QAEvB,IAAIL,MAAMM,IAAI,KAAK,UAAU,UAAUN,OAAO;YAC5C,KAAK,MAAM4B,OAAO5B,MAAM6B,IAAI,CAAE;gBAC5B,IAAIC,SAASZ;gBAEb,IAAIK,MAAM;oBACR,OAAO;gBACT;gBAEA,IAAI,UAAUK,OAAOA,IAAIjB,IAAI,EAAE;oBAC7B,IACE,CAACO,GAAG,CAACU,IAAIjB,IAAI,CAAqB,IAClC,OAAOO,GAAG,CAACU,IAAIjB,IAAI,CAAqB,KAAK,UAC7C;wBACA,IAAIV,WAAW;4BACb,IAAI2B,IAAIlB,SAAS,EAAE;;gCACfQ,GAA2B,CAACU,IAAIjB,IAAI,CAAC,GAAG;oCAAEoB,IAAI,CAAC;gCAAE;4BACrD,OAAO;;gCACHb,GAA2B,CAACU,IAAIjB,IAAI,CAAC,GAAG,CAAC;4BAC7C;wBACF,OAAO;4BACL;wBACF;oBACF;oBAEA,IACEf,YACA,CAACM,eACDN,SAAS;wBACPI,OAAO;4BAAE,GAAG4B,GAAG;4BAAEtB,MAAM;wBAAM;wBAC7BkB;wBACArB,mBAAmBA;wBACnBC;wBACAC,WAAWsB;wBACXT,KAAKY;oBACP,IACA;wBACA,OAAO;oBACT,OAAO,IAAI5B,aAAa;wBACtBL,cAAc4B,IAAI,CAAC,IACjB7B,SAAS;gCACPI,OAAO;oCAAE,GAAG4B,GAAG;oCAAEtB,MAAM;gCAAM;gCAC7BkB;gCACArB,mBAAmBA;gCACnBC;gCACAC,WAAWsB;gCACXT,KAAKY;4BACP;oBAEJ;oBAEAA,SAASA,MAAM,CAACF,IAAIjB,IAAI,CAAwB;oBAEhD,IAAIiB,IAAIlB,SAAS,EAAE;wBACjB,IAAK,MAAMsB,OAAOF,OAAmC;4BACnD,IACEA,MAAM,CAACE,IAA2B,IAClC,OAAOF,MAAM,CAACE,IAA2B,KAAK,UAC9C;gCACAzB,eAAe;oCACbX;oCACAC;oCACAC;oCACAU,QAAQoB,IAAIpB,MAAM;oCAClBP;oCACAQ,YAAY;oCACZP;oCACAC,mBAAmB;oCACnBC,YAAY,GAAGA,aAAawB,IAAIjB,IAAI,CAAC,CAAC,CAAC;oCACvCN,WAAWsB;oCACXT,KAAKY,MAAM,CAACE,IAA2B;gCACzC;4BACF;wBACF;oBACF;gBACF,OAAO;oBACL,IACEpC,YACA,CAACM,eACDN,SAAS;wBACPI,OAAO;4BAAE,GAAG4B,GAAG;4BAAEtB,MAAM;wBAAM;wBAC7BkB;wBACArB,mBAAmBA;wBACnBC;wBACAC,WAAWsB;wBACXT,KAAKY;oBACP,IACA;wBACA,OAAO;oBACT,OAAO,IAAI5B,aAAa;wBACtBL,cAAc4B,IAAI,CAAC,IACjB7B,SAAS;gCACPI,OAAO;oCAAE,GAAG4B,GAAG;oCAAEtB,MAAM;gCAAM;gCAC7BkB;gCACArB,mBAAmBA;gCACnBC;gCACAC,WAAWsB;gCACXT,KAAKY;4BACP;oBAEJ;gBACF;gBAEA,IAAI,CAACF,IAAIlB,SAAS,EAAE;oBAClBH,eAAe;wBACbX;wBACAC;wBACAC;wBACAU,QAAQoB,IAAIpB,MAAM;wBAClBP;wBACAQ,YAAY;wBACZP;wBACAC,mBAAmB;wBACnBC,YAAYV,WAAWkC,OAAO,GAAGxB,aAAawB,IAAIjB,IAAI,CAAC,CAAC,CAAC,GAAGP;wBAC5DC,WAAWsB;wBACXT,KAAKY;oBACP;gBACF;gBAEA,IAAIP,MAAM;oBACR,OAAO;gBACT;YACF;YAEA;QACF;QAEA,IAAIvB,MAAMM,IAAI,KAAK,SAASd,kBAAkBQ,UAAUA,MAAMM,IAAI,KAAK,UAAU;YAC/E,IAAI,UAAUN,SAASA,MAAMW,IAAI,EAAE;gBACjCgB,mBAAmBD;gBACnB,IAAI,CAACR,GAAG,CAAClB,MAAMW,IAAI,CAAqB,EAAE;oBACxC,IAAIV,WAAW;wBACb,IAAID,MAAMM,IAAI,KAAK,WAAWN,MAAMM,IAAI,KAAK,OAAO;4BAClD,IAAIb,uBAAuB;gCAAEO;gCAAOG,mBAAmBA;4BAAmB,IAAI;;gCAC1Ee,GAA2B,CAAClB,MAAMW,IAAI,CAAC,GAAG;oCAAEoB,IAAI,CAAC;gCAAE;4BACvD,OAAO;;gCACHb,GAA2B,CAAClB,MAAMW,IAAI,CAAC,GAAG,CAAC;4BAC/C;wBACF,OAAO,IAAIX,MAAMM,IAAI,KAAK,WAAWN,MAAMM,IAAI,KAAK,UAAU;4BAC5D,IAAIb,uBAAuB;gCAAEO;gCAAOG,mBAAmBA;4BAAmB,IAAI;;gCAC1Ee,GAA2B,CAAClB,MAAMW,IAAI,CAAC,GAAG;oCAAEoB,IAAI,EAAE;gCAAC;4BACvD,OAAO;;gCACHb,GAA2B,CAAClB,MAAMW,IAAI,CAAC,GAAG,EAAE;4BAChD;wBACF;oBACF,OAAO;wBACL;oBACF;gBACF;gBACAe,aAAaR,GAAG,CAAClB,MAAMW,IAAI,CAAqB;YAClD;YAEA,IACE,AAACX,CAAAA,MAAMM,IAAI,KAAK,SAASN,MAAMM,IAAI,KAAK,OAAM,KAC9Cb,uBAAuB;gBAAEO;gBAAOG,mBAAmBA;YAAmB,MACtEuB,cACA,OAAOA,eAAe,UACtB;gBACA,IAAInC,iBAAiBS,QAAQ;oBAC3B,IAAK,MAAMgC,OAAON,WAAuC;wBACvD,IAAIA,UAAU,CAACM,IAA+B,EAAE;4BAC9CzB,eAAe;gCACbX;gCACAC;gCACAC;gCACAU,QAAQR,MAAMQ,MAAM;gCACpBP;gCACAQ,YAAY;gCACZP;gCACAC,mBAAmB;gCACnBC,YAAYJ,MAAMW,IAAI,GAAG,GAAGP,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC,GAAGP;gCACzDC,WAAWsB;gCACXT,KAAKQ,UAAU,CAACM,IAA+B;4BACjD;wBACF;oBACF;gBACF,OAAO;oBACLzB,eAAe;wBACbX;wBACAC;wBACAC;wBACAU,QAAQR,MAAMQ,MAAM;wBACpBP;wBACAQ,YAAY;wBACZP;wBACAC;wBACAE,WAAWsB;wBACXT,KAAKQ;oBACP;gBACF;gBAEA;YACF;YAEA,IACE,AAAC1B,CAAAA,MAAMM,IAAI,KAAK,YAAYN,MAAMM,IAAI,KAAK,OAAM,KACjDoB,cACA,OAAOA,eAAe,UACtB;gBACA,+EAA+E;gBAC/E,oEAAoE;gBACpE,qDAAqD;gBACrD,0FAA0F;gBAC1F,8FAA8F;gBAC9F,wBAAwB;gBACxB,IACEjC,uBAAuB;oBACrBO;oBACAG,mBAAmBA,qBAAqB;gBAC1C,IACA;oBACA,IAAI8B,MAAMC,OAAO,CAACR,aAAa;wBAC7B/B,2BAA2B;4BACzBC;4BACAC;4BACAC;4BACAC,MAAM2B;4BACN1B;4BACAC;4BACAC;4BACAC,mBAAmB;4BACnBC;4BACAC,WAAWsB;wBACb;oBACF,OAAO;wBACL,IAAK,MAAMK,OAAON,WAAuC;4BACvD,MAAMS,aAAaT,UAAU,CAACM,IAA+B;4BAC7D,IAAI,CAACC,MAAMC,OAAO,CAACC,aAAa;gCAC9B;4BACF;4BAEAxC,2BAA2B;gCACzBC;gCACAC;gCACAC;gCACAC,MAAMoC;gCACNnC;gCACAC;gCACAC;gCACAC,mBAAmB;gCACnBC;gCACAC,WAAWsB;4BACb;wBACF;oBACF;gBACF,OAAO,IAAIM,MAAMC,OAAO,CAACR,aAAa;oBACpC/B,2BAA2B;wBACzBC;wBACAC;wBACAC;wBACAC,MAAM2B;wBACN1B;wBACAC;wBACAC;wBACAC,mBAAmBA;wBACnBC;wBACAC,WAAWsB;oBACb;gBACF;YACF,OAAO,IAAID,cAAc,OAAOA,eAAe,YAAY,YAAY1B,OAAO;gBAC5EO,eAAe;oBACbX;oBACAC;oBACAC;oBACAU,QAAQR,MAAMQ,MAAM;oBACpBP;oBACAQ,YAAY;oBACZP;oBACAC;oBACAC,YAAY,UAAUJ,SAASA,MAAMW,IAAI,GAAG,GAAGP,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC,GAAGP;oBAC5EC,WAAWsB;oBACXT,KAAKQ;gBACP;YACF;QACF;QAEA,IAAIjB,YAAY;YACdZ,cAAcuC,OAAO,GAAGC,OAAO,CAAC,CAACC;gBAC/BA;YACF;QACF;IACF;IAEA,6DAA6D;IAC7D,IAAI,CAACjB,iBAAiBH,OAAO,OAAOA,QAAQ,UAAU;QACpDqB,OAAOC,IAAI,CAACtB,KAAKmB,OAAO,CAAC,CAACL;YACxB,IAAIA,IAAIS,QAAQ,CAAC,MAAM;gBACrB,0BAA0B;gBAC1B,MAAMC,gBAAgBV,IAAIW,OAAO,CAAC;gBAClC,MAAMC,YAAYZ,IAAIa,SAAS,CAAC,GAAGH;gBACnC,MAAMI,gBAAgBd,IAAIa,SAAS,CAACH,gBAAgB;gBAEpD,yCAAyC;gBACzC,IAAI,CAACxB,GAAG,CAAC0B,UAA8B,EAAE;;oBACrC1B,GAA+B,CAAC0B,UAAU,GAAG,CAAC;gBAClD;gBAEA,MAAMG,YAAY7B,GAAG,CAAC0B,UAA8B;gBAEpD,yCAAyC;gBACzCG,SAAS,CAACD,cAAc,GAAG,AAAC5B,GAA+B,CAACc,IAAI;gBAChE,OAAO,AAACd,GAA+B,CAACc,IAAI;gBAE5C,yDAAyD;gBACzD,iFAAiF;gBACjFzB,eAAe;oBACbX;oBACAC,eAAeuB;oBACftB;oBACAU;oBACAP;oBACAQ,YAAY;oBACZP;oBACAC;oBACAC;oBACAC;oBACAa;gBACF;YACF;QACF;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/traverseFields.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../config/types.js'\nimport type { ArrayField, Block, BlocksField, Field, TabAsField } from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldShouldBeLocalized,\n tabHasName,\n} from '../fields/config/types.js'\n\nconst traverseArrayOrBlocksField = ({\n callback,\n callbackStack,\n config,\n data,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n}: {\n callback: TraverseFieldsCallback\n callbackStack: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n data: Record<string, unknown>[]\n field: ArrayField | BlocksField\n fillEmpty: boolean\n leavesFirst: boolean\n parentIsLocalized: boolean\n parentPath: string\n parentRef?: unknown\n}) => {\n if (fillEmpty) {\n if (field.type === 'array') {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n if (field.type === 'blocks') {\n for (const _block of field.blocks) {\n const block =\n typeof _block === 'string' ? config?.blocks?.find((b) => b.slug === _block) : _block\n if (block) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: block.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n }\n }\n return\n }\n for (const ref of data) {\n let fields!: Field[]\n if (field.type === 'blocks' && typeof ref?.blockType === 'string') {\n const block =\n config?.blocks?.find((b) => b.slug === ref.blockType) ??\n field.blocks.find((b): b is Block => typeof b !== 'string' && b.slug === ref.blockType)\n\n fields = block?.fields as Field[]\n } else if (field.type === 'array') {\n fields = field.fields\n }\n\n if (fields) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n ref,\n })\n }\n }\n}\n\nexport type TraverseFieldsCallback = (args: {\n /**\n * The current field\n */\n field: Field | TabAsField\n /**\n * Function that when called will skip the current field and continue to the next\n */\n next?: () => void\n parentIsLocalized: boolean\n parentPath: string\n /**\n * The parent reference object\n */\n parentRef?: Record<string, unknown> | unknown\n /**\n * The current reference object\n */\n ref?: Record<string, unknown> | unknown\n}) => boolean | void\n\ntype TraverseFieldsArgs = {\n callback: TraverseFieldsCallback\n callbackStack?: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n fields: (Field | TabAsField)[]\n fillEmpty?: boolean\n isTopLevel?: boolean\n /**\n * @default false\n *\n * if this is `true`, the callback functions of the leaf fields will be called before the parent fields.\n * The return value of the callback function will be ignored.\n */\n leavesFirst?: boolean\n parentIsLocalized?: boolean\n parentPath?: string\n parentRef?: Record<string, unknown> | unknown\n ref?: Record<string, unknown> | unknown\n}\n\n/**\n * Iterate a recurse an array of fields, calling a callback for each field\n *\n * @param fields\n * @param callback callback called for each field, discontinue looping if callback returns truthy\n * @param fillEmpty fill empty properties to use this without data\n * @param ref the data or any artifacts assigned in the callback during field recursion\n * @param parentRef the data or any artifacts assigned in the callback during field recursion one level up\n */\nexport const traverseFields = ({\n callback,\n callbackStack: _callbackStack = [],\n config,\n fields,\n fillEmpty = true,\n isTopLevel = true,\n leavesFirst = false,\n parentIsLocalized,\n parentPath = '',\n parentRef = {},\n ref = {},\n}: TraverseFieldsArgs): void => {\n const fieldsMatched = fields.some((field) => {\n let callbackStack: (() => ReturnType<TraverseFieldsCallback>)[] = []\n if (!isTopLevel) {\n callbackStack = _callbackStack\n }\n let skip = false\n const next = () => {\n skip = true\n }\n\n if (!ref || typeof ref !== 'object') {\n return\n }\n\n if (\n !leavesFirst &&\n callback &&\n callback({ field, next, parentIsLocalized: parentIsLocalized!, parentPath, parentRef, ref })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field,\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef,\n ref,\n }),\n )\n }\n\n if (skip) {\n return false\n }\n\n // avoid mutation of ref for all fields\n let currentRef = ref\n let currentParentRef = parentRef\n\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n let tabRef = ref\n\n if (skip) {\n return false\n }\n\n if ('name' in tab && tab.name) {\n if (\n !ref[tab.name as keyof typeof ref] ||\n typeof ref[tab.name as keyof typeof ref] !== 'object'\n ) {\n if (fillEmpty) {\n if (tab.localized) {\n ;(ref as Record<string, any>)[tab.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[tab.name] = {}\n }\n } else {\n continue\n }\n }\n\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n\n tabRef = tabRef[tab.name as keyof typeof tabRef]\n\n if (tab.localized) {\n for (const key in tabRef as Record<string, unknown>) {\n if (\n tabRef[key as keyof typeof tabRef] &&\n typeof tabRef[key as keyof typeof tabRef] === 'object'\n ) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: `${parentPath}${tab.name}.`,\n parentRef: currentParentRef,\n ref: tabRef[key as keyof typeof tabRef],\n })\n }\n }\n }\n } else {\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n }\n\n if (!tab.localized) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: false,\n parentPath: tabHasName(tab) ? `${parentPath}${tab.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n }\n\n if (skip) {\n return false\n }\n }\n\n return\n }\n\n if (field.type === 'tab' || fieldHasSubFields(field) || field.type === 'blocks') {\n if ('name' in field && field.name) {\n currentParentRef = currentRef\n if (!ref[field.name as keyof typeof ref]) {\n if (fillEmpty) {\n if (field.type === 'group' || field.type === 'tab') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! })) {\n ;(ref as Record<string, any>)[field.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[field.name] = {}\n }\n } else if (field.type === 'array' || field.type === 'blocks') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! })) {\n ;(ref as Record<string, any>)[field.name] = { en: [] }\n } else {\n ;(ref as Record<string, any>)[field.name] = []\n }\n }\n } else {\n return\n }\n }\n currentRef = ref[field.name as keyof typeof ref]\n }\n\n if (\n (field.type === 'tab' || field.type === 'group') &&\n fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! }) &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (fieldAffectsData(field)) {\n for (const key in currentRef as Record<string, unknown>) {\n if (currentRef[key as keyof typeof currentRef]) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef[key as keyof typeof currentRef],\n })\n }\n }\n } else {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n\n return\n }\n\n if (\n (field.type === 'blocks' || field.type === 'array') &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n // TODO: `?? field.localized ?? false` shouldn't be necessary, but right now it\n // is so that all fields are correctly traversed in copyToLocale and\n // therefore pass the localization integration tests.\n // I tried replacing the `!parentIsLocalized` condition with `parentIsLocalized === false`\n // in `fieldShouldBeLocalized`, but several tests failed. We must be calling it with incorrect\n // parameters somewhere.\n if (\n fieldShouldBeLocalized({\n field,\n parentIsLocalized: parentIsLocalized ?? false,\n })\n ) {\n if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n } else {\n for (const key in currentRef as Record<string, unknown>) {\n const localeData = currentRef[key as keyof typeof currentRef]\n if (!Array.isArray(localeData)) {\n continue\n }\n\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: localeData,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n }\n } else if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef as Record<string, unknown>[],\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n } else if (currentRef && typeof currentRef === 'object' && 'fields' in field) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath: 'name' in field && field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n }\n\n if (isTopLevel) {\n callbackStack.reverse().forEach((cb) => {\n cb()\n })\n }\n })\n\n // Fallback: Handle dot-notation paths when no fields matched\n if (!fieldsMatched && ref && typeof ref === 'object') {\n Object.keys(ref).forEach((key) => {\n if (key.includes('.')) {\n // Split on first dot only\n const firstDotIndex = key.indexOf('.')\n const fieldName = key.substring(0, firstDotIndex)\n const remainingPath = key.substring(firstDotIndex + 1)\n\n // Create nested structure for this field\n if (!ref[fieldName as keyof typeof ref]) {\n ;(ref as Record<string, unknown>)[fieldName] = {}\n }\n\n const nestedRef = ref[fieldName as keyof typeof ref] as Record<string, unknown>\n\n // Move the value to the nested structure\n nestedRef[remainingPath] = (ref as Record<string, unknown>)[key]\n delete (ref as Record<string, unknown>)[key]\n\n // Recursively process the newly created nested structure\n // The field traversal will naturally handle it if the field exists in the schema\n traverseFields({\n callback,\n callbackStack: _callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n ref,\n })\n }\n })\n }\n}\n"],"names":["fieldAffectsData","fieldHasSubFields","fieldShouldBeLocalized","tabHasName","traverseArrayOrBlocksField","callback","callbackStack","config","data","field","fillEmpty","leavesFirst","parentIsLocalized","parentPath","parentRef","type","traverseFields","fields","isTopLevel","localized","name","_block","blocks","block","find","b","slug","ref","blockType","_callbackStack","fieldsMatched","some","skip","next","push","currentRef","currentParentRef","tab","tabs","tabRef","en","key","Array","isArray","localeData","reverse","forEach","cb","Object","keys","includes","firstDotIndex","indexOf","fieldName","substring","remainingPath","nestedRef"],"mappings":"AAGA,SACEA,gBAAgB,EAChBC,iBAAiB,EACjBC,sBAAsB,EACtBC,UAAU,QACL,4BAA2B;AAElC,MAAMC,6BAA6B,CAAC,EAClCC,QAAQ,EACRC,aAAa,EACbC,MAAM,EACNC,IAAI,EACJC,KAAK,EACLC,SAAS,EACTC,WAAW,EACXC,iBAAiB,EACjBC,UAAU,EACVC,SAAS,EAYV;IACC,IAAIJ,WAAW;QACb,IAAID,MAAMM,IAAI,KAAK,SAAS;YAC1BC,eAAe;gBACbX;gBACAC;gBACAC;gBACAU,QAAQR,MAAMQ,MAAM;gBACpBC,YAAY;gBACZP;gBACAC,mBAAmBA,qBAAqBH,MAAMU,SAAS;gBACvDN,YAAY,GAAGA,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC;gBACzCN;YACF;QACF;QACA,IAAIL,MAAMM,IAAI,KAAK,UAAU;YAC3B,KAAK,MAAMM,UAAUZ,MAAMa,MAAM,CAAE;gBACjC,MAAMC,QACJ,OAAOF,WAAW,WAAWd,QAAQe,QAAQE,KAAK,CAACC,IAAMA,EAAEC,IAAI,KAAKL,UAAUA;gBAChF,IAAIE,OAAO;oBACTP,eAAe;wBACbX;wBACAC;wBACAC;wBACAU,QAAQM,MAAMN,MAAM;wBACpBC,YAAY;wBACZP;wBACAC,mBAAmBA,qBAAqBH,MAAMU,SAAS;wBACvDN,YAAY,GAAGA,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC;wBACzCN;oBACF;gBACF;YACF;QACF;QACA;IACF;IACA,KAAK,MAAMa,OAAOnB,KAAM;QACtB,IAAIS;QACJ,IAAIR,MAAMM,IAAI,KAAK,YAAY,OAAOY,KAAKC,cAAc,UAAU;YACjE,MAAML,QACJhB,QAAQe,QAAQE,KAAK,CAACC,IAAMA,EAAEC,IAAI,KAAKC,IAAIC,SAAS,KACpDnB,MAAMa,MAAM,CAACE,IAAI,CAAC,CAACC,IAAkB,OAAOA,MAAM,YAAYA,EAAEC,IAAI,KAAKC,IAAIC,SAAS;YAExFX,SAASM,OAAON;QAClB,OAAO,IAAIR,MAAMM,IAAI,KAAK,SAAS;YACjCE,SAASR,MAAMQ,MAAM;QACvB;QAEA,IAAIA,QAAQ;YACVD,eAAe;gBACbX;gBACAC;gBACAC;gBACAU;gBACAP;gBACAQ,YAAY;gBACZP;gBACAC,mBAAmBA,qBAAqBH,MAAMU,SAAS;gBACvDN,YAAY,GAAGA,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC;gBACzCN;gBACAa;YACF;QACF;IACF;AACF;AA2CA;;;;;;;;CAQC,GACD,OAAO,MAAMX,iBAAiB,CAAC,EAC7BX,QAAQ,EACRC,eAAeuB,iBAAiB,EAAE,EAClCtB,MAAM,EACNU,MAAM,EACNP,YAAY,IAAI,EAChBQ,aAAa,IAAI,EACjBP,cAAc,KAAK,EACnBC,iBAAiB,EACjBC,aAAa,EAAE,EACfC,YAAY,CAAC,CAAC,EACda,MAAM,CAAC,CAAC,EACW;IACnB,MAAMG,gBAAgBb,OAAOc,IAAI,CAAC,CAACtB;QACjC,IAAIH,gBAA8D,EAAE;QACpE,IAAI,CAACY,YAAY;YACfZ,gBAAgBuB;QAClB;QACA,IAAIG,OAAO;QACX,MAAMC,OAAO;YACXD,OAAO;QACT;QAEA,IAAI,CAACL,OAAO,OAAOA,QAAQ,UAAU;YACnC;QACF;QAEA,IACE,CAAChB,eACDN,YACAA,SAAS;YAAEI;YAAOwB;YAAMrB,mBAAmBA;YAAoBC;YAAYC;YAAWa;QAAI,IAC1F;YACA,OAAO;QACT,OAAO,IAAIhB,aAAa;YACtBL,cAAc4B,IAAI,CAAC,IACjB7B,SAAS;oBACPI;oBACAwB;oBACArB,mBAAmBA;oBACnBC;oBACAC;oBACAa;gBACF;QAEJ;QAEA,IAAIK,MAAM;YACR,OAAO;QACT;QAEA,uCAAuC;QACvC,IAAIG,aAAaR;QACjB,IAAIS,mBAAmBtB;QAEvB,IAAIL,MAAMM,IAAI,KAAK,UAAU,UAAUN,OAAO;YAC5C,KAAK,MAAM4B,OAAO5B,MAAM6B,IAAI,CAAE;gBAC5B,IAAIC,SAASZ;gBAEb,IAAIK,MAAM;oBACR,OAAO;gBACT;gBAEA,IAAI,UAAUK,OAAOA,IAAIjB,IAAI,EAAE;oBAC7B,IACE,CAACO,GAAG,CAACU,IAAIjB,IAAI,CAAqB,IAClC,OAAOO,GAAG,CAACU,IAAIjB,IAAI,CAAqB,KAAK,UAC7C;wBACA,IAAIV,WAAW;4BACb,IAAI2B,IAAIlB,SAAS,EAAE;;gCACfQ,GAA2B,CAACU,IAAIjB,IAAI,CAAC,GAAG;oCAAEoB,IAAI,CAAC;gCAAE;4BACrD,OAAO;;gCACHb,GAA2B,CAACU,IAAIjB,IAAI,CAAC,GAAG,CAAC;4BAC7C;wBACF,OAAO;4BACL;wBACF;oBACF;oBAEA,IACEf,YACA,CAACM,eACDN,SAAS;wBACPI,OAAO;4BAAE,GAAG4B,GAAG;4BAAEtB,MAAM;wBAAM;wBAC7BkB;wBACArB,mBAAmBA;wBACnBC;wBACAC,WAAWsB;wBACXT,KAAKY;oBACP,IACA;wBACA,OAAO;oBACT,OAAO,IAAI5B,aAAa;wBACtBL,cAAc4B,IAAI,CAAC,IACjB7B,SAAS;gCACPI,OAAO;oCAAE,GAAG4B,GAAG;oCAAEtB,MAAM;gCAAM;gCAC7BkB;gCACArB,mBAAmBA;gCACnBC;gCACAC,WAAWsB;gCACXT,KAAKY;4BACP;oBAEJ;oBAEAA,SAASA,MAAM,CAACF,IAAIjB,IAAI,CAAwB;oBAEhD,IAAIiB,IAAIlB,SAAS,EAAE;wBACjB,IAAK,MAAMsB,OAAOF,OAAmC;4BACnD,IACEA,MAAM,CAACE,IAA2B,IAClC,OAAOF,MAAM,CAACE,IAA2B,KAAK,UAC9C;gCACAzB,eAAe;oCACbX;oCACAC;oCACAC;oCACAU,QAAQoB,IAAIpB,MAAM;oCAClBP;oCACAQ,YAAY;oCACZP;oCACAC,mBAAmB;oCACnBC,YAAY,GAAGA,aAAawB,IAAIjB,IAAI,CAAC,CAAC,CAAC;oCACvCN,WAAWsB;oCACXT,KAAKY,MAAM,CAACE,IAA2B;gCACzC;4BACF;wBACF;oBACF;gBACF,OAAO;oBACL,IACEpC,YACA,CAACM,eACDN,SAAS;wBACPI,OAAO;4BAAE,GAAG4B,GAAG;4BAAEtB,MAAM;wBAAM;wBAC7BkB;wBACArB,mBAAmBA;wBACnBC;wBACAC,WAAWsB;wBACXT,KAAKY;oBACP,IACA;wBACA,OAAO;oBACT,OAAO,IAAI5B,aAAa;wBACtBL,cAAc4B,IAAI,CAAC,IACjB7B,SAAS;gCACPI,OAAO;oCAAE,GAAG4B,GAAG;oCAAEtB,MAAM;gCAAM;gCAC7BkB;gCACArB,mBAAmBA;gCACnBC;gCACAC,WAAWsB;gCACXT,KAAKY;4BACP;oBAEJ;gBACF;gBAEA,IAAI,CAACF,IAAIlB,SAAS,EAAE;oBAClBH,eAAe;wBACbX;wBACAC;wBACAC;wBACAU,QAAQoB,IAAIpB,MAAM;wBAClBP;wBACAQ,YAAY;wBACZP;wBACAC,mBAAmB;wBACnBC,YAAYV,WAAWkC,OAAO,GAAGxB,aAAawB,IAAIjB,IAAI,CAAC,CAAC,CAAC,GAAGP;wBAC5DC,WAAWsB;wBACXT,KAAKY;oBACP;gBACF;gBAEA,IAAIP,MAAM;oBACR,OAAO;gBACT;YACF;YAEA;QACF;QAEA,IAAIvB,MAAMM,IAAI,KAAK,SAASd,kBAAkBQ,UAAUA,MAAMM,IAAI,KAAK,UAAU;YAC/E,IAAI,UAAUN,SAASA,MAAMW,IAAI,EAAE;gBACjCgB,mBAAmBD;gBACnB,IAAI,CAACR,GAAG,CAAClB,MAAMW,IAAI,CAAqB,EAAE;oBACxC,IAAIV,WAAW;wBACb,IAAID,MAAMM,IAAI,KAAK,WAAWN,MAAMM,IAAI,KAAK,OAAO;4BAClD,IAAIb,uBAAuB;gCAAEO;gCAAOG,mBAAmBA;4BAAmB,IAAI;;gCAC1Ee,GAA2B,CAAClB,MAAMW,IAAI,CAAC,GAAG;oCAAEoB,IAAI,CAAC;gCAAE;4BACvD,OAAO;;gCACHb,GAA2B,CAAClB,MAAMW,IAAI,CAAC,GAAG,CAAC;4BAC/C;wBACF,OAAO,IAAIX,MAAMM,IAAI,KAAK,WAAWN,MAAMM,IAAI,KAAK,UAAU;4BAC5D,IAAIb,uBAAuB;gCAAEO;gCAAOG,mBAAmBA;4BAAmB,IAAI;;gCAC1Ee,GAA2B,CAAClB,MAAMW,IAAI,CAAC,GAAG;oCAAEoB,IAAI,EAAE;gCAAC;4BACvD,OAAO;;gCACHb,GAA2B,CAAClB,MAAMW,IAAI,CAAC,GAAG,EAAE;4BAChD;wBACF;oBACF,OAAO;wBACL;oBACF;gBACF;gBACAe,aAAaR,GAAG,CAAClB,MAAMW,IAAI,CAAqB;YAClD;YAEA,IACE,AAACX,CAAAA,MAAMM,IAAI,KAAK,SAASN,MAAMM,IAAI,KAAK,OAAM,KAC9Cb,uBAAuB;gBAAEO;gBAAOG,mBAAmBA;YAAmB,MACtEuB,cACA,OAAOA,eAAe,UACtB;gBACA,IAAInC,iBAAiBS,QAAQ;oBAC3B,IAAK,MAAMgC,OAAON,WAAuC;wBACvD,IAAIA,UAAU,CAACM,IAA+B,EAAE;4BAC9CzB,eAAe;gCACbX;gCACAC;gCACAC;gCACAU,QAAQR,MAAMQ,MAAM;gCACpBP;gCACAQ,YAAY;gCACZP;gCACAC,mBAAmB;gCACnBC,YAAYJ,MAAMW,IAAI,GAAG,GAAGP,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC,GAAGP;gCACzDC,WAAWsB;gCACXT,KAAKQ,UAAU,CAACM,IAA+B;4BACjD;wBACF;oBACF;gBACF,OAAO;oBACLzB,eAAe;wBACbX;wBACAC;wBACAC;wBACAU,QAAQR,MAAMQ,MAAM;wBACpBP;wBACAQ,YAAY;wBACZP;wBACAC;wBACAE,WAAWsB;wBACXT,KAAKQ;oBACP;gBACF;gBAEA;YACF;YAEA,IACE,AAAC1B,CAAAA,MAAMM,IAAI,KAAK,YAAYN,MAAMM,IAAI,KAAK,OAAM,KACjDoB,cACA,OAAOA,eAAe,UACtB;gBACA,+EAA+E;gBAC/E,oEAAoE;gBACpE,qDAAqD;gBACrD,0FAA0F;gBAC1F,8FAA8F;gBAC9F,wBAAwB;gBACxB,IACEjC,uBAAuB;oBACrBO;oBACAG,mBAAmBA,qBAAqB;gBAC1C,IACA;oBACA,IAAI8B,MAAMC,OAAO,CAACR,aAAa;wBAC7B/B,2BAA2B;4BACzBC;4BACAC;4BACAC;4BACAC,MAAM2B;4BACN1B;4BACAC;4BACAC;4BACAC,mBAAmB;4BACnBC;4BACAC,WAAWsB;wBACb;oBACF,OAAO;wBACL,IAAK,MAAMK,OAAON,WAAuC;4BACvD,MAAMS,aAAaT,UAAU,CAACM,IAA+B;4BAC7D,IAAI,CAACC,MAAMC,OAAO,CAACC,aAAa;gCAC9B;4BACF;4BAEAxC,2BAA2B;gCACzBC;gCACAC;gCACAC;gCACAC,MAAMoC;gCACNnC;gCACAC;gCACAC;gCACAC,mBAAmB;gCACnBC;gCACAC,WAAWsB;4BACb;wBACF;oBACF;gBACF,OAAO,IAAIM,MAAMC,OAAO,CAACR,aAAa;oBACpC/B,2BAA2B;wBACzBC;wBACAC;wBACAC;wBACAC,MAAM2B;wBACN1B;wBACAC;wBACAC;wBACAC,mBAAmBA;wBACnBC;wBACAC,WAAWsB;oBACb;gBACF;YACF,OAAO,IAAID,cAAc,OAAOA,eAAe,YAAY,YAAY1B,OAAO;gBAC5EO,eAAe;oBACbX;oBACAC;oBACAC;oBACAU,QAAQR,MAAMQ,MAAM;oBACpBP;oBACAQ,YAAY;oBACZP;oBACAC;oBACAC,YAAY,UAAUJ,SAASA,MAAMW,IAAI,GAAG,GAAGP,aAAaJ,MAAMW,IAAI,CAAC,CAAC,CAAC,GAAGP;oBAC5EC,WAAWsB;oBACXT,KAAKQ;gBACP;YACF;QACF;QAEA,IAAIjB,YAAY;YACdZ,cAAcuC,OAAO,GAAGC,OAAO,CAAC,CAACC;gBAC/BA;YACF;QACF;IACF;IAEA,6DAA6D;IAC7D,IAAI,CAACjB,iBAAiBH,OAAO,OAAOA,QAAQ,UAAU;QACpDqB,OAAOC,IAAI,CAACtB,KAAKmB,OAAO,CAAC,CAACL;YACxB,IAAIA,IAAIS,QAAQ,CAAC,MAAM;gBACrB,0BAA0B;gBAC1B,MAAMC,gBAAgBV,IAAIW,OAAO,CAAC;gBAClC,MAAMC,YAAYZ,IAAIa,SAAS,CAAC,GAAGH;gBACnC,MAAMI,gBAAgBd,IAAIa,SAAS,CAACH,gBAAgB;gBAEpD,yCAAyC;gBACzC,IAAI,CAACxB,GAAG,CAAC0B,UAA8B,EAAE;;oBACrC1B,GAA+B,CAAC0B,UAAU,GAAG,CAAC;gBAClD;gBAEA,MAAMG,YAAY7B,GAAG,CAAC0B,UAA8B;gBAEpD,yCAAyC;gBACzCG,SAAS,CAACD,cAAc,GAAG,AAAC5B,GAA+B,CAACc,IAAI;gBAChE,OAAO,AAACd,GAA+B,CAACc,IAAI;gBAE5C,yDAAyD;gBACzD,iFAAiF;gBACjFzB,eAAe;oBACbX;oBACAC,eAAeuB;oBACftB;oBACAU;oBACAP;oBACAQ,YAAY;oBACZP;oBACAC;oBACAC;oBACAC;oBACAa;gBACF;YACF;QACF;IACF;AACF,EAAC"}
@@ -1,7 +1,6 @@
1
- import type { CheckboxField, Field, Option } from '../fields/config/types.js';
1
+ import type { Field, Option } from '../fields/config/types.js';
2
2
  export declare const statuses: Option[];
3
3
  export declare const baseVersionFields: ({ localized }: {
4
4
  localized: boolean;
5
5
  }) => Field[];
6
- export declare const versionSnapshotField: CheckboxField;
7
6
  //# sourceMappingURL=baseFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"baseFields.d.ts","sourceRoot":"","sources":["../../src/versions/baseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAE7E,eAAO,MAAM,QAAQ,EAAE,MAAM,EAS5B,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,eAAe;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,KAAG,KAAK,EAgB9E,CAAA;AAOD,eAAO,MAAM,oBAAoB,EAAE,aAOlC,CAAA"}
1
+ {"version":3,"file":"baseFields.d.ts","sourceRoot":"","sources":["../../src/versions/baseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAE9D,eAAO,MAAM,QAAQ,EAAE,MAAM,EAS5B,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,eAAe;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,KAAG,KAAK,EAgB9E,CAAA"}
@@ -28,18 +28,5 @@ export const baseVersionFields = ({ localized })=>[
28
28
  options: statuses
29
29
  }
30
30
  ];
31
- // When publishing a specific locale,
32
- // we need to create a new draft which acts as a
33
- // "snapshot" to retain all existing draft data.
34
- // This field will be used to exclude any snapshot versions
35
- // from the admin Versions list
36
- export const versionSnapshotField = {
37
- name: 'snapshot',
38
- type: 'checkbox',
39
- admin: {
40
- disabled: true
41
- },
42
- index: true
43
- };
44
31
 
45
32
  //# sourceMappingURL=baseFields.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/versions/baseFields.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { CheckboxField, Field, Option } from '../fields/config/types.js'\n\nexport const statuses: Option[] = [\n {\n label: ({ t }) => t('version:draft'),\n value: 'draft',\n },\n {\n label: ({ t }) => t('version:published'),\n value: 'published',\n },\n]\n\nexport const baseVersionFields = ({ localized }: { localized: boolean }): Field[] => [\n {\n name: '_status',\n type: 'select',\n admin: {\n components: {\n Field: false,\n },\n disabled: { bulkEdit: true },\n },\n defaultValue: 'draft',\n index: true,\n label: ({ t }) => t('version:status'),\n localized: Boolean(localized),\n options: statuses,\n },\n]\n\n// When publishing a specific locale,\n// we need to create a new draft which acts as a\n// \"snapshot\" to retain all existing draft data.\n// This field will be used to exclude any snapshot versions\n// from the admin Versions list\nexport const versionSnapshotField: CheckboxField = {\n name: 'snapshot',\n type: 'checkbox',\n admin: {\n disabled: true,\n },\n index: true,\n}\n"],"names":["statuses","label","t","value","baseVersionFields","localized","name","type","admin","components","Field","disabled","bulkEdit","defaultValue","index","Boolean","options","versionSnapshotField"],"mappings":"AAAA,oBAAoB;AAGpB,OAAO,MAAMA,WAAqB;IAChC;QACEC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACEF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;CACD,CAAA;AAED,OAAO,MAAMC,oBAAoB,CAAC,EAAEC,SAAS,EAA0B,GAAc;QACnF;YACEC,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,YAAY;oBACVC,OAAO;gBACT;gBACAC,UAAU;oBAAEC,UAAU;gBAAK;YAC7B;YACAC,cAAc;YACdC,OAAO;YACPb,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;YACpBG,WAAWU,QAAQV;YACnBW,SAAShB;QACX;KACD,CAAA;AAED,qCAAqC;AACrC,gDAAgD;AAChD,gDAAgD;AAChD,2DAA2D;AAC3D,+BAA+B;AAC/B,OAAO,MAAMiB,uBAAsC;IACjDX,MAAM;IACNC,MAAM;IACNC,OAAO;QACLG,UAAU;IACZ;IACAG,OAAO;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/versions/baseFields.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { Field, Option } from '../fields/config/types.js'\n\nexport const statuses: Option[] = [\n {\n label: ({ t }) => t('version:draft'),\n value: 'draft',\n },\n {\n label: ({ t }) => t('version:published'),\n value: 'published',\n },\n]\n\nexport const baseVersionFields = ({ localized }: { localized: boolean }): Field[] => [\n {\n name: '_status',\n type: 'select',\n admin: {\n components: {\n Field: false,\n },\n disabled: { bulkEdit: true },\n },\n defaultValue: 'draft',\n index: true,\n label: ({ t }) => t('version:status'),\n localized: Boolean(localized),\n options: statuses,\n },\n]\n"],"names":["statuses","label","t","value","baseVersionFields","localized","name","type","admin","components","Field","disabled","bulkEdit","defaultValue","index","Boolean","options"],"mappings":"AAAA,oBAAoB;AAGpB,OAAO,MAAMA,WAAqB;IAChC;QACEC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACEF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;CACD,CAAA;AAED,OAAO,MAAMC,oBAAoB,CAAC,EAAEC,SAAS,EAA0B,GAAc;QACnF;YACEC,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,YAAY;oBACVC,OAAO;gBACT;gBACAC,UAAU;oBAAEC,UAAU;gBAAK;YAC7B;YACAC,cAAc;YACdC,OAAO;YACPb,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;YACpBG,WAAWU,QAAQV;YACnBW,SAAShB;QACX;KACD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildCollectionFields.d.ts","sourceRoot":"","sources":["../../src/versions/buildCollectionFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAKtE,eAAO,MAAM,4BAA4B,GAAI,CAAC,SAAS,OAAO,GAAG,KAAK,EACpE,QAAQ,eAAe,EACvB,YAAY,yBAAyB,EACrC,UAAU,CAAC,KACV,IAAI,SAAS,CAAC,GAAG,cAAc,EAAE,GAAG,KAAK,EA0E3C,CAAA"}
1
+ {"version":3,"file":"buildCollectionFields.d.ts","sourceRoot":"","sources":["../../src/versions/buildCollectionFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAItE,eAAO,MAAM,4BAA4B,GAAI,CAAC,SAAS,OAAO,GAAG,KAAK,EACpE,QAAQ,eAAe,EACvB,YAAY,yBAAyB,EACrC,UAAU,CAAC,KACV,IAAI,SAAS,CAAC,GAAG,cAAc,EAAE,GAAG,KAAK,EAwE3C,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import { hasAutosaveEnabled, hasDraftsEnabled } from '../utilities/getVersionsConfig.js';
2
- import { versionSnapshotField } from './baseFields.js';
3
2
  export const buildVersionCollectionFields = (config, collection, flatten)=>{
4
3
  const fields = [
5
4
  {
@@ -35,7 +34,6 @@ export const buildVersionCollectionFields = (config, collection, flatten)=>{
35
34
  ];
36
35
  if (hasDraftsEnabled(collection)) {
37
36
  if (config.localization) {
38
- fields.push(versionSnapshotField);
39
37
  fields.push({
40
38
  name: 'publishedLocale',
41
39
  type: 'select',