@depup/payload 3.82.1-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.
- package/README.md +15 -13
- package/bin.js +11 -0
- package/changes.json +25 -17
- package/dist/admin/fields/Row.d.ts +2 -2
- package/dist/admin/fields/Row.d.ts.map +1 -1
- package/dist/admin/fields/Row.js.map +1 -1
- package/dist/admin/forms/Field.d.ts +1 -3
- package/dist/admin/forms/Field.d.ts.map +1 -1
- package/dist/admin/forms/Field.js.map +1 -1
- package/dist/admin/views/index.d.ts +5 -1
- package/dist/admin/views/index.d.ts.map +1 -1
- package/dist/admin/views/index.js.map +1 -1
- package/dist/bin/generateImportMap/index.d.ts.map +1 -1
- package/dist/bin/generateImportMap/index.js +1 -0
- package/dist/bin/generateImportMap/index.js.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.js +11 -0
- package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
- package/dist/bin/index.d.ts.map +1 -1
- package/dist/bin/index.js +3 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts +5 -0
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +21 -0
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/config/sanitize.spec.js +120 -0
- package/dist/collections/config/sanitize.spec.js.map +1 -0
- package/dist/collections/config/types.d.ts +24 -1
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +1 -0
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +3 -0
- package/dist/collections/operations/delete.js.map +1 -1
- package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/restoreVersion.js +1 -0
- package/dist/collections/operations/restoreVersion.js.map +1 -1
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +7 -2
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts +9 -0
- package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts.map +1 -0
- package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js +170 -0
- package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js.map +1 -0
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +16 -8
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/config/build.js +5 -4
- package/dist/config/build.js.map +1 -1
- package/dist/config/definePlugin.d.ts +41 -0
- package/dist/config/definePlugin.d.ts.map +1 -0
- package/dist/config/definePlugin.js +34 -0
- package/dist/config/definePlugin.js.map +1 -0
- package/dist/config/orderable/index.d.ts.map +1 -1
- package/dist/config/orderable/index.js +23 -0
- package/dist/config/orderable/index.js.map +1 -1
- package/dist/config/types.d.ts +30 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/email/normalizeSendEmailOptions.d.ts +13 -0
- package/dist/email/normalizeSendEmailOptions.d.ts.map +1 -0
- package/dist/email/normalizeSendEmailOptions.js +20 -0
- package/dist/email/normalizeSendEmailOptions.js.map +1 -0
- package/dist/email/types.d.ts +7 -2
- package/dist/email/types.d.ts.map +1 -1
- package/dist/email/types.js.map +1 -1
- package/dist/errors/APIError.d.ts +2 -1
- package/dist/errors/APIError.d.ts.map +1 -1
- package/dist/errors/APIError.js +1 -3
- package/dist/errors/APIError.js.map +1 -1
- package/dist/errors/ValidationError.d.ts +3 -1
- package/dist/errors/ValidationError.d.ts.map +1 -1
- package/dist/errors/ValidationError.js +1 -3
- package/dist/errors/ValidationError.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +3 -0
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/config/sanitize.spec.js +66 -0
- package/dist/fields/config/sanitize.spec.js.map +1 -1
- package/dist/fields/config/types.d.ts +3 -2
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +2 -2
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +1 -0
- package/dist/globals/operations/restoreVersion.js.map +1 -1
- package/dist/index.bundled.d.ts +484 -115
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/queues/config/collection.d.ts.map +1 -1
- package/dist/queues/config/collection.js +0 -1
- package/dist/queues/config/collection.js.map +1 -1
- package/dist/queues/endpoints/run.d.ts.map +1 -1
- package/dist/queues/endpoints/run.js +0 -3
- package/dist/queues/endpoints/run.js.map +1 -1
- package/dist/queues/errors/calculateBackoffWaitUntil.d.ts.map +1 -1
- package/dist/queues/errors/calculateBackoffWaitUntil.js +5 -13
- package/dist/queues/errors/calculateBackoffWaitUntil.js.map +1 -1
- package/dist/queues/errors/handleWorkflowError.d.ts.map +1 -1
- package/dist/queues/errors/handleWorkflowError.js +9 -1
- package/dist/queues/errors/handleWorkflowError.js.map +1 -1
- package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.d.ts.map +1 -1
- package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.js +2 -1
- package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.js.map +1 -1
- package/dist/queues/operations/handleSchedules/defaultAfterSchedule.js +1 -1
- package/dist/queues/operations/handleSchedules/defaultAfterSchedule.js.map +1 -1
- package/dist/queues/operations/handleSchedules/index.d.ts.map +1 -1
- package/dist/queues/operations/handleSchedules/index.js +4 -1
- package/dist/queues/operations/handleSchedules/index.js.map +1 -1
- package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/index.js +44 -26
- package/dist/queues/operations/runJobs/index.js.map +1 -1
- package/dist/queues/operations/runJobs/runJSONJob/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJSONJob/index.js +1 -0
- package/dist/queues/operations/runJobs/runJSONJob/index.js.map +1 -1
- package/dist/queues/utilities/updateJob.d.ts.map +1 -1
- package/dist/queues/utilities/updateJob.js +2 -1
- package/dist/queues/utilities/updateJob.js.map +1 -1
- package/dist/types/index.d.ts +4 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/checkFileAccess.d.ts.map +1 -1
- package/dist/uploads/checkFileAccess.js +30 -9
- package/dist/uploads/checkFileAccess.js.map +1 -1
- package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
- package/dist/uploads/checkFileRestrictions.js +48 -8
- package/dist/uploads/checkFileRestrictions.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.js +2 -1
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.spec.js +29 -0
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.spec.js.map +1 -0
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.js +11 -2
- package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts +2 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +5 -2
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getSafeFilename.d.ts +9 -4
- package/dist/uploads/getSafeFilename.d.ts.map +1 -1
- package/dist/uploads/getSafeFilename.js +5 -5
- package/dist/uploads/getSafeFilename.js.map +1 -1
- package/dist/uploads/types.d.ts +4 -0
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.js +16 -3
- package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.spec.js +41 -0
- package/dist/utilities/addDataAndFileToRequest.spec.js.map +1 -0
- package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
- package/dist/utilities/createPayloadRequest.js +1 -0
- package/dist/utilities/createPayloadRequest.js.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.d.ts.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.js +74 -31
- package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.spec.js +337 -0
- package/dist/utilities/filterDataToSelectedLocales.spec.js.map +1 -1
- package/dist/utilities/formatErrors.d.ts +1 -1
- package/dist/utilities/formatErrors.d.ts.map +1 -1
- package/dist/utilities/formatErrors.js +4 -7
- package/dist/utilities/formatErrors.js.map +1 -1
- package/dist/utilities/formatErrors.spec.js +101 -0
- package/dist/utilities/formatErrors.spec.js.map +1 -0
- package/dist/utilities/isURLAllowed.d.ts.map +1 -1
- package/dist/utilities/isURLAllowed.js +9 -3
- package/dist/utilities/isURLAllowed.js.map +1 -1
- package/dist/utilities/isURLAllowed.spec.js +78 -0
- package/dist/utilities/isURLAllowed.spec.js.map +1 -0
- package/dist/utilities/parseParams/index.d.ts +1 -1
- package/dist/utilities/parseParams/index.d.ts.map +1 -1
- package/dist/utilities/parseParams/index.js +3 -0
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/parseParams/index.spec.js +24 -0
- package/dist/utilities/parseParams/index.spec.js.map +1 -1
- package/dist/utilities/profiling.d.ts +12 -0
- package/dist/utilities/profiling.d.ts.map +1 -0
- package/dist/utilities/profiling.js +56 -0
- package/dist/utilities/profiling.js.map +1 -0
- package/dist/utilities/profiling.spec.js +53 -0
- package/dist/utilities/profiling.spec.js.map +1 -0
- package/dist/versions/saveVersion.js +1 -1
- package/dist/versions/saveVersion.js.map +1 -1
- package/dist/versions/schedule/job.d.ts.map +1 -1
- package/dist/versions/schedule/job.js +4 -1
- package/dist/versions/schedule/job.js.map +1 -1
- package/dist/versions/updateLatestVersion.d.ts.map +1 -1
- package/dist/versions/updateLatestVersion.js +55 -8
- package/dist/versions/updateLatestVersion.js.map +1 -1
- package/package.json +42 -35
|
@@ -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":"AAAA,SAASA,QAAQ,QAAQ,2BAA0B;AACnD,YAAYC,QAAQ,SAAQ;AAM5B,SAASC,qBAAqB,QAAQ,mCAAkC;AACxE,SAASC,aAAa,QAAQ,+BAA8B;AAC5D,SAASC,UAAU,QAAQ,cAAa;AACxC,SAASC,eAAe,QAAQ,2BAA0B;AAC1D,SAASC,cAAc,QAAQ,sBAAqB;AACpD,SAASC,kBAAkB,QAAQ,0BAAyB;AAC5D,SAASC,YAAY,QAAQ,oBAAmB;AAYhD,OAAO,MAAMC,uBAAuB,OAAO,EACzCC,aAAa,EACbC,QAAQC,aAAa,EACrBC,MAAM,EACNC,uBAAuB,EACvBC,OAAO,EACF;IACL,MAAMC,UAAUR,aAAaO,QAAQE,OAAO;IAC5C,MAAMC,UAAU,MAAMd,WAAW;QAC/BO,QAAQC;QACRO,MAAM;QACNC,KAAKN;IACP;IAEA,MAAM,EAAEH,MAAM,EAAE,GAAGO;IACnB,MAAMG,eAAeV,OAAOU,YAAY;IAExC,MAAMC,gBAAgB,IAAIC,IAAIR,QAAQS,GAAG;IACzC,MAAM,EAAEC,QAAQ,EAAEC,YAAY,EAAE,GAAGJ;IAEnC,MAAMK,YACJ,CAAChB,OAAOiB,OAAO,CAACC,OAAO,IACvBJ,aACEnB,eAAe;QACbwB,UAAUnB,OAAOoB,MAAM,CAACC,GAAG;QAC3BC,MAAMtB,OAAOoB,MAAM,CAACH,OAAO;IAC7B;IAEJ,MAAMM,WAAW3B,mBAAmB;QAClCI;QACAK;QACAC,SAASF,QAAQE,OAAO;IAC1B;IAEA,MAAMkB,OAAO,MAAMnC,SAAS;QAC1BW,QAAQA,OAAOwB,IAAI;QACnBC,SAAS;QACTF;IACF;IAEA,IAAIG,SAASX,aAAaY,GAAG,CAAC;IAE9B,MAAM,EAAEC,QAAQC,YAAY,EAAE,GAAGlB;IAEjC,MAAMmB,QAAQD,eACVvC,GAAGyC,KAAK,CAACF,cAAc;QACrBG,YAAY;QACZC,OAAO;QACPC,mBAAmB;IACrB,KACA,CAAC;IAEL,MAAMC,
|
|
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;
|
|
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 (
|
|
22
|
-
|
|
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
|
|
35
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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 = [
|