payload 3.36.0 → 3.37.0-internal.f2e6c68

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 (54) hide show
  1. package/dist/collections/operations/create.d.ts.map +1 -1
  2. package/dist/collections/operations/create.js +1 -0
  3. package/dist/collections/operations/create.js.map +1 -1
  4. package/dist/collections/operations/delete.d.ts.map +1 -1
  5. package/dist/collections/operations/delete.js +1 -0
  6. package/dist/collections/operations/delete.js.map +1 -1
  7. package/dist/collections/operations/deleteByID.d.ts.map +1 -1
  8. package/dist/collections/operations/deleteByID.js +1 -0
  9. package/dist/collections/operations/deleteByID.js.map +1 -1
  10. package/dist/collections/operations/find.d.ts.map +1 -1
  11. package/dist/collections/operations/find.js +1 -0
  12. package/dist/collections/operations/find.js.map +1 -1
  13. package/dist/collections/operations/findByID.d.ts.map +1 -1
  14. package/dist/collections/operations/findByID.js +1 -0
  15. package/dist/collections/operations/findByID.js.map +1 -1
  16. package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
  17. package/dist/collections/operations/findVersionByID.js +4 -1
  18. package/dist/collections/operations/findVersionByID.js.map +1 -1
  19. package/dist/collections/operations/findVersions.d.ts.map +1 -1
  20. package/dist/collections/operations/findVersions.js +3 -1
  21. package/dist/collections/operations/findVersions.js.map +1 -1
  22. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  23. package/dist/collections/operations/restoreVersion.js +1 -0
  24. package/dist/collections/operations/restoreVersion.js.map +1 -1
  25. package/dist/collections/operations/update.d.ts.map +1 -1
  26. package/dist/collections/operations/update.js +1 -0
  27. package/dist/collections/operations/update.js.map +1 -1
  28. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  29. package/dist/collections/operations/updateByID.js +1 -0
  30. package/dist/collections/operations/updateByID.js.map +1 -1
  31. package/dist/fields/validations.js +1 -1
  32. package/dist/fields/validations.js.map +1 -1
  33. package/dist/globals/operations/findOne.d.ts.map +1 -1
  34. package/dist/globals/operations/findOne.js +1 -0
  35. package/dist/globals/operations/findOne.js.map +1 -1
  36. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  37. package/dist/globals/operations/findVersionByID.js +4 -1
  38. package/dist/globals/operations/findVersionByID.js.map +1 -1
  39. package/dist/globals/operations/findVersions.d.ts.map +1 -1
  40. package/dist/globals/operations/findVersions.js +3 -1
  41. package/dist/globals/operations/findVersions.js.map +1 -1
  42. package/dist/globals/operations/update.d.ts.map +1 -1
  43. package/dist/globals/operations/update.js +1 -0
  44. package/dist/globals/operations/update.js.map +1 -1
  45. package/dist/uploads/generateFileData.d.ts.map +1 -1
  46. package/dist/uploads/generateFileData.js +4 -1
  47. package/dist/uploads/generateFileData.js.map +1 -1
  48. package/dist/uploads/getFileByPath.js +15 -14
  49. package/dist/uploads/getFileByPath.js.map +1 -1
  50. package/dist/utilities/sanitizeSelect.d.ts +4 -1
  51. package/dist/utilities/sanitizeSelect.d.ts.map +1 -1
  52. package/dist/utilities/sanitizeSelect.js +110 -3
  53. package/dist/utilities/sanitizeSelect.js.map +1 -1
  54. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/globals/operations/update.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { DeepPartial } from 'ts-essentials'\n\nimport type { GlobalSlug, JsonObject } from '../../index.js'\nimport type {\n Operation,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformGlobalWithSelect,\n Where,\n} from '../../types/index.js'\nimport type {\n DataFromGlobalSlug,\n SanitizedGlobalConfig,\n SelectFromGlobalSlug,\n} from '../config/types.js'\n\nimport executeAccess from '../../auth/executeAccess.js'\nimport { afterChange } from '../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../fields/hooks/beforeValidate/index.js'\nimport { deepCopyObjectSimple } from '../../index.js'\nimport { checkDocumentLockStatus } from '../../utilities/checkDocumentLockStatus.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { getSelectMode } from '../../utilities/getSelectMode.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { getLatestGlobalVersion } from '../../versions/getLatestGlobalVersion.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\n\ntype Args<TSlug extends GlobalSlug> = {\n autosave?: boolean\n data: DeepPartial<Omit<DataFromGlobalSlug<TSlug>, 'id'>>\n depth?: number\n disableTransaction?: boolean\n draft?: boolean\n globalConfig: SanitizedGlobalConfig\n overrideAccess?: boolean\n overrideLock?: boolean\n populate?: PopulateType\n publishSpecificLocale?: string\n req: PayloadRequest\n select?: SelectType\n showHiddenFields?: boolean\n slug: string\n}\n\nexport const updateOperation = async <\n TSlug extends GlobalSlug,\n TSelect extends SelectFromGlobalSlug<TSlug>,\n>(\n args: Args<TSlug>,\n): Promise<TransformGlobalWithSelect<TSlug, TSelect>> => {\n if (args.publishSpecificLocale) {\n args.req.locale = args.publishSpecificLocale\n }\n\n const {\n slug,\n autosave,\n depth,\n disableTransaction,\n draft: draftArg,\n globalConfig,\n overrideAccess,\n overrideLock,\n populate,\n publishSpecificLocale,\n req: { fallbackLocale, locale, payload },\n req,\n select: incomingSelect,\n showHiddenFields,\n } = args\n\n try {\n const shouldCommit = !disableTransaction && (await initTransaction(req))\n\n let { data } = args\n\n const shouldSaveDraft = Boolean(draftArg && globalConfig.versions?.drafts)\n\n // /////////////////////////////////////\n // 1. Retrieve and execute access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess(\n {\n data,\n req,\n },\n globalConfig.access.update,\n )\n : true\n\n // /////////////////////////////////////\n // Retrieve document\n // /////////////////////////////////////\n\n const query: Where = overrideAccess ? undefined : (accessResults as Where)\n\n // /////////////////////////////////////\n // 2. Retrieve document\n // /////////////////////////////////////\n const globalVersion = await getLatestGlobalVersion({\n slug,\n config: globalConfig,\n locale,\n payload,\n req,\n where: query,\n })\n const { global, globalExists } = globalVersion || {}\n\n let globalJSON: JsonObject = {}\n\n if (globalVersion && globalVersion.global) {\n globalJSON = deepCopyObjectSimple(global)\n\n if (globalJSON._id) {\n delete globalJSON._id\n }\n }\n\n const originalDoc = await afterRead({\n collection: null,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(globalJSON),\n draft: draftArg,\n fallbackLocale,\n global: globalConfig,\n locale,\n overrideAccess: true,\n req,\n showHiddenFields,\n })\n\n // ///////////////////////////////////////////\n // Handle potentially locked global documents\n // ///////////////////////////////////////////\n\n await checkDocumentLockStatus({\n globalSlug: slug,\n lockErrorMessage: `Global with slug \"${slug}\" is currently locked by another user and cannot be updated.`,\n overrideLock,\n req,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n data = await beforeValidate({\n collection: null,\n context: req.context,\n data,\n doc: originalDoc,\n global: globalConfig,\n operation: 'update',\n overrideAccess,\n req,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.beforeValidate?.length) {\n for (const hook of globalConfig.hooks.beforeValidate) {\n data =\n (await hook({\n context: req.context,\n data,\n global: globalConfig,\n originalDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.beforeChange?.length) {\n for (const hook of globalConfig.hooks.beforeChange) {\n data =\n (await hook({\n context: req.context,\n data,\n global: globalConfig,\n originalDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n let publishedDocWithLocales = globalJSON\n let versionSnapshotResult\n\n const beforeChangeArgs = {\n collection: null,\n context: req.context,\n data,\n doc: originalDoc,\n docWithLocales: undefined,\n global: globalConfig,\n operation: 'update' as Operation,\n req,\n skipValidation:\n shouldSaveDraft && globalConfig.versions.drafts && !globalConfig.versions.drafts.validate,\n }\n\n if (publishSpecificLocale) {\n const latestVersion = await getLatestGlobalVersion({\n slug,\n config: globalConfig,\n payload,\n published: true,\n req,\n where: query,\n })\n\n publishedDocWithLocales = latestVersion?.global || {}\n\n versionSnapshotResult = await beforeChange({\n ...beforeChangeArgs,\n docWithLocales: globalJSON,\n })\n }\n\n let result = await beforeChange({\n ...beforeChangeArgs,\n docWithLocales: publishedDocWithLocales,\n })\n\n // /////////////////////////////////////\n // Update\n // /////////////////////////////////////\n\n const select = sanitizeSelect({\n forceSelect: globalConfig.forceSelect,\n select: incomingSelect,\n })\n\n if (!shouldSaveDraft) {\n // Ensure global has createdAt\n if (!result.createdAt) {\n result.createdAt = new Date().toISOString()\n }\n\n if (globalExists) {\n result = await payload.db.updateGlobal({\n slug,\n data: result,\n req,\n select,\n })\n } else {\n result = await payload.db.createGlobal({\n slug,\n data: result,\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n if (globalConfig.versions) {\n const { globalType } = result\n result = await saveVersion({\n autosave,\n docWithLocales: result,\n draft: shouldSaveDraft,\n global: globalConfig,\n payload,\n publishSpecificLocale,\n req,\n select,\n snapshot: versionSnapshotResult,\n })\n\n result = {\n ...result,\n globalType,\n }\n }\n\n // /////////////////////////////////////\n // Execute globalType field if not selected\n // /////////////////////////////////////\n if (select && result.globalType) {\n const selectMode = getSelectMode(select)\n if (\n (selectMode === 'include' && !select['globalType']) ||\n (selectMode === 'exclude' && select['globalType'] === false)\n ) {\n delete result['globalType']\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: null,\n context: req.context,\n depth,\n doc: result,\n draft: draftArg,\n fallbackLocale: null,\n global: globalConfig,\n locale,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterRead?.length) {\n for (const hook of globalConfig.hooks.afterRead) {\n result =\n (await hook({\n context: req.context,\n doc: result,\n global: globalConfig,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: null,\n context: req.context,\n data,\n doc: result,\n global: globalConfig,\n operation: 'update',\n previousDoc: originalDoc,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterChange?.length) {\n for (const hook of globalConfig.hooks.afterChange) {\n result =\n (await hook({\n context: req.context,\n doc: result,\n global: globalConfig,\n previousDoc: originalDoc,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result as TransformGlobalWithSelect<TSlug, TSelect>\n } catch (error: unknown) {\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["executeAccess","afterChange","afterRead","beforeChange","beforeValidate","deepCopyObjectSimple","checkDocumentLockStatus","commitTransaction","getSelectMode","initTransaction","killTransaction","sanitizeSelect","getLatestGlobalVersion","saveVersion","updateOperation","args","publishSpecificLocale","req","locale","slug","autosave","depth","disableTransaction","draft","draftArg","globalConfig","overrideAccess","overrideLock","populate","fallbackLocale","payload","select","incomingSelect","showHiddenFields","shouldCommit","data","shouldSaveDraft","Boolean","versions","drafts","accessResults","access","update","query","undefined","globalVersion","config","where","global","globalExists","globalJSON","_id","originalDoc","collection","context","doc","globalSlug","lockErrorMessage","operation","hooks","length","hook","publishedDocWithLocales","versionSnapshotResult","beforeChangeArgs","docWithLocales","skipValidation","validate","latestVersion","published","result","forceSelect","createdAt","Date","toISOString","db","updateGlobal","createGlobal","globalType","snapshot","selectMode","previousDoc","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/globals/operations/update.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { DeepPartial } from 'ts-essentials'\n\nimport type { GlobalSlug, JsonObject } from '../../index.js'\nimport type {\n Operation,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformGlobalWithSelect,\n Where,\n} from '../../types/index.js'\nimport type {\n DataFromGlobalSlug,\n SanitizedGlobalConfig,\n SelectFromGlobalSlug,\n} from '../config/types.js'\n\nimport executeAccess from '../../auth/executeAccess.js'\nimport { afterChange } from '../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../fields/hooks/beforeValidate/index.js'\nimport { deepCopyObjectSimple } from '../../index.js'\nimport { checkDocumentLockStatus } from '../../utilities/checkDocumentLockStatus.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { getSelectMode } from '../../utilities/getSelectMode.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { getLatestGlobalVersion } from '../../versions/getLatestGlobalVersion.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\n\ntype Args<TSlug extends GlobalSlug> = {\n autosave?: boolean\n data: DeepPartial<Omit<DataFromGlobalSlug<TSlug>, 'id'>>\n depth?: number\n disableTransaction?: boolean\n draft?: boolean\n globalConfig: SanitizedGlobalConfig\n overrideAccess?: boolean\n overrideLock?: boolean\n populate?: PopulateType\n publishSpecificLocale?: string\n req: PayloadRequest\n select?: SelectType\n showHiddenFields?: boolean\n slug: string\n}\n\nexport const updateOperation = async <\n TSlug extends GlobalSlug,\n TSelect extends SelectFromGlobalSlug<TSlug>,\n>(\n args: Args<TSlug>,\n): Promise<TransformGlobalWithSelect<TSlug, TSelect>> => {\n if (args.publishSpecificLocale) {\n args.req.locale = args.publishSpecificLocale\n }\n\n const {\n slug,\n autosave,\n depth,\n disableTransaction,\n draft: draftArg,\n globalConfig,\n overrideAccess,\n overrideLock,\n populate,\n publishSpecificLocale,\n req: { fallbackLocale, locale, payload },\n req,\n select: incomingSelect,\n showHiddenFields,\n } = args\n\n try {\n const shouldCommit = !disableTransaction && (await initTransaction(req))\n\n let { data } = args\n\n const shouldSaveDraft = Boolean(draftArg && globalConfig.versions?.drafts)\n\n // /////////////////////////////////////\n // 1. Retrieve and execute access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess(\n {\n data,\n req,\n },\n globalConfig.access.update,\n )\n : true\n\n // /////////////////////////////////////\n // Retrieve document\n // /////////////////////////////////////\n\n const query: Where = overrideAccess ? undefined : (accessResults as Where)\n\n // /////////////////////////////////////\n // 2. Retrieve document\n // /////////////////////////////////////\n const globalVersion = await getLatestGlobalVersion({\n slug,\n config: globalConfig,\n locale,\n payload,\n req,\n where: query,\n })\n const { global, globalExists } = globalVersion || {}\n\n let globalJSON: JsonObject = {}\n\n if (globalVersion && globalVersion.global) {\n globalJSON = deepCopyObjectSimple(global)\n\n if (globalJSON._id) {\n delete globalJSON._id\n }\n }\n\n const originalDoc = await afterRead({\n collection: null,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(globalJSON),\n draft: draftArg,\n fallbackLocale,\n global: globalConfig,\n locale,\n overrideAccess: true,\n req,\n showHiddenFields,\n })\n\n // ///////////////////////////////////////////\n // Handle potentially locked global documents\n // ///////////////////////////////////////////\n\n await checkDocumentLockStatus({\n globalSlug: slug,\n lockErrorMessage: `Global with slug \"${slug}\" is currently locked by another user and cannot be updated.`,\n overrideLock,\n req,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n data = await beforeValidate({\n collection: null,\n context: req.context,\n data,\n doc: originalDoc,\n global: globalConfig,\n operation: 'update',\n overrideAccess,\n req,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.beforeValidate?.length) {\n for (const hook of globalConfig.hooks.beforeValidate) {\n data =\n (await hook({\n context: req.context,\n data,\n global: globalConfig,\n originalDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.beforeChange?.length) {\n for (const hook of globalConfig.hooks.beforeChange) {\n data =\n (await hook({\n context: req.context,\n data,\n global: globalConfig,\n originalDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n let publishedDocWithLocales = globalJSON\n let versionSnapshotResult\n\n const beforeChangeArgs = {\n collection: null,\n context: req.context,\n data,\n doc: originalDoc,\n docWithLocales: undefined,\n global: globalConfig,\n operation: 'update' as Operation,\n req,\n skipValidation:\n shouldSaveDraft && globalConfig.versions.drafts && !globalConfig.versions.drafts.validate,\n }\n\n if (publishSpecificLocale) {\n const latestVersion = await getLatestGlobalVersion({\n slug,\n config: globalConfig,\n payload,\n published: true,\n req,\n where: query,\n })\n\n publishedDocWithLocales = latestVersion?.global || {}\n\n versionSnapshotResult = await beforeChange({\n ...beforeChangeArgs,\n docWithLocales: globalJSON,\n })\n }\n\n let result = await beforeChange({\n ...beforeChangeArgs,\n docWithLocales: publishedDocWithLocales,\n })\n\n // /////////////////////////////////////\n // Update\n // /////////////////////////////////////\n\n const select = sanitizeSelect({\n fields: globalConfig.flattenedFields,\n forceSelect: globalConfig.forceSelect,\n select: incomingSelect,\n })\n\n if (!shouldSaveDraft) {\n // Ensure global has createdAt\n if (!result.createdAt) {\n result.createdAt = new Date().toISOString()\n }\n\n if (globalExists) {\n result = await payload.db.updateGlobal({\n slug,\n data: result,\n req,\n select,\n })\n } else {\n result = await payload.db.createGlobal({\n slug,\n data: result,\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n if (globalConfig.versions) {\n const { globalType } = result\n result = await saveVersion({\n autosave,\n docWithLocales: result,\n draft: shouldSaveDraft,\n global: globalConfig,\n payload,\n publishSpecificLocale,\n req,\n select,\n snapshot: versionSnapshotResult,\n })\n\n result = {\n ...result,\n globalType,\n }\n }\n\n // /////////////////////////////////////\n // Execute globalType field if not selected\n // /////////////////////////////////////\n if (select && result.globalType) {\n const selectMode = getSelectMode(select)\n if (\n (selectMode === 'include' && !select['globalType']) ||\n (selectMode === 'exclude' && select['globalType'] === false)\n ) {\n delete result['globalType']\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: null,\n context: req.context,\n depth,\n doc: result,\n draft: draftArg,\n fallbackLocale: null,\n global: globalConfig,\n locale,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterRead?.length) {\n for (const hook of globalConfig.hooks.afterRead) {\n result =\n (await hook({\n context: req.context,\n doc: result,\n global: globalConfig,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: null,\n context: req.context,\n data,\n doc: result,\n global: globalConfig,\n operation: 'update',\n previousDoc: originalDoc,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterChange?.length) {\n for (const hook of globalConfig.hooks.afterChange) {\n result =\n (await hook({\n context: req.context,\n doc: result,\n global: globalConfig,\n previousDoc: originalDoc,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result as TransformGlobalWithSelect<TSlug, TSelect>\n } catch (error: unknown) {\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["executeAccess","afterChange","afterRead","beforeChange","beforeValidate","deepCopyObjectSimple","checkDocumentLockStatus","commitTransaction","getSelectMode","initTransaction","killTransaction","sanitizeSelect","getLatestGlobalVersion","saveVersion","updateOperation","args","publishSpecificLocale","req","locale","slug","autosave","depth","disableTransaction","draft","draftArg","globalConfig","overrideAccess","overrideLock","populate","fallbackLocale","payload","select","incomingSelect","showHiddenFields","shouldCommit","data","shouldSaveDraft","Boolean","versions","drafts","accessResults","access","update","query","undefined","globalVersion","config","where","global","globalExists","globalJSON","_id","originalDoc","collection","context","doc","globalSlug","lockErrorMessage","operation","hooks","length","hook","publishedDocWithLocales","versionSnapshotResult","beforeChangeArgs","docWithLocales","skipValidation","validate","latestVersion","published","result","fields","flattenedFields","forceSelect","createdAt","Date","toISOString","db","updateGlobal","createGlobal","globalType","snapshot","selectMode","previousDoc","error"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAY,UAAU,EAAgC,MAAM,YAAY,CAAA;AAapF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAAU,CAAC,+IASrC,IAAI,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAoTpB,CAAA"}
1
+ {"version":3,"file":"generateFileData.d.ts","sourceRoot":"","sources":["../../src/uploads/generateFileData.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAY,UAAU,EAAgC,MAAM,YAAY,CAAA;AAapF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,GAAG,EAAE,cAAc,CAAA;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB,CAAC,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAAU,CAAC,+IASrC,IAAI,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAwTpB,CAAA"}
@@ -2,7 +2,7 @@
2
2
  import { fileTypeFromBuffer } from 'file-type';
3
3
  import fs from 'fs/promises';
4
4
  import sanitize from 'sanitize-filename';
5
- import { FileRetrievalError, FileUploadError, MissingFile } from '../errors/index.js';
5
+ import { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js';
6
6
  import { canResizeImage } from './canResizeImage.js';
7
7
  import { cropImage } from './cropImage.js';
8
8
  import { getExternalFile } from './getExternalFile.js';
@@ -33,6 +33,9 @@ export const generateFileData = async ({ collection: { config: collectionConfig
33
33
  const incomingFileData = isDuplicating ? originalDoc : data;
34
34
  if (!file && uploadEdits && incomingFileData) {
35
35
  const { filename, url } = incomingFileData;
36
+ if (filename && (filename.includes('../') || filename.includes('..\\'))) {
37
+ throw new Forbidden(req.t);
38
+ }
36
39
  try {
37
40
  if (url && url.startsWith('/') && !disableLocalStorage) {
38
41
  const filePath = `${staticPath}/${filename}`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, MissingFile } from '../errors/index.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { cropImage } from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName } from './getSafeFilename.js'\nimport { resizeAndTransformImageSizes } from './imageResizer.js'\nimport { isImage } from './isImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n isDuplicating,\n operation,\n originalDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n originalDoc,\n req,\n })\n\n const {\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData = isDuplicating ? originalDoc : data\n\n if (!file && uploadEdits && incomingFileData) {\n const { filename, url } = incomingFileData as FileData\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({\n data: incomingFileData as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath, { recursive: true })\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = ['image/avif', 'image/gif', 'image/webp'].includes(file.mimetype)\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (fileHasAdjustments) {\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = await fileTypeFromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop().split('?')[0]\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions,\n file,\n heightInPixels: uploadEdits.heightInPixels,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n const { focalPoint, sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n uploadEdits,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n req.payload.logger.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\n if (incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {\n return undefined\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX,\n y: incomingData?.focalY || origDoc.focalX,\n }\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","sanitize","FileRetrievalError","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","optionallyAppendMetadata","generateFileData","collection","config","collectionConfig","data","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","parseUploadEditsFromReqOrIncomingData","disableLocalStorage","focalPoint","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","filename","url","startsWith","filePath","response","uploadConfig","err","t","Error","message","undefined","mkdir","recursive","newData","filesToSave","fileData","fileIsAnimatedType","includes","mimetype","cropData","crop","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","heightInPixels","widthInPixels","resizedAfterCrop","fit","position","push","buffer","path","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","focalX","x","focalY","y","logger","error","args","query","incomingData","origDoc"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { cropImage } from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName } from './getSafeFilename.js'\nimport { resizeAndTransformImageSizes } from './imageResizer.js'\nimport { isImage } from './isImage.js'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n isDuplicating,\n operation,\n originalDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n originalDoc,\n req,\n })\n\n const {\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData = isDuplicating ? originalDoc : data\n\n if (!file && uploadEdits && incomingFileData) {\n const { filename, url } = incomingFileData as FileData\n\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({\n data: incomingFileData as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath, { recursive: true })\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = ['image/avif', 'image/gif', 'image/webp'].includes(file.mimetype)\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (fileHasAdjustments) {\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = await fileTypeFromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop().split('?')[0]\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions,\n file,\n heightInPixels: uploadEdits.heightInPixels,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n const { focalPoint, sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n uploadEdits,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n req.payload.logger.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\n if (incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {\n return undefined\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX,\n y: incomingData?.focalY || origDoc.focalX,\n }\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","sanitize","FileRetrievalError","FileUploadError","Forbidden","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","optionallyAppendMetadata","generateFileData","collection","config","collectionConfig","data","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","parseUploadEditsFromReqOrIncomingData","disableLocalStorage","focalPoint","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","filename","url","includes","t","startsWith","filePath","response","uploadConfig","err","Error","message","undefined","mkdir","recursive","newData","filesToSave","fileData","fileIsAnimatedType","mimetype","cropData","crop","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","heightInPixels","widthInPixels","resizedAfterCrop","fit","position","push","buffer","path","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","focalX","x","focalY","y","logger","error","args","query","incomingData","origDoc"],"mappings":"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"}
@@ -6,21 +6,22 @@ const mimeTypeEstimate = {
6
6
  svg: 'image/svg+xml'
7
7
  };
8
8
  export const getFileByPath = async (filePath)=>{
9
- if (typeof filePath === 'string') {
10
- const data = await fs.readFile(filePath);
11
- const mimetype = fileTypeFromFile(filePath);
12
- const { size } = await fs.stat(filePath);
13
- const name = path.basename(filePath);
14
- const ext = path.extname(filePath).slice(1);
15
- const mime = (await mimetype)?.mime || mimeTypeEstimate[ext];
16
- return {
17
- name,
18
- data,
19
- mimetype: mime,
20
- size
21
- };
9
+ if (typeof filePath !== 'string') {
10
+ return undefined;
22
11
  }
23
- return undefined;
12
+ const name = path.basename(filePath);
13
+ const ext = path.extname(filePath).slice(1);
14
+ const [data, stat, type] = await Promise.all([
15
+ fs.readFile(filePath),
16
+ fs.stat(filePath),
17
+ fileTypeFromFile(filePath)
18
+ ]);
19
+ return {
20
+ name,
21
+ data,
22
+ mimetype: type?.mime || mimeTypeEstimate[ext],
23
+ size: stat.size
24
+ };
24
25
  };
25
26
 
26
27
  //# sourceMappingURL=getFileByPath.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getFileByPath.ts"],"sourcesContent":["// @ts-strict-ignore\nimport { fileTypeFromFile } from 'file-type'\nimport fs from 'fs/promises'\nimport path from 'path'\n\nimport type { PayloadRequest } from '../types/index.js'\n\nconst mimeTypeEstimate = {\n svg: 'image/svg+xml',\n}\n\nexport const getFileByPath = async (filePath: string): Promise<PayloadRequest['file']> => {\n if (typeof filePath === 'string') {\n const data = await fs.readFile(filePath)\n const mimetype = fileTypeFromFile(filePath)\n const { size } = await fs.stat(filePath)\n\n const name = path.basename(filePath)\n const ext = path.extname(filePath).slice(1)\n\n const mime = (await mimetype)?.mime || mimeTypeEstimate[ext]\n\n return {\n name,\n data,\n mimetype: mime,\n size,\n }\n }\n\n return undefined\n}\n"],"names":["fileTypeFromFile","fs","path","mimeTypeEstimate","svg","getFileByPath","filePath","data","readFile","mimetype","size","stat","name","basename","ext","extname","slice","mime","undefined"],"mappings":"AAAA,oBAAoB;AACpB,SAASA,gBAAgB,QAAQ,YAAW;AAC5C,OAAOC,QAAQ,cAAa;AAC5B,OAAOC,UAAU,OAAM;AAIvB,MAAMC,mBAAmB;IACvBC,KAAK;AACP;AAEA,OAAO,MAAMC,gBAAgB,OAAOC;IAClC,IAAI,OAAOA,aAAa,UAAU;QAChC,MAAMC,OAAO,MAAMN,GAAGO,QAAQ,CAACF;QAC/B,MAAMG,WAAWT,iBAAiBM;QAClC,MAAM,EAAEI,IAAI,EAAE,GAAG,MAAMT,GAAGU,IAAI,CAACL;QAE/B,MAAMM,OAAOV,KAAKW,QAAQ,CAACP;QAC3B,MAAMQ,MAAMZ,KAAKa,OAAO,CAACT,UAAUU,KAAK,CAAC;QAEzC,MAAMC,OAAO,AAAC,CAAA,MAAMR,QAAO,GAAIQ,QAAQd,gBAAgB,CAACW,IAAI;QAE5D,OAAO;YACLF;YACAL;YACAE,UAAUQ;YACVP;QACF;IACF;IAEA,OAAOQ;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/uploads/getFileByPath.ts"],"sourcesContent":["// @ts-strict-ignore\nimport { fileTypeFromFile } from 'file-type'\nimport fs from 'fs/promises'\nimport path from 'path'\n\nimport type { PayloadRequest } from '../types/index.js'\n\nconst mimeTypeEstimate: Record<string, string> = {\n svg: 'image/svg+xml',\n}\n\nexport const getFileByPath = async (filePath: string): Promise<PayloadRequest['file']> => {\n if (typeof filePath !== 'string') {\n return undefined\n }\n\n const name = path.basename(filePath)\n const ext = path.extname(filePath).slice(1)\n\n const [data, stat, type] = await Promise.all([\n fs.readFile(filePath),\n fs.stat(filePath),\n fileTypeFromFile(filePath),\n ])\n\n return {\n name,\n data,\n mimetype: type?.mime || mimeTypeEstimate[ext],\n size: stat.size,\n }\n}\n"],"names":["fileTypeFromFile","fs","path","mimeTypeEstimate","svg","getFileByPath","filePath","undefined","name","basename","ext","extname","slice","data","stat","type","Promise","all","readFile","mimetype","mime","size"],"mappings":"AAAA,oBAAoB;AACpB,SAASA,gBAAgB,QAAQ,YAAW;AAC5C,OAAOC,QAAQ,cAAa;AAC5B,OAAOC,UAAU,OAAM;AAIvB,MAAMC,mBAA2C;IAC/CC,KAAK;AACP;AAEA,OAAO,MAAMC,gBAAgB,OAAOC;IAClC,IAAI,OAAOA,aAAa,UAAU;QAChC,OAAOC;IACT;IAEA,MAAMC,OAAON,KAAKO,QAAQ,CAACH;IAC3B,MAAMI,MAAMR,KAAKS,OAAO,CAACL,UAAUM,KAAK,CAAC;IAEzC,MAAM,CAACC,MAAMC,MAAMC,KAAK,GAAG,MAAMC,QAAQC,GAAG,CAAC;QAC3ChB,GAAGiB,QAAQ,CAACZ;QACZL,GAAGa,IAAI,CAACR;QACRN,iBAAiBM;KAClB;IAED,OAAO;QACLE;QACAK;QACAM,UAAUJ,MAAMK,QAAQjB,gBAAgB,CAACO,IAAI;QAC7CW,MAAMP,KAAKO,IAAI;IACjB;AACF,EAAC"}
@@ -1,6 +1,9 @@
1
+ import type { FlattenedField } from '../fields/config/types.js';
1
2
  import type { SelectType } from '../types/index.js';
2
- export declare const sanitizeSelect: ({ forceSelect, select, }: {
3
+ export declare const sanitizeSelect: ({ fields, forceSelect, select, versions, }: {
4
+ fields: FlattenedField[];
3
5
  forceSelect?: SelectType;
4
6
  select?: SelectType;
7
+ versions?: boolean;
5
8
  }) => SelectType | undefined;
6
9
  //# sourceMappingURL=sanitizeSelect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeSelect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAInD,eAAO,MAAM,cAAc,6BAGxB;IACD,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB,KAAG,UAAU,GAAG,SAYhB,CAAA"}
1
+ {"version":3,"file":"sanitizeSelect.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeSelect.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,EAAqB,UAAU,EAAE,MAAM,mBAAmB,CAAA;AA+GtE,eAAO,MAAM,cAAc,+CAKxB;IACD,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,KAAG,UAAU,GAAG,SA2ChB,CAAA"}
@@ -1,14 +1,121 @@
1
1
  import { deepMergeSimple } from '@payloadcms/translations/utilities';
2
2
  import { getSelectMode } from './getSelectMode.js';
3
- export const sanitizeSelect = ({ forceSelect, select })=>{
4
- if (!forceSelect || !select) {
3
+ // Transform post.title -> post, post.category.title -> post
4
+ const stripVirtualPathToCurrentCollection = ({ fields, path, versions })=>{
5
+ const resultSegments = [];
6
+ if (versions) {
7
+ resultSegments.push('version');
8
+ const versionField = fields.find((each)=>each.name === 'version');
9
+ if (versionField && versionField.type === 'group') {
10
+ fields = versionField.flattenedFields;
11
+ }
12
+ }
13
+ for (const segment of path.split('.')){
14
+ const field = fields.find((each)=>each.name === segment);
15
+ if (!field) {
16
+ continue;
17
+ }
18
+ resultSegments.push(segment);
19
+ if (field.type === 'relationship' || field.type === 'upload') {
20
+ return resultSegments.join('.');
21
+ }
22
+ }
23
+ return resultSegments.join('.');
24
+ };
25
+ const getAllVirtualRelations = ({ fields })=>{
26
+ const result = [];
27
+ for (const field of fields){
28
+ if ('virtual' in field && typeof field.virtual === 'string') {
29
+ result.push(field.virtual);
30
+ } else if (field.type === 'group' || field.type === 'tab') {
31
+ const nestedResult = getAllVirtualRelations({
32
+ fields: field.flattenedFields
33
+ });
34
+ for (const nestedItem of nestedResult){
35
+ result.push(nestedItem);
36
+ }
37
+ }
38
+ }
39
+ return result;
40
+ };
41
+ const resolveVirtualRelationsToSelect = ({ fields, selectValue, topLevelFields, versions })=>{
42
+ const result = [];
43
+ if (selectValue === true) {
44
+ for (const item of getAllVirtualRelations({
45
+ fields
46
+ })){
47
+ result.push(stripVirtualPathToCurrentCollection({
48
+ fields: topLevelFields,
49
+ path: item,
50
+ versions
51
+ }));
52
+ }
53
+ } else {
54
+ for(const fieldName in selectValue){
55
+ const field = fields.find((each)=>each.name === fieldName);
56
+ if (!field) {
57
+ continue;
58
+ }
59
+ if ('virtual' in field && typeof field.virtual === 'string') {
60
+ result.push(stripVirtualPathToCurrentCollection({
61
+ fields: topLevelFields,
62
+ path: field.virtual,
63
+ versions
64
+ }));
65
+ } else if (field.type === 'group' || field.type === 'tab') {
66
+ for (const item of resolveVirtualRelationsToSelect({
67
+ fields: field.flattenedFields,
68
+ selectValue: selectValue[fieldName],
69
+ topLevelFields,
70
+ versions
71
+ })){
72
+ result.push(stripVirtualPathToCurrentCollection({
73
+ fields: topLevelFields,
74
+ path: item,
75
+ versions
76
+ }));
77
+ }
78
+ }
79
+ }
80
+ }
81
+ return result;
82
+ };
83
+ export const sanitizeSelect = ({ fields, forceSelect, select, versions })=>{
84
+ if (!select) {
5
85
  return select;
6
86
  }
7
87
  const selectMode = getSelectMode(select);
8
88
  if (selectMode === 'exclude') {
9
89
  return select;
10
90
  }
11
- return deepMergeSimple(select, forceSelect);
91
+ if (forceSelect) {
92
+ select = deepMergeSimple(select, forceSelect);
93
+ }
94
+ if (select) {
95
+ const virtualRelations = resolveVirtualRelationsToSelect({
96
+ fields,
97
+ selectValue: select,
98
+ topLevelFields: fields,
99
+ versions: versions ?? false
100
+ });
101
+ for (const path of virtualRelations){
102
+ let currentRef = select;
103
+ const segments = path.split('.');
104
+ for(let i = 0; i < segments.length; i++){
105
+ const isLast = segments.length - 1 === i;
106
+ const segment = segments[i];
107
+ if (isLast) {
108
+ currentRef[segment] = true;
109
+ } else {
110
+ if (!(segment in currentRef)) {
111
+ currentRef[segment] = {};
112
+ currentRef = currentRef[segment];
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ return select;
12
119
  };
13
120
 
14
121
  //# sourceMappingURL=sanitizeSelect.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/sanitizeSelect.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type { SelectType } from '../types/index.js'\n\nimport { getSelectMode } from './getSelectMode.js'\n\nexport const sanitizeSelect = ({\n forceSelect,\n select,\n}: {\n forceSelect?: SelectType\n select?: SelectType\n}): SelectType | undefined => {\n if (!forceSelect || !select) {\n return select\n }\n\n const selectMode = getSelectMode(select)\n\n if (selectMode === 'exclude') {\n return select\n }\n\n return deepMergeSimple(select, forceSelect)\n}\n"],"names":["deepMergeSimple","getSelectMode","sanitizeSelect","forceSelect","select","selectMode"],"mappings":"AAAA,SAASA,eAAe,QAAQ,qCAAoC;AAIpE,SAASC,aAAa,QAAQ,qBAAoB;AAElD,OAAO,MAAMC,iBAAiB,CAAC,EAC7BC,WAAW,EACXC,MAAM,EAIP;IACC,IAAI,CAACD,eAAe,CAACC,QAAQ;QAC3B,OAAOA;IACT;IAEA,MAAMC,aAAaJ,cAAcG;IAEjC,IAAIC,eAAe,WAAW;QAC5B,OAAOD;IACT;IAEA,OAAOJ,gBAAgBI,QAAQD;AACjC,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/sanitizeSelect.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type { FlattenedField } from '../fields/config/types.js'\nimport type { SelectIncludeType, SelectType } from '../types/index.js'\n\nimport { getSelectMode } from './getSelectMode.js'\n\n// Transform post.title -> post, post.category.title -> post\nconst stripVirtualPathToCurrentCollection = ({\n fields,\n path,\n versions,\n}: {\n fields: FlattenedField[]\n path: string\n versions: boolean\n}) => {\n const resultSegments: string[] = []\n\n if (versions) {\n resultSegments.push('version')\n const versionField = fields.find((each) => each.name === 'version')\n\n if (versionField && versionField.type === 'group') {\n fields = versionField.flattenedFields\n }\n }\n\n for (const segment of path.split('.')) {\n const field = fields.find((each) => each.name === segment)\n\n if (!field) {\n continue\n }\n\n resultSegments.push(segment)\n\n if (field.type === 'relationship' || field.type === 'upload') {\n return resultSegments.join('.')\n }\n }\n\n return resultSegments.join('.')\n}\n\nconst getAllVirtualRelations = ({ fields }: { fields: FlattenedField[] }) => {\n const result: string[] = []\n\n for (const field of fields) {\n if ('virtual' in field && typeof field.virtual === 'string') {\n result.push(field.virtual)\n } else if (field.type === 'group' || field.type === 'tab') {\n const nestedResult = getAllVirtualRelations({ fields: field.flattenedFields })\n\n for (const nestedItem of nestedResult) {\n result.push(nestedItem)\n }\n }\n }\n\n return result\n}\n\nconst resolveVirtualRelationsToSelect = ({\n fields,\n selectValue,\n topLevelFields,\n versions,\n}: {\n fields: FlattenedField[]\n selectValue: SelectIncludeType | true\n topLevelFields: FlattenedField[]\n versions: boolean\n}) => {\n const result: string[] = []\n if (selectValue === true) {\n for (const item of getAllVirtualRelations({ fields })) {\n result.push(\n stripVirtualPathToCurrentCollection({ fields: topLevelFields, path: item, versions }),\n )\n }\n } else {\n for (const fieldName in selectValue) {\n const field = fields.find((each) => each.name === fieldName)\n if (!field) {\n continue\n }\n\n if ('virtual' in field && typeof field.virtual === 'string') {\n result.push(\n stripVirtualPathToCurrentCollection({\n fields: topLevelFields,\n path: field.virtual,\n versions,\n }),\n )\n } else if (field.type === 'group' || field.type === 'tab') {\n for (const item of resolveVirtualRelationsToSelect({\n fields: field.flattenedFields,\n selectValue: selectValue[fieldName],\n topLevelFields,\n versions,\n })) {\n result.push(\n stripVirtualPathToCurrentCollection({ fields: topLevelFields, path: item, versions }),\n )\n }\n }\n }\n }\n\n return result\n}\n\nexport const sanitizeSelect = ({\n fields,\n forceSelect,\n select,\n versions,\n}: {\n fields: FlattenedField[]\n forceSelect?: SelectType\n select?: SelectType\n versions?: boolean\n}): SelectType | undefined => {\n if (!select) {\n return select\n }\n\n const selectMode = getSelectMode(select)\n\n if (selectMode === 'exclude') {\n return select\n }\n\n if (forceSelect) {\n select = deepMergeSimple(select, forceSelect)\n }\n\n if (select) {\n const virtualRelations = resolveVirtualRelationsToSelect({\n fields,\n selectValue: select as SelectIncludeType,\n topLevelFields: fields,\n versions: versions ?? false,\n })\n\n for (const path of virtualRelations) {\n let currentRef = select\n const segments = path.split('.')\n for (let i = 0; i < segments.length; i++) {\n const isLast = segments.length - 1 === i\n const segment = segments[i]\n\n if (isLast) {\n currentRef[segment] = true\n } else {\n if (!(segment in currentRef)) {\n currentRef[segment] = {}\n currentRef = currentRef[segment]\n }\n }\n }\n }\n }\n\n return select\n}\n"],"names":["deepMergeSimple","getSelectMode","stripVirtualPathToCurrentCollection","fields","path","versions","resultSegments","push","versionField","find","each","name","type","flattenedFields","segment","split","field","join","getAllVirtualRelations","result","virtual","nestedResult","nestedItem","resolveVirtualRelationsToSelect","selectValue","topLevelFields","item","fieldName","sanitizeSelect","forceSelect","select","selectMode","virtualRelations","currentRef","segments","i","length","isLast"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "3.36.0",
3
+ "version": "3.37.0-internal.f2e6c68",
4
4
  "description": "Node, React, Headless CMS and Application Framework built on Next.js",
5
5
  "keywords": [
6
6
  "admin panel",
@@ -99,7 +99,7 @@
99
99
  "tsx": "4.19.2",
100
100
  "uuid": "10.0.0",
101
101
  "ws": "^8.16.0",
102
- "@payloadcms/translations": "3.36.0"
102
+ "@payloadcms/translations": "3.37.0-internal.f2e6c68"
103
103
  },
104
104
  "devDependencies": {
105
105
  "@hyrious/esbuild-plugin-commonjs": "^0.2.4",