@depup/payload 3.82.0-depup.0 → 3.86.0-depup.5

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 (196) hide show
  1. package/README.md +16 -14
  2. package/bin.js +11 -0
  3. package/changes.json +26 -18
  4. package/dist/admin/fields/Row.d.ts +2 -2
  5. package/dist/admin/fields/Row.d.ts.map +1 -1
  6. package/dist/admin/fields/Row.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/views/index.d.ts +5 -1
  11. package/dist/admin/views/index.d.ts.map +1 -1
  12. package/dist/admin/views/index.js.map +1 -1
  13. package/dist/bin/generateImportMap/index.d.ts.map +1 -1
  14. package/dist/bin/generateImportMap/index.js +1 -0
  15. package/dist/bin/generateImportMap/index.js.map +1 -1
  16. package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
  17. package/dist/bin/generateImportMap/iterateCollections.js +11 -0
  18. package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
  19. package/dist/bin/index.d.ts.map +1 -1
  20. package/dist/bin/index.js +3 -1
  21. package/dist/bin/index.js.map +1 -1
  22. package/dist/collections/config/sanitize.d.ts +5 -0
  23. package/dist/collections/config/sanitize.d.ts.map +1 -1
  24. package/dist/collections/config/sanitize.js +21 -0
  25. package/dist/collections/config/sanitize.js.map +1 -1
  26. package/dist/collections/config/sanitize.spec.js +120 -0
  27. package/dist/collections/config/sanitize.spec.js.map +1 -0
  28. package/dist/collections/config/types.d.ts +24 -1
  29. package/dist/collections/config/types.d.ts.map +1 -1
  30. package/dist/collections/config/types.js.map +1 -1
  31. package/dist/collections/operations/create.d.ts.map +1 -1
  32. package/dist/collections/operations/create.js +1 -0
  33. package/dist/collections/operations/create.js.map +1 -1
  34. package/dist/collections/operations/delete.d.ts.map +1 -1
  35. package/dist/collections/operations/delete.js +3 -0
  36. package/dist/collections/operations/delete.js.map +1 -1
  37. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  38. package/dist/collections/operations/restoreVersion.js +1 -0
  39. package/dist/collections/operations/restoreVersion.js.map +1 -1
  40. package/dist/collections/operations/update.d.ts.map +1 -1
  41. package/dist/collections/operations/update.js +7 -2
  42. package/dist/collections/operations/update.js.map +1 -1
  43. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts +9 -0
  44. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts.map +1 -0
  45. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js +170 -0
  46. package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js.map +1 -0
  47. package/dist/collections/operations/utilities/update.d.ts.map +1 -1
  48. package/dist/collections/operations/utilities/update.js +16 -8
  49. package/dist/collections/operations/utilities/update.js.map +1 -1
  50. package/dist/config/build.js +5 -4
  51. package/dist/config/build.js.map +1 -1
  52. package/dist/config/definePlugin.d.ts +41 -0
  53. package/dist/config/definePlugin.d.ts.map +1 -0
  54. package/dist/config/definePlugin.js +34 -0
  55. package/dist/config/definePlugin.js.map +1 -0
  56. package/dist/config/orderable/index.d.ts.map +1 -1
  57. package/dist/config/orderable/index.js +23 -0
  58. package/dist/config/orderable/index.js.map +1 -1
  59. package/dist/config/types.d.ts +30 -2
  60. package/dist/config/types.d.ts.map +1 -1
  61. package/dist/config/types.js.map +1 -1
  62. package/dist/email/normalizeSendEmailOptions.d.ts +13 -0
  63. package/dist/email/normalizeSendEmailOptions.d.ts.map +1 -0
  64. package/dist/email/normalizeSendEmailOptions.js +20 -0
  65. package/dist/email/normalizeSendEmailOptions.js.map +1 -0
  66. package/dist/email/types.d.ts +7 -2
  67. package/dist/email/types.d.ts.map +1 -1
  68. package/dist/email/types.js.map +1 -1
  69. package/dist/errors/APIError.d.ts +2 -1
  70. package/dist/errors/APIError.d.ts.map +1 -1
  71. package/dist/errors/APIError.js +1 -3
  72. package/dist/errors/APIError.js.map +1 -1
  73. package/dist/errors/ValidationError.d.ts +3 -1
  74. package/dist/errors/ValidationError.d.ts.map +1 -1
  75. package/dist/errors/ValidationError.js +1 -3
  76. package/dist/errors/ValidationError.js.map +1 -1
  77. package/dist/fields/config/sanitize.d.ts.map +1 -1
  78. package/dist/fields/config/sanitize.js +3 -0
  79. package/dist/fields/config/sanitize.js.map +1 -1
  80. package/dist/fields/config/sanitize.spec.js +66 -0
  81. package/dist/fields/config/sanitize.spec.js.map +1 -1
  82. package/dist/fields/config/types.d.ts +3 -2
  83. package/dist/fields/config/types.d.ts.map +1 -1
  84. package/dist/fields/config/types.js.map +1 -1
  85. package/dist/fields/hooks/beforeValidate/promise.js +2 -2
  86. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  87. package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
  88. package/dist/globals/operations/restoreVersion.js +1 -0
  89. package/dist/globals/operations/restoreVersion.js.map +1 -1
  90. package/dist/index.bundled.d.ts +484 -115
  91. package/dist/index.d.ts +19 -1
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +16 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/queues/config/collection.d.ts.map +1 -1
  96. package/dist/queues/config/collection.js +0 -1
  97. package/dist/queues/config/collection.js.map +1 -1
  98. package/dist/queues/endpoints/run.d.ts.map +1 -1
  99. package/dist/queues/endpoints/run.js +0 -3
  100. package/dist/queues/endpoints/run.js.map +1 -1
  101. package/dist/queues/errors/calculateBackoffWaitUntil.d.ts.map +1 -1
  102. package/dist/queues/errors/calculateBackoffWaitUntil.js +5 -13
  103. package/dist/queues/errors/calculateBackoffWaitUntil.js.map +1 -1
  104. package/dist/queues/errors/handleWorkflowError.d.ts.map +1 -1
  105. package/dist/queues/errors/handleWorkflowError.js +9 -1
  106. package/dist/queues/errors/handleWorkflowError.js.map +1 -1
  107. package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.d.ts.map +1 -1
  108. package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.js +2 -1
  109. package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.js.map +1 -1
  110. package/dist/queues/operations/handleSchedules/defaultAfterSchedule.js +1 -1
  111. package/dist/queues/operations/handleSchedules/defaultAfterSchedule.js.map +1 -1
  112. package/dist/queues/operations/handleSchedules/index.d.ts.map +1 -1
  113. package/dist/queues/operations/handleSchedules/index.js +4 -1
  114. package/dist/queues/operations/handleSchedules/index.js.map +1 -1
  115. package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
  116. package/dist/queues/operations/runJobs/index.js +44 -26
  117. package/dist/queues/operations/runJobs/index.js.map +1 -1
  118. package/dist/queues/operations/runJobs/runJSONJob/index.d.ts.map +1 -1
  119. package/dist/queues/operations/runJobs/runJSONJob/index.js +1 -0
  120. package/dist/queues/operations/runJobs/runJSONJob/index.js.map +1 -1
  121. package/dist/queues/utilities/updateJob.d.ts.map +1 -1
  122. package/dist/queues/utilities/updateJob.js +2 -1
  123. package/dist/queues/utilities/updateJob.js.map +1 -1
  124. package/dist/types/index.d.ts +4 -6
  125. package/dist/types/index.d.ts.map +1 -1
  126. package/dist/types/index.js.map +1 -1
  127. package/dist/uploads/checkFileAccess.d.ts.map +1 -1
  128. package/dist/uploads/checkFileAccess.js +30 -9
  129. package/dist/uploads/checkFileAccess.js.map +1 -1
  130. package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
  131. package/dist/uploads/checkFileRestrictions.js +48 -8
  132. package/dist/uploads/checkFileRestrictions.js.map +1 -1
  133. package/dist/uploads/fetchAPI-multipart/isEligibleRequest.d.ts.map +1 -1
  134. package/dist/uploads/fetchAPI-multipart/isEligibleRequest.js +2 -1
  135. package/dist/uploads/fetchAPI-multipart/isEligibleRequest.js.map +1 -1
  136. package/dist/uploads/fetchAPI-multipart/isEligibleRequest.spec.js +29 -0
  137. package/dist/uploads/fetchAPI-multipart/isEligibleRequest.spec.js.map +1 -0
  138. package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
  139. package/dist/uploads/fetchAPI-multipart/processMultipart.js +11 -2
  140. package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
  141. package/dist/uploads/generateFileData.d.ts +2 -1
  142. package/dist/uploads/generateFileData.d.ts.map +1 -1
  143. package/dist/uploads/generateFileData.js +5 -2
  144. package/dist/uploads/generateFileData.js.map +1 -1
  145. package/dist/uploads/getSafeFilename.d.ts +9 -4
  146. package/dist/uploads/getSafeFilename.d.ts.map +1 -1
  147. package/dist/uploads/getSafeFilename.js +5 -5
  148. package/dist/uploads/getSafeFilename.js.map +1 -1
  149. package/dist/uploads/types.d.ts +4 -0
  150. package/dist/uploads/types.d.ts.map +1 -1
  151. package/dist/uploads/types.js.map +1 -1
  152. package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
  153. package/dist/utilities/addDataAndFileToRequest.js +16 -3
  154. package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
  155. package/dist/utilities/addDataAndFileToRequest.spec.js +41 -0
  156. package/dist/utilities/addDataAndFileToRequest.spec.js.map +1 -0
  157. package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
  158. package/dist/utilities/createPayloadRequest.js +1 -0
  159. package/dist/utilities/createPayloadRequest.js.map +1 -1
  160. package/dist/utilities/filterDataToSelectedLocales.d.ts.map +1 -1
  161. package/dist/utilities/filterDataToSelectedLocales.js +74 -31
  162. package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
  163. package/dist/utilities/filterDataToSelectedLocales.spec.js +337 -0
  164. package/dist/utilities/filterDataToSelectedLocales.spec.js.map +1 -1
  165. package/dist/utilities/formatErrors.d.ts +1 -1
  166. package/dist/utilities/formatErrors.d.ts.map +1 -1
  167. package/dist/utilities/formatErrors.js +4 -7
  168. package/dist/utilities/formatErrors.js.map +1 -1
  169. package/dist/utilities/formatErrors.spec.js +101 -0
  170. package/dist/utilities/formatErrors.spec.js.map +1 -0
  171. package/dist/utilities/isURLAllowed.d.ts.map +1 -1
  172. package/dist/utilities/isURLAllowed.js +9 -3
  173. package/dist/utilities/isURLAllowed.js.map +1 -1
  174. package/dist/utilities/isURLAllowed.spec.js +78 -0
  175. package/dist/utilities/isURLAllowed.spec.js.map +1 -0
  176. package/dist/utilities/parseParams/index.d.ts +1 -1
  177. package/dist/utilities/parseParams/index.d.ts.map +1 -1
  178. package/dist/utilities/parseParams/index.js +3 -0
  179. package/dist/utilities/parseParams/index.js.map +1 -1
  180. package/dist/utilities/parseParams/index.spec.js +24 -0
  181. package/dist/utilities/parseParams/index.spec.js.map +1 -1
  182. package/dist/utilities/profiling.d.ts +12 -0
  183. package/dist/utilities/profiling.d.ts.map +1 -0
  184. package/dist/utilities/profiling.js +56 -0
  185. package/dist/utilities/profiling.js.map +1 -0
  186. package/dist/utilities/profiling.spec.js +53 -0
  187. package/dist/utilities/profiling.spec.js.map +1 -0
  188. package/dist/versions/saveVersion.js +1 -1
  189. package/dist/versions/saveVersion.js.map +1 -1
  190. package/dist/versions/schedule/job.d.ts.map +1 -1
  191. package/dist/versions/schedule/job.js +4 -1
  192. package/dist/versions/schedule/job.js.map +1 -1
  193. package/dist/versions/updateLatestVersion.d.ts.map +1 -1
  194. package/dist/versions/updateLatestVersion.js +55 -8
  195. package/dist/versions/updateLatestVersion.js.map +1 -1
  196. package/package.json +44 -37
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/createPayloadRequest.ts"],"sourcesContent":["import { initI18n } from '@payloadcms/translations'\nimport * as qs from 'qs-esm'\n\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { TypedFallbackLocale } from '../index.js'\nimport type { CustomPayloadRequestProperties, PayloadRequest } from '../types/index.js'\n\nimport { executeAuthStrategies } from '../auth/executeAuthStrategies.js'\nimport { getDataLoader } from '../collections/dataloader.js'\nimport { getPayload } from '../index.js'\nimport { sanitizeLocales } from './addLocalesToRequest.js'\nimport { formatAdminURL } from './formatAdminURL.js'\nimport { getRequestLanguage } from './getRequestLanguage.js'\nimport { parseCookies } from './parseCookies.js'\n\ntype Args = {\n canSetHeaders?: boolean\n config: Promise<SanitizedConfig> | SanitizedConfig\n params?: {\n collection: string\n }\n payloadInstanceCacheKey?: string\n request: Request\n}\n\nexport const createPayloadRequest = async ({\n canSetHeaders,\n config: configPromise,\n params,\n payloadInstanceCacheKey,\n request,\n}: Args): Promise<PayloadRequest> => {\n const cookies = parseCookies(request.headers)\n const payload = await getPayload({\n config: configPromise,\n cron: true,\n key: payloadInstanceCacheKey,\n })\n\n const { config } = payload\n const localization = config.localization\n\n const urlProperties = new URL(request.url)\n const { pathname, searchParams } = urlProperties\n\n const isGraphQL =\n !config.graphQL.disable &&\n pathname ===\n formatAdminURL({\n apiRoute: config.routes.api,\n path: config.routes.graphQL as `/${string}`,\n })\n\n const language = getRequestLanguage({\n config,\n cookies,\n headers: request.headers,\n })\n\n const i18n = await initI18n({\n config: config.i18n,\n context: 'api',\n language,\n })\n\n let locale = searchParams.get('locale')\n\n const { search: queryToParse } = urlProperties\n\n const query = queryToParse\n ? qs.parse(queryToParse, {\n arrayLimit: 1000,\n depth: 10,\n ignoreQueryPrefix: true,\n })\n : {}\n\n const fallbackFromRequest = (query.fallbackLocale ||\n searchParams.get('fallback-locale') ||\n searchParams.get('fallbackLocale')) as TypedFallbackLocale\n\n let fallbackLocale = fallbackFromRequest\n\n if (localization) {\n const locales = sanitizeLocales({\n fallbackLocale: fallbackLocale!,\n locale: locale!,\n localization,\n })\n\n fallbackLocale = locales.fallbackLocale!\n locale = locales.locale!\n }\n\n const customRequest: CustomPayloadRequestProperties = {\n context: {},\n fallbackLocale: fallbackLocale!,\n hash: urlProperties.hash,\n host: urlProperties.host,\n href: urlProperties.href,\n i18n,\n locale,\n origin: urlProperties.origin,\n pathname: urlProperties.pathname,\n payload,\n payloadAPI: isGraphQL ? 'GraphQL' : 'REST',\n payloadDataLoader: undefined!,\n payloadUploadSizes: {},\n port: urlProperties.port,\n protocol: urlProperties.protocol,\n query,\n routeParams: params || {},\n search: urlProperties.search,\n searchParams: urlProperties.searchParams,\n t: i18n.t,\n transactionID: undefined,\n user: null,\n }\n\n const req: PayloadRequest = Object.assign(request, customRequest)\n\n req.payloadDataLoader = getDataLoader(req)\n\n const { responseHeaders, user } = await executeAuthStrategies({\n canSetHeaders,\n headers: req.headers,\n isGraphQL,\n payload,\n })\n\n req.user = user\n\n if (responseHeaders) {\n req.responseHeaders = responseHeaders\n }\n\n return req\n}\n"],"names":["initI18n","qs","executeAuthStrategies","getDataLoader","getPayload","sanitizeLocales","formatAdminURL","getRequestLanguage","parseCookies","createPayloadRequest","canSetHeaders","config","configPromise","params","payloadInstanceCacheKey","request","cookies","headers","payload","cron","key","localization","urlProperties","URL","url","pathname","searchParams","isGraphQL","graphQL","disable","apiRoute","routes","api","path","language","i18n","context","locale","get","search","queryToParse","query","parse","arrayLimit","depth","ignoreQueryPrefix","fallbackFromRequest","fallbackLocale","locales","customRequest","hash","host","href","origin","payloadAPI","payloadDataLoader","undefined","payloadUploadSizes","port","protocol","routeParams","t","transactionID","user","req","Object","assign","responseHeaders"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/createPayloadRequest.ts"],"sourcesContent":["import { initI18n } from '@payloadcms/translations'\nimport * as qs from 'qs-esm'\n\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { TypedFallbackLocale } from '../index.js'\nimport type { CustomPayloadRequestProperties, PayloadRequest } from '../types/index.js'\n\nimport { executeAuthStrategies } from '../auth/executeAuthStrategies.js'\nimport { getDataLoader } from '../collections/dataloader.js'\nimport { getPayload } from '../index.js'\nimport { sanitizeLocales } from './addLocalesToRequest.js'\nimport { formatAdminURL } from './formatAdminURL.js'\nimport { getRequestLanguage } from './getRequestLanguage.js'\nimport { parseCookies } from './parseCookies.js'\n\ntype Args = {\n canSetHeaders?: boolean\n config: Promise<SanitizedConfig> | SanitizedConfig\n params?: {\n collection: string\n }\n payloadInstanceCacheKey?: string\n request: Request\n}\n\nexport const createPayloadRequest = async ({\n canSetHeaders,\n config: configPromise,\n params,\n payloadInstanceCacheKey,\n request,\n}: Args): Promise<PayloadRequest> => {\n const cookies = parseCookies(request.headers)\n const payload = await getPayload({\n config: configPromise,\n cron: true,\n key: payloadInstanceCacheKey,\n })\n\n const { config } = payload\n const localization = config.localization\n\n const urlProperties = new URL(request.url)\n const { pathname, searchParams } = urlProperties\n\n const isGraphQL =\n !config.graphQL.disable &&\n pathname ===\n formatAdminURL({\n apiRoute: config.routes.api,\n path: config.routes.graphQL as `/${string}`,\n })\n\n const language = getRequestLanguage({\n config,\n cookies,\n headers: request.headers,\n })\n\n const i18n = await initI18n({\n config: config.i18n,\n context: 'api',\n language,\n })\n\n let locale = searchParams.get('locale')\n\n const { search: queryToParse } = urlProperties\n\n const query = queryToParse\n ? qs.parse(queryToParse, {\n allowEmptyArrays: true,\n arrayLimit: 1000,\n depth: 10,\n ignoreQueryPrefix: true,\n })\n : {}\n\n const fallbackFromRequest = (query.fallbackLocale ||\n searchParams.get('fallback-locale') ||\n searchParams.get('fallbackLocale')) as TypedFallbackLocale\n\n let fallbackLocale = fallbackFromRequest\n\n if (localization) {\n const locales = sanitizeLocales({\n fallbackLocale: fallbackLocale!,\n locale: locale!,\n localization,\n })\n\n fallbackLocale = locales.fallbackLocale!\n locale = locales.locale!\n }\n\n const customRequest: CustomPayloadRequestProperties = {\n context: {},\n fallbackLocale: fallbackLocale!,\n hash: urlProperties.hash,\n host: urlProperties.host,\n href: urlProperties.href,\n i18n,\n locale,\n origin: urlProperties.origin,\n pathname: urlProperties.pathname,\n payload,\n payloadAPI: isGraphQL ? 'GraphQL' : 'REST',\n payloadDataLoader: undefined!,\n payloadUploadSizes: {},\n port: urlProperties.port,\n protocol: urlProperties.protocol,\n query,\n routeParams: params || {},\n search: urlProperties.search,\n searchParams: urlProperties.searchParams,\n t: i18n.t,\n transactionID: undefined,\n user: null,\n }\n\n const req: PayloadRequest = Object.assign(request, customRequest)\n\n req.payloadDataLoader = getDataLoader(req)\n\n const { responseHeaders, user } = await executeAuthStrategies({\n canSetHeaders,\n headers: req.headers,\n isGraphQL,\n payload,\n })\n\n req.user = user\n\n if (responseHeaders) {\n req.responseHeaders = responseHeaders\n }\n\n return req\n}\n"],"names":["initI18n","qs","executeAuthStrategies","getDataLoader","getPayload","sanitizeLocales","formatAdminURL","getRequestLanguage","parseCookies","createPayloadRequest","canSetHeaders","config","configPromise","params","payloadInstanceCacheKey","request","cookies","headers","payload","cron","key","localization","urlProperties","URL","url","pathname","searchParams","isGraphQL","graphQL","disable","apiRoute","routes","api","path","language","i18n","context","locale","get","search","queryToParse","query","parse","allowEmptyArrays","arrayLimit","depth","ignoreQueryPrefix","fallbackFromRequest","fallbackLocale","locales","customRequest","hash","host","href","origin","payloadAPI","payloadDataLoader","undefined","payloadUploadSizes","port","protocol","routeParams","t","transactionID","user","req","Object","assign","responseHeaders"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"filterDataToSelectedLocales.d.ts","sourceRoot":"","sources":["../../src/utilities/filterDataToSelectedLocales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,KAAK,EAAkB,MAAM,2BAA2B,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAInD,KAAK,+BAA+B,GAAG;IACrC,qBAAqB,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IAChD,cAAc,EAAE,UAAU,CAAA;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,qBAAqB,EACrB,cAAc,EACd,MAAM,EACN,iBAAyB,EACzB,eAAe,GAChB,EAAE,+BAA+B,GAAG,UAAU,CA8K9C"}
1
+ {"version":3,"file":"filterDataToSelectedLocales.d.ts","sourceRoot":"","sources":["../../src/utilities/filterDataToSelectedLocales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,KAAK,EAAkB,MAAM,2BAA2B,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAInD,KAAK,+BAA+B,GAAG;IACrC,qBAAqB,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;IAChD,cAAc,EAAE,UAAU,CAAA;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAuBD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,qBAAqB,EACrB,cAAc,EACd,MAAM,EACN,iBAAyB,EACzB,eAAe,GAChB,EAAE,+BAA+B,GAAG,UAAU,CAkO9C"}
@@ -1,4 +1,16 @@
1
1
  import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js';
2
+ /**
3
+ * Filters a locale map to selected locales and applies a transform to each locale's value.
4
+ */ function filterLocaleMap(localeMap, selectedLocales, transform) {
5
+ const filtered = {};
6
+ const localesToInclude = selectedLocales && selectedLocales.length > 0 ? selectedLocales : Object.keys(localeMap);
7
+ for (const locale of localesToInclude){
8
+ if (locale in localeMap) {
9
+ filtered[locale] = transform(localeMap[locale]);
10
+ }
11
+ }
12
+ return Object.keys(filtered).length > 0 ? filtered : {};
13
+ }
2
14
  /**
3
15
  * Filters localized field data to only include specified locales.
4
16
  * For non-localized fields, returns all data as-is.
@@ -18,8 +30,22 @@ import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/
18
30
  switch(field.type){
19
31
  case 'array':
20
32
  {
21
- if (Array.isArray(docWithLocales[field.name])) {
22
- result[field.name] = docWithLocales[field.name].map((item)=>filterDataToSelectedLocales({
33
+ if (!(field.name in docWithLocales)) {
34
+ break;
35
+ }
36
+ const arrayValue = docWithLocales[field.name];
37
+ if (fieldIsLocalized) {
38
+ if (arrayValue && typeof arrayValue === 'object' && !Array.isArray(arrayValue)) {
39
+ result[field.name] = filterLocaleMap(arrayValue, selectedLocales, (localeRows)=>Array.isArray(localeRows) ? localeRows.map((item)=>filterDataToSelectedLocales({
40
+ configBlockReferences,
41
+ docWithLocales: item,
42
+ fields: field.fields,
43
+ parentIsLocalized: fieldIsLocalized,
44
+ selectedLocales
45
+ })) : localeRows);
46
+ }
47
+ } else if (Array.isArray(arrayValue)) {
48
+ result[field.name] = arrayValue.map((item)=>filterDataToSelectedLocales({
23
49
  configBlockReferences,
24
50
  docWithLocales: item,
25
51
  fields: field.fields,
@@ -31,8 +57,15 @@ import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/
31
57
  }
32
58
  case 'blocks':
33
59
  {
34
- if (field.name in docWithLocales && Array.isArray(docWithLocales[field.name])) {
35
- result[field.name] = docWithLocales[field.name].map((blockData)=>{
60
+ if (!(field.name in docWithLocales)) {
61
+ break;
62
+ }
63
+ const blocksValue = docWithLocales[field.name];
64
+ const processBlockRows = (rows)=>{
65
+ if (!Array.isArray(rows)) {
66
+ return rows;
67
+ }
68
+ return rows.map((blockData)=>{
36
69
  let block;
37
70
  if (configBlockReferences && field.blockReferences) {
38
71
  for (const blockOrReference of field.blockReferences){
@@ -62,20 +95,44 @@ import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/
62
95
  }
63
96
  return blockData;
64
97
  });
98
+ };
99
+ if (fieldIsLocalized) {
100
+ if (blocksValue && typeof blocksValue === 'object' && !Array.isArray(blocksValue)) {
101
+ result[field.name] = filterLocaleMap(blocksValue, selectedLocales, (localeRows)=>processBlockRows(localeRows));
102
+ }
103
+ } else if (Array.isArray(blocksValue)) {
104
+ result[field.name] = processBlockRows(blocksValue);
65
105
  }
66
106
  break;
67
107
  }
68
108
  case 'group':
69
109
  {
70
- // Named groups create a nested data structure
71
- if (fieldAffectsData(field) && field.name in docWithLocales && typeof docWithLocales[field.name] === 'object') {
72
- result[field.name] = filterDataToSelectedLocales({
73
- configBlockReferences,
74
- docWithLocales: docWithLocales[field.name],
75
- fields: field.fields,
76
- parentIsLocalized: fieldIsLocalized,
77
- selectedLocales
78
- });
110
+ if (field.name in docWithLocales && typeof docWithLocales[field.name] === 'object') {
111
+ const groupValue = docWithLocales[field.name];
112
+ if (fieldIsLocalized) {
113
+ if (groupValue && typeof groupValue === 'object' && !Array.isArray(groupValue)) {
114
+ result[field.name] = filterLocaleMap(groupValue, selectedLocales, (localeValue)=>{
115
+ if (localeValue && typeof localeValue === 'object' && !Array.isArray(localeValue)) {
116
+ return filterDataToSelectedLocales({
117
+ configBlockReferences,
118
+ docWithLocales: localeValue,
119
+ fields: field.fields,
120
+ parentIsLocalized: fieldIsLocalized,
121
+ selectedLocales
122
+ });
123
+ }
124
+ return localeValue;
125
+ });
126
+ }
127
+ } else if (typeof groupValue === 'object' && !Array.isArray(groupValue)) {
128
+ result[field.name] = filterDataToSelectedLocales({
129
+ configBlockReferences,
130
+ docWithLocales: groupValue,
131
+ fields: field.fields,
132
+ parentIsLocalized: fieldIsLocalized,
133
+ selectedLocales
134
+ });
135
+ }
79
136
  } else {
80
137
  // Unnamed groups pass through the same data level
81
138
  const nestedResult = filterDataToSelectedLocales({
@@ -91,28 +148,13 @@ import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/
91
148
  }
92
149
  default:
93
150
  {
94
- // For all other data-affecting fields (text, number, select, etc.)
95
151
  if (field.name in docWithLocales) {
96
152
  const value = docWithLocales[field.name];
97
- // If the field is localized and has locale data
98
- if (fieldIsLocalized && value && typeof value === 'object' && !Array.isArray(value)) {
99
- // If selectedLocales is provided, filter to only those locales
100
- if (selectedLocales && selectedLocales.length > 0) {
101
- const filtered = {};
102
- for (const locale of selectedLocales){
103
- if (locale in value) {
104
- filtered[locale] = value[locale];
105
- }
106
- }
107
- if (Object.keys(filtered).length > 0) {
108
- result[field.name] = filtered;
109
- }
110
- } else {
111
- // If no selectedLocales, include all locales
112
- result[field.name] = value;
153
+ if (fieldIsLocalized) {
154
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
155
+ result[field.name] = filterLocaleMap(value, selectedLocales, (localeValue)=>localeValue);
113
156
  }
114
157
  } else {
115
- // Non-localized field or non-object value
116
158
  result[field.name] = value;
117
159
  }
118
160
  }
@@ -123,6 +165,7 @@ import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/
123
165
  // Layout-only fields that don't affect data structure
124
166
  switch(field.type){
125
167
  case 'collapsible':
168
+ case 'group':
126
169
  case 'row':
127
170
  {
128
171
  // These pass through the same data level
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/filterDataToSelectedLocales.ts"],"sourcesContent":["import type { Block, Field, FlattenedBlock } from '../fields/config/types.js'\nimport type { SanitizedConfig } from '../index.js'\nimport type { JsonObject } from '../types/index.js'\n\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js'\n\ntype FilterDataToSelectedLocalesArgs = {\n configBlockReferences: SanitizedConfig['blocks']\n docWithLocales: JsonObject\n fields: Field[]\n parentIsLocalized?: boolean\n selectedLocales: string[]\n}\n\n/**\n * Filters localized field data to only include specified locales.\n * For non-localized fields, returns all data as-is.\n * For localized fields, if selectedLocales is provided, returns only those locales.\n * If selectedLocales is not provided and field is localized, returns all locales.\n */\nexport function filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields,\n parentIsLocalized = false,\n selectedLocales,\n}: FilterDataToSelectedLocalesArgs): JsonObject {\n if (!docWithLocales || typeof docWithLocales !== 'object') {\n return docWithLocales\n }\n\n const result: JsonObject = {}\n\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n const fieldIsLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n switch (field.type) {\n case 'array': {\n if (Array.isArray(docWithLocales[field.name])) {\n result[field.name] = docWithLocales[field.name].map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n }\n break\n }\n\n case 'blocks': {\n if (field.name in docWithLocales && Array.isArray(docWithLocales[field.name])) {\n result[field.name] = docWithLocales[field.name].map((blockData: JsonObject) => {\n let block: Block | FlattenedBlock | undefined\n if (configBlockReferences && field.blockReferences) {\n for (const blockOrReference of field.blockReferences) {\n if (typeof blockOrReference === 'string') {\n block = configBlockReferences.find((b) => b.slug === blockData.blockType)\n } else {\n block = blockOrReference\n }\n }\n } else if (field.blocks) {\n block = field.blocks.find((b) => b.slug === blockData.blockType)\n }\n\n if (block) {\n const filtered = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: blockData,\n fields: block?.fields || [],\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n\n // blockType, id, blockName are set by Payload internally\n // and not part of block.fields, so they must be preserved explicitly\n filtered.blockType = blockData.blockType\n filtered.id = blockData.id\n filtered.blockName = blockData.blockName\n\n return filtered\n }\n\n return blockData\n })\n }\n break\n }\n\n case 'group': {\n // Named groups create a nested data structure\n if (\n fieldAffectsData(field) &&\n field.name in docWithLocales &&\n typeof docWithLocales[field.name] === 'object'\n ) {\n result[field.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: docWithLocales[field.name] as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n } else {\n // Unnamed groups pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n break\n }\n\n default: {\n // For all other data-affecting fields (text, number, select, etc.)\n if (field.name in docWithLocales) {\n const value = docWithLocales[field.name]\n\n // If the field is localized and has locale data\n if (fieldIsLocalized && value && typeof value === 'object' && !Array.isArray(value)) {\n // If selectedLocales is provided, filter to only those locales\n if (selectedLocales && selectedLocales.length > 0) {\n const filtered: Record<string, unknown> = {}\n for (const locale of selectedLocales) {\n if (locale in value) {\n filtered[locale] = value[locale]\n }\n }\n if (Object.keys(filtered).length > 0) {\n result[field.name] = filtered\n }\n } else {\n // If no selectedLocales, include all locales\n result[field.name] = value\n }\n } else {\n // Non-localized field or non-object value\n result[field.name] = value\n }\n }\n break\n }\n }\n } else {\n // Layout-only fields that don't affect data structure\n switch (field.type) {\n case 'collapsible':\n case 'row': {\n // These pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n // Named tabs create a nested data structure\n if (tab.name in docWithLocales && typeof docWithLocales[tab.name] === 'object') {\n result[tab.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: docWithLocales[tab.name],\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed tabs pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n }\n break\n }\n }\n }\n }\n\n return result\n}\n"],"names":["fieldAffectsData","fieldShouldBeLocalized","tabHasName","filterDataToSelectedLocales","configBlockReferences","docWithLocales","fields","parentIsLocalized","selectedLocales","result","field","fieldIsLocalized","type","Array","isArray","name","map","item","blockData","block","blockReferences","blockOrReference","find","b","slug","blockType","blocks","filtered","id","blockName","nestedResult","Object","assign","value","length","locale","keys","tab","tabs"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/filterDataToSelectedLocales.ts"],"sourcesContent":["import type { Block, Field, FlattenedBlock } from '../fields/config/types.js'\nimport type { SanitizedConfig } from '../index.js'\nimport type { JsonObject } from '../types/index.js'\n\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../fields/config/types.js'\n\ntype FilterDataToSelectedLocalesArgs = {\n configBlockReferences: SanitizedConfig['blocks']\n docWithLocales: JsonObject\n fields: Field[]\n parentIsLocalized?: boolean\n selectedLocales: string[]\n}\n\n/**\n * Filters a locale map to selected locales and applies a transform to each locale's value.\n */\nfunction filterLocaleMap(\n localeMap: Record<string, unknown>,\n selectedLocales: string[],\n transform: (value: unknown) => unknown,\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {}\n const localesToInclude =\n selectedLocales && selectedLocales.length > 0 ? selectedLocales : Object.keys(localeMap)\n\n for (const locale of localesToInclude) {\n if (locale in localeMap) {\n filtered[locale] = transform(localeMap[locale])\n }\n }\n\n return Object.keys(filtered).length > 0 ? filtered : {}\n}\n\n/**\n * Filters localized field data to only include specified locales.\n * For non-localized fields, returns all data as-is.\n * For localized fields, if selectedLocales is provided, returns only those locales.\n * If selectedLocales is not provided and field is localized, returns all locales.\n */\nexport function filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields,\n parentIsLocalized = false,\n selectedLocales,\n}: FilterDataToSelectedLocalesArgs): JsonObject {\n if (!docWithLocales || typeof docWithLocales !== 'object') {\n return docWithLocales\n }\n\n const result: JsonObject = {}\n\n for (const field of fields) {\n if (fieldAffectsData(field)) {\n const fieldIsLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n switch (field.type) {\n case 'array': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const arrayValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (arrayValue && typeof arrayValue === 'object' && !Array.isArray(arrayValue)) {\n result[field.name] = filterLocaleMap(arrayValue, selectedLocales, (localeRows) =>\n Array.isArray(localeRows)\n ? localeRows.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n : localeRows,\n )\n }\n } else if (Array.isArray(arrayValue)) {\n result[field.name] = arrayValue.map((item: JsonObject) =>\n filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: item,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n }),\n )\n }\n\n break\n }\n\n case 'blocks': {\n if (!(field.name in docWithLocales)) {\n break\n }\n\n const blocksValue = docWithLocales[field.name]\n\n const processBlockRows = (rows: unknown): unknown => {\n if (!Array.isArray(rows)) {\n return rows\n }\n\n return rows.map((blockData: JsonObject) => {\n let block: Block | FlattenedBlock | undefined\n if (configBlockReferences && field.blockReferences) {\n for (const blockOrReference of field.blockReferences) {\n if (typeof blockOrReference === 'string') {\n block = configBlockReferences.find((b) => b.slug === blockData.blockType)\n } else {\n block = blockOrReference\n }\n }\n } else if (field.blocks) {\n block = field.blocks.find((b) => b.slug === blockData.blockType)\n }\n\n if (block) {\n const filtered = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: blockData,\n fields: block?.fields || [],\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n\n // blockType, id, blockName are set by Payload internally\n // and not part of block.fields, so they must be preserved explicitly\n filtered.blockType = blockData.blockType\n filtered.id = blockData.id\n filtered.blockName = blockData.blockName\n\n return filtered\n }\n\n return blockData\n })\n }\n\n if (fieldIsLocalized) {\n if (blocksValue && typeof blocksValue === 'object' && !Array.isArray(blocksValue)) {\n result[field.name] = filterLocaleMap(blocksValue, selectedLocales, (localeRows) =>\n processBlockRows(localeRows),\n )\n }\n } else if (Array.isArray(blocksValue)) {\n result[field.name] = processBlockRows(blocksValue)\n }\n\n break\n }\n\n case 'group': {\n if (field.name in docWithLocales && typeof docWithLocales[field.name] === 'object') {\n const groupValue = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (groupValue && typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterLocaleMap(groupValue, selectedLocales, (localeValue) => {\n if (\n localeValue &&\n typeof localeValue === 'object' &&\n !Array.isArray(localeValue)\n ) {\n return filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: localeValue as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n return localeValue\n })\n }\n } else if (typeof groupValue === 'object' && !Array.isArray(groupValue)) {\n result[field.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: groupValue as JsonObject,\n fields: field.fields,\n parentIsLocalized: fieldIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed groups pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n break\n }\n\n default: {\n if (field.name in docWithLocales) {\n const value = docWithLocales[field.name]\n\n if (fieldIsLocalized) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n result[field.name] = filterLocaleMap(\n value,\n selectedLocales,\n (localeValue) => localeValue,\n )\n }\n } else {\n result[field.name] = value\n }\n }\n break\n }\n }\n } else {\n // Layout-only fields that don't affect data structure\n switch (field.type) {\n case 'collapsible':\n case 'group':\n case 'row': {\n // These pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: field.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs) {\n if (tabHasName(tab)) {\n // Named tabs create a nested data structure\n if (tab.name in docWithLocales && typeof docWithLocales[tab.name] === 'object') {\n result[tab.name] = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales: docWithLocales[tab.name],\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n }\n } else {\n // Unnamed tabs pass through the same data level\n const nestedResult = filterDataToSelectedLocales({\n configBlockReferences,\n docWithLocales,\n fields: tab.fields,\n parentIsLocalized,\n selectedLocales,\n })\n Object.assign(result, nestedResult)\n }\n }\n break\n }\n }\n }\n }\n\n return result\n}\n"],"names":["fieldAffectsData","fieldShouldBeLocalized","tabHasName","filterLocaleMap","localeMap","selectedLocales","transform","filtered","localesToInclude","length","Object","keys","locale","filterDataToSelectedLocales","configBlockReferences","docWithLocales","fields","parentIsLocalized","result","field","fieldIsLocalized","type","name","arrayValue","Array","isArray","localeRows","map","item","blocksValue","processBlockRows","rows","blockData","block","blockReferences","blockOrReference","find","b","slug","blockType","blocks","id","blockName","groupValue","localeValue","nestedResult","assign","value","tab","tabs"],"mappings":"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"}
@@ -111,6 +111,7 @@ describe('filterDataToSelectedLocales', ()=>{
111
111
  configBlockReferences: [
112
112
  {
113
113
  slug: 'content',
114
+ flattenedFields: [],
114
115
  fields: [
115
116
  {
116
117
  name: 'body',
@@ -143,6 +144,342 @@ describe('filterDataToSelectedLocales', ()=>{
143
144
  });
144
145
  });
145
146
  });
147
+ describe('localized arrays', ()=>{
148
+ it('should filter localized array to selected locales and recurse into rows', ()=>{
149
+ const fields = [
150
+ {
151
+ name: 'items',
152
+ type: 'array',
153
+ localized: true,
154
+ fields: [
155
+ {
156
+ name: 'title',
157
+ type: 'text'
158
+ }
159
+ ]
160
+ }
161
+ ];
162
+ const docWithLocales = {
163
+ items: {
164
+ en: [
165
+ {
166
+ title: 'English Item'
167
+ }
168
+ ],
169
+ es: [
170
+ {
171
+ title: 'Spanish Item'
172
+ }
173
+ ],
174
+ de: [
175
+ {
176
+ title: 'German Item'
177
+ }
178
+ ]
179
+ }
180
+ };
181
+ const result = filterDataToSelectedLocales({
182
+ configBlockReferences: [],
183
+ docWithLocales,
184
+ fields,
185
+ selectedLocales
186
+ });
187
+ expect(result.items).toEqual({
188
+ en: [
189
+ {
190
+ title: 'English Item'
191
+ }
192
+ ]
193
+ });
194
+ });
195
+ it('should handle non-localized array with localized children', ()=>{
196
+ const fields = [
197
+ {
198
+ name: 'items',
199
+ type: 'array',
200
+ fields: [
201
+ {
202
+ name: 'label',
203
+ type: 'text',
204
+ localized: true
205
+ },
206
+ {
207
+ name: 'value',
208
+ type: 'text'
209
+ }
210
+ ]
211
+ }
212
+ ];
213
+ const docWithLocales = {
214
+ items: [
215
+ {
216
+ label: {
217
+ en: 'English',
218
+ es: 'Spanish'
219
+ },
220
+ value: 'one'
221
+ },
222
+ {
223
+ label: {
224
+ en: 'English 2',
225
+ es: 'Spanish 2'
226
+ },
227
+ value: 'two'
228
+ }
229
+ ]
230
+ };
231
+ const result = filterDataToSelectedLocales({
232
+ configBlockReferences: [],
233
+ docWithLocales,
234
+ fields,
235
+ selectedLocales
236
+ });
237
+ expect(result.items).toEqual([
238
+ {
239
+ label: {
240
+ en: 'English'
241
+ },
242
+ value: 'one'
243
+ },
244
+ {
245
+ label: {
246
+ en: 'English 2'
247
+ },
248
+ value: 'two'
249
+ }
250
+ ]);
251
+ });
252
+ });
253
+ describe('localized blocks', ()=>{
254
+ it('should filter localized blocks field to selected locales', ()=>{
255
+ const fields = [
256
+ {
257
+ name: 'layout',
258
+ type: 'blocks',
259
+ localized: true,
260
+ blocks: [
261
+ {
262
+ slug: 'hero',
263
+ fields: [
264
+ {
265
+ name: 'heading',
266
+ type: 'text'
267
+ }
268
+ ]
269
+ }
270
+ ]
271
+ }
272
+ ];
273
+ const docWithLocales = {
274
+ layout: {
275
+ en: [
276
+ {
277
+ blockType: 'hero',
278
+ id: '1',
279
+ blockName: 'Hero EN',
280
+ heading: 'Hello'
281
+ }
282
+ ],
283
+ es: [
284
+ {
285
+ blockType: 'hero',
286
+ id: '2',
287
+ blockName: 'Hero ES',
288
+ heading: 'Hola'
289
+ }
290
+ ],
291
+ de: [
292
+ {
293
+ blockType: 'hero',
294
+ id: '3',
295
+ blockName: 'Hero DE',
296
+ heading: 'Hallo'
297
+ }
298
+ ]
299
+ }
300
+ };
301
+ const result = filterDataToSelectedLocales({
302
+ configBlockReferences: [],
303
+ docWithLocales,
304
+ fields,
305
+ selectedLocales
306
+ });
307
+ expect(result.layout).toEqual({
308
+ en: [
309
+ {
310
+ blockType: 'hero',
311
+ id: '1',
312
+ blockName: 'Hero EN',
313
+ heading: 'Hello'
314
+ }
315
+ ]
316
+ });
317
+ });
318
+ it('should filter localized blocks with multiple selected locales', ()=>{
319
+ const fields = [
320
+ {
321
+ name: 'layout',
322
+ type: 'blocks',
323
+ localized: true,
324
+ blocks: [
325
+ {
326
+ slug: 'text',
327
+ fields: [
328
+ {
329
+ name: 'body',
330
+ type: 'text'
331
+ }
332
+ ]
333
+ }
334
+ ]
335
+ }
336
+ ];
337
+ const docWithLocales = {
338
+ layout: {
339
+ en: [
340
+ {
341
+ blockType: 'text',
342
+ id: '1',
343
+ blockName: 'Text EN',
344
+ body: 'English'
345
+ }
346
+ ],
347
+ es: [
348
+ {
349
+ blockType: 'text',
350
+ id: '2',
351
+ blockName: 'Text ES',
352
+ body: 'Spanish'
353
+ }
354
+ ],
355
+ de: [
356
+ {
357
+ blockType: 'text',
358
+ id: '3',
359
+ blockName: 'Text DE',
360
+ body: 'German'
361
+ }
362
+ ]
363
+ }
364
+ };
365
+ const result = filterDataToSelectedLocales({
366
+ configBlockReferences: [],
367
+ docWithLocales,
368
+ fields,
369
+ selectedLocales: [
370
+ 'en',
371
+ 'es'
372
+ ]
373
+ });
374
+ expect(result.layout).toEqual({
375
+ en: [
376
+ {
377
+ blockType: 'text',
378
+ id: '1',
379
+ blockName: 'Text EN',
380
+ body: 'English'
381
+ }
382
+ ],
383
+ es: [
384
+ {
385
+ blockType: 'text',
386
+ id: '2',
387
+ blockName: 'Text ES',
388
+ body: 'Spanish'
389
+ }
390
+ ]
391
+ });
392
+ });
393
+ });
394
+ describe('localized groups', ()=>{
395
+ it('should filter localized group to selected locales and recurse into children', ()=>{
396
+ const fields = [
397
+ {
398
+ name: 'meta',
399
+ type: 'group',
400
+ localized: true,
401
+ fields: [
402
+ {
403
+ name: 'title',
404
+ type: 'text'
405
+ },
406
+ {
407
+ name: 'description',
408
+ type: 'text'
409
+ }
410
+ ]
411
+ }
412
+ ];
413
+ const docWithLocales = {
414
+ meta: {
415
+ en: {
416
+ title: 'English Title',
417
+ description: 'English Desc'
418
+ },
419
+ es: {
420
+ title: 'Spanish Title',
421
+ description: 'Spanish Desc'
422
+ },
423
+ de: {
424
+ title: 'German Title',
425
+ description: 'German Desc'
426
+ }
427
+ }
428
+ };
429
+ const result = filterDataToSelectedLocales({
430
+ configBlockReferences: [],
431
+ docWithLocales,
432
+ fields,
433
+ selectedLocales
434
+ });
435
+ expect(result.meta).toEqual({
436
+ en: {
437
+ title: 'English Title',
438
+ description: 'English Desc'
439
+ }
440
+ });
441
+ });
442
+ it('should handle non-localized group with localized children', ()=>{
443
+ const fields = [
444
+ {
445
+ name: 'seo',
446
+ type: 'group',
447
+ fields: [
448
+ {
449
+ name: 'title',
450
+ type: 'text',
451
+ localized: true
452
+ },
453
+ {
454
+ name: 'slug',
455
+ type: 'text'
456
+ }
457
+ ]
458
+ }
459
+ ];
460
+ const docWithLocales = {
461
+ seo: {
462
+ title: {
463
+ en: 'English SEO',
464
+ es: 'Spanish SEO'
465
+ },
466
+ slug: 'my-page'
467
+ }
468
+ };
469
+ const result = filterDataToSelectedLocales({
470
+ configBlockReferences: [],
471
+ docWithLocales,
472
+ fields,
473
+ selectedLocales
474
+ });
475
+ expect(result.seo).toEqual({
476
+ title: {
477
+ en: 'English SEO'
478
+ },
479
+ slug: 'my-page'
480
+ });
481
+ });
482
+ });
146
483
  describe('simple fields', ()=>{
147
484
  it('should filter localized field values to selected locales', ()=>{
148
485
  const fields = [