@payloadcms/plugin-cloud-storage 4.0.0-internal.ea6e8f8 → 4.0.0-internal.ec73d44

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/fields/getFields.ts"],"sourcesContent":["import type { CollectionConfig, Field, GroupField, SanitizedUploadConfig, TextField } from 'payload'\n\nimport path from 'path'\n\nimport type { GeneratedAdapter, GenerateFileURL } from '../types.js'\n\nimport { getAfterReadHook } from '../hooks/afterRead.js'\nimport { getBeforeChangeHook } from '../hooks/beforeChange.js'\nimport { getNormalizeUploadPrefixFieldHook } from '../hooks/normalizeUploadPrefix.js'\n\ninterface Args {\n adapter?: GeneratedAdapter\n collection: CollectionConfig\n disablePayloadAccessControl?: true\n generateFileURL?: GenerateFileURL\n prefix?: string\n /**\n * When true, do not default the `prefix` field to the collection prefix; the\n * document field holds only the document-level segment.\n */\n useCompositePrefixes?: boolean\n}\n\nexport const getFields = ({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n prefix,\n useCompositePrefixes = false,\n}: Args): Field[] => {\n const baseURLField: TextField = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n const basePrefixField: TextField = {\n name: 'prefix',\n type: 'text',\n admin: {\n disabled: {\n bulkEdit: true,\n column: true,\n filter: true,\n groupBy: true,\n },\n hidden: true,\n readOnly: true,\n },\n }\n\n // Server-owned key segment. Field-level `hidden` would remove it before the URL hooks can read it.\n const baseObjectKeyField: TextField = {\n name: '_objectKey',\n type: 'text',\n admin: {\n disabled: {\n bulkEdit: true,\n column: true,\n filter: true,\n groupBy: true,\n },\n hidden: true,\n readOnly: true,\n },\n }\n\n const storedPrefixField: TextField = {\n ...basePrefixField,\n admin: {\n ...basePrefixField.admin,\n disabled: true,\n },\n }\n\n const fields = [...collection.fields, ...(adapter?.fields || [])]\n\n // Inject a hook into all URL fields to generate URLs\n\n let existingURLFieldIndex = -1\n\n const existingURLField = fields.find((existingField, i) => {\n if ('name' in existingField && existingField.name === 'url') {\n existingURLFieldIndex = i\n return true\n }\n return false\n }) as TextField\n\n if (existingURLFieldIndex > -1) {\n fields.splice(existingURLFieldIndex, 1)\n }\n\n // Only add afterRead hook if adapter is provided\n if (adapter) {\n fields.push({\n ...baseURLField,\n ...(existingURLField || {}),\n hooks: {\n afterRead: [\n getAfterReadHook({ adapter, collection, disablePayloadAccessControl, generateFileURL }),\n ...(existingURLField?.hooks?.afterRead || []),\n ],\n beforeChange: [\n getBeforeChangeHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n }),\n ...(existingURLField?.hooks?.beforeChange || []),\n ],\n },\n } as TextField)\n } else {\n fields.push({\n ...baseURLField,\n ...(existingURLField || {}),\n } as TextField)\n }\n\n let originalField = fields.find(\n (field): field is GroupField =>\n field.type === 'group' && 'name' in field && field.name === 'original',\n )\n\n if (adapter && !originalField) {\n originalField = {\n name: 'original',\n type: 'group',\n fields: [baseURLField],\n }\n fields.push(originalField)\n }\n\n const originalURLFieldIndex = originalField?.fields.findIndex(\n (field) => 'name' in field && field.name === 'url',\n )\n\n if (\n adapter &&\n originalField &&\n originalURLFieldIndex !== undefined &&\n originalURLFieldIndex >= 0\n ) {\n const originalURLField = originalField.fields[originalURLFieldIndex] as TextField\n\n originalField.fields[originalURLFieldIndex] = {\n ...baseURLField,\n ...originalURLField,\n hooks: {\n afterRead: [\n getAfterReadHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n isOriginal: true,\n }),\n ...(originalURLField.hooks?.afterRead || []),\n ],\n beforeChange: [\n getBeforeChangeHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n isOriginal: true,\n }),\n ...(originalURLField.hooks?.beforeChange || []),\n ],\n },\n } as TextField\n }\n\n // Storage adapters add these fields during their `init`, after transformers (e.g. Sharp) have\n // written each collection's image sizes onto its upload config.\n const variants =\n typeof collection.upload === 'object'\n ? (collection.upload as SanitizedUploadConfig).variants\n : undefined\n\n if (variants) {\n let existingSizesFieldIndex = -1\n\n const existingSizesField = fields.find((existingField, i) => {\n if ('name' in existingField && existingField.name === 'variants') {\n existingSizesFieldIndex = i\n return true\n }\n\n return false\n }) as GroupField\n\n if (existingSizesFieldIndex > -1) {\n fields.splice(existingSizesFieldIndex, 1)\n }\n\n const sizesField: Field = {\n ...(existingSizesField || {}),\n name: 'variants',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: variants.map((size) => {\n const existingSizeField = existingSizesField?.fields.find(\n (existingField) => 'name' in existingField && existingField.name === size.name,\n ) as GroupField\n\n const existingSizeURLField = existingSizeField?.fields.find(\n (existingField) => 'name' in existingField && existingField.name === 'url',\n ) as TextField\n\n // Only add afterRead hook if adapter is provided\n const sizeURLField: TextField = adapter\n ? ({\n ...(existingSizeURLField || {}),\n ...baseURLField,\n hooks: {\n afterRead: [\n getAfterReadHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n size,\n }),\n ...((typeof existingSizeURLField === 'object' &&\n 'hooks' in existingSizeURLField &&\n existingSizeURLField?.hooks?.afterRead) ||\n []),\n ],\n beforeChange: [\n getBeforeChangeHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n size,\n }),\n ...((typeof existingSizeURLField === 'object' &&\n 'hooks' in existingSizeURLField &&\n existingSizeURLField?.hooks?.beforeChange) ||\n []),\n ],\n },\n } as TextField)\n : ({\n ...(existingSizeURLField || {}),\n ...baseURLField,\n } as TextField)\n\n return {\n ...existingSizeField,\n name: size.name,\n type: 'group',\n fields: [\n ...(adapter?.fields || []).filter(\n (field) => !('name' in field && ['_objectKey', 'prefix'].includes(field.name)),\n ),\n sizeURLField,\n storedPrefixField,\n baseObjectKeyField,\n ],\n } as Field\n }),\n }\n\n fields.push(sizesField)\n }\n\n // Always insert the prefix field so the schema stays consistent regardless of\n // whether the plugin is enabled or a prefix is configured.\n let existingPrefixFieldIndex = -1\n\n const existingPrefixField = fields.find((existingField, i) => {\n if ('name' in existingField && existingField.name === 'prefix') {\n existingPrefixFieldIndex = i\n return true\n }\n return false\n }) as TextField\n\n if (existingPrefixFieldIndex > -1) {\n fields.splice(existingPrefixFieldIndex, 1)\n }\n\n fields.push({\n ...basePrefixField,\n ...(existingPrefixField || {}),\n defaultValue:\n existingPrefixField?.defaultValue ??\n (useCompositePrefixes ? '' : prefix ? path.posix.join(prefix) : ''),\n hooks: {\n ...existingPrefixField?.hooks,\n beforeChange: [\n ...(existingPrefixField?.hooks?.beforeChange || []),\n getNormalizeUploadPrefixFieldHook({ collectionPrefix: prefix, useCompositePrefixes }),\n ],\n },\n } as TextField)\n\n const existingObjectKeyFieldIndex = fields.findIndex(\n (existingField) => 'name' in existingField && existingField.name === '_objectKey',\n )\n if (existingObjectKeyFieldIndex > -1) {\n fields.splice(existingObjectKeyFieldIndex, 1)\n }\n\n fields.push({ ...baseObjectKeyField } as TextField)\n\n return fields\n}\n"],"names":["path","getAfterReadHook","getBeforeChangeHook","getNormalizeUploadPrefixFieldHook","getFields","adapter","collection","disablePayloadAccessControl","generateFileURL","prefix","useCompositePrefixes","baseURLField","name","type","admin","hidden","readOnly","label","basePrefixField","disabled","bulkEdit","column","filter","groupBy","baseObjectKeyField","storedPrefixField","fields","existingURLFieldIndex","existingURLField","find","existingField","i","splice","push","hooks","afterRead","beforeChange","originalField","field","originalURLFieldIndex","findIndex","undefined","originalURLField","isOriginal","variants","upload","existingSizesFieldIndex","existingSizesField","sizesField","map","size","existingSizeField","existingSizeURLField","sizeURLField","includes","existingPrefixFieldIndex","existingPrefixField","defaultValue","posix","join","collectionPrefix","existingObjectKeyFieldIndex"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/fields/getFields.ts"],"sourcesContent":["import type { CollectionConfig, Field, GroupField, SanitizedUploadConfig, TextField } from 'payload'\n\nimport path from 'path'\n\nimport type { GeneratedAdapter, GenerateFileURL } from '../types.js'\n\nimport { getAfterReadHook } from '../hooks/afterRead.js'\nimport { getBeforeChangeHook } from '../hooks/beforeChange.js'\nimport { getNormalizeUploadPrefixFieldHook } from '../hooks/normalizeUploadPrefix.js'\n\ninterface Args {\n adapter?: GeneratedAdapter\n collection: CollectionConfig\n disablePayloadAccessControl?: true\n generateFileURL?: GenerateFileURL\n prefix?: string\n /**\n * When true, do not default the `prefix` field to the collection prefix; the\n * document field holds only the document-level segment.\n */\n useCompositePrefixes?: boolean\n}\n\nexport const getFields = ({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n prefix,\n useCompositePrefixes = false,\n}: Args): Field[] => {\n const baseURLField: TextField = {\n name: 'url',\n type: 'text',\n admin: {\n hidden: true,\n readOnly: true,\n },\n label: 'URL',\n }\n\n const basePrefixField: TextField = {\n name: 'prefix',\n type: 'text',\n admin: {\n disabled: {\n bulkEdit: true,\n column: true,\n filter: true,\n groupBy: true,\n },\n hidden: true,\n readOnly: true,\n },\n }\n\n // Server-owned key segment. Field-level `hidden` would remove it before the URL hooks can read it.\n const baseObjectKeyField: TextField = {\n name: '_objectKey',\n type: 'text',\n admin: {\n disabled: {\n bulkEdit: true,\n column: true,\n filter: true,\n groupBy: true,\n },\n hidden: true,\n readOnly: true,\n },\n }\n\n const storedPrefixField: TextField = {\n ...basePrefixField,\n admin: {\n ...basePrefixField.admin,\n disabled: true,\n },\n }\n\n const fields = [...collection.fields, ...(adapter?.fields || [])]\n\n // Inject a hook into all URL fields to generate URLs\n\n let existingURLFieldIndex = -1\n\n const existingURLField = fields.find((existingField, i) => {\n if ('name' in existingField && existingField.name === 'url') {\n existingURLFieldIndex = i\n return true\n }\n return false\n }) as TextField\n\n if (existingURLFieldIndex > -1) {\n fields.splice(existingURLFieldIndex, 1)\n }\n\n // Only add afterRead hook if adapter is provided\n if (adapter) {\n fields.push({\n ...baseURLField,\n ...(existingURLField || {}),\n hooks: {\n afterRead: [\n getAfterReadHook({ adapter, collection, disablePayloadAccessControl, generateFileURL }),\n ...(existingURLField?.hooks?.afterRead || []),\n ],\n beforeChange: [\n getBeforeChangeHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n }),\n ...(existingURLField?.hooks?.beforeChange || []),\n ],\n },\n } as TextField)\n } else {\n fields.push({\n ...baseURLField,\n ...(existingURLField || {}),\n } as TextField)\n }\n\n let originalField = fields.find(\n (field): field is GroupField =>\n field.type === 'group' && 'name' in field && field.name === 'original',\n )\n\n if (adapter && !originalField) {\n originalField = {\n name: 'original',\n type: 'group',\n fields: [baseURLField],\n }\n fields.push(originalField)\n }\n\n const originalURLFieldIndex = originalField?.fields.findIndex(\n (field) => 'name' in field && field.name === 'url',\n )\n\n if (\n adapter &&\n originalField &&\n originalURLFieldIndex !== undefined &&\n originalURLFieldIndex >= 0\n ) {\n const originalURLField = originalField.fields[originalURLFieldIndex] as TextField\n\n originalField.fields[originalURLFieldIndex] = {\n ...baseURLField,\n ...originalURLField,\n hooks: {\n afterRead: [\n getAfterReadHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n isOriginal: true,\n }),\n ...(originalURLField.hooks?.afterRead || []),\n ],\n beforeChange: [\n getBeforeChangeHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n isOriginal: true,\n }),\n ...(originalURLField.hooks?.beforeChange || []),\n ],\n },\n } as TextField\n }\n\n // Storage adapters add these fields during their `init`, after transformers (e.g. Sharp) have\n // written each collection's image sizes onto its upload config.\n const variants =\n typeof collection.upload === 'object'\n ? (collection.upload as SanitizedUploadConfig).variants\n : undefined\n\n if (variants) {\n let existingSizesFieldIndex = -1\n\n const existingSizesField = fields.find((existingField, i) => {\n if ('name' in existingField && existingField.name === 'variants') {\n existingSizesFieldIndex = i\n return true\n }\n\n return false\n }) as GroupField\n\n if (existingSizesFieldIndex > -1) {\n fields.splice(existingSizesFieldIndex, 1)\n }\n\n const sizesField: Field = {\n ...(existingSizesField || {}),\n name: 'variants',\n type: 'group',\n admin: {\n hidden: true,\n },\n fields: variants.map((size) => {\n const existingSizeField = existingSizesField?.fields.find(\n (existingField) => 'name' in existingField && existingField.name === size.name,\n ) as GroupField\n\n const existingSizeURLField = existingSizeField?.fields.find(\n (existingField) => 'name' in existingField && existingField.name === 'url',\n ) as TextField\n\n // Only add afterRead hook if adapter is provided\n const sizeURLField: TextField = adapter\n ? ({\n ...(existingSizeURLField || {}),\n ...baseURLField,\n hooks: {\n afterRead: [\n getAfterReadHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n size,\n }),\n ...((typeof existingSizeURLField === 'object' &&\n 'hooks' in existingSizeURLField &&\n existingSizeURLField?.hooks?.afterRead) ||\n []),\n ],\n beforeChange: [\n getBeforeChangeHook({\n adapter,\n collection,\n disablePayloadAccessControl,\n generateFileURL,\n size,\n }),\n ...((typeof existingSizeURLField === 'object' &&\n 'hooks' in existingSizeURLField &&\n existingSizeURLField?.hooks?.beforeChange) ||\n []),\n ],\n },\n } as TextField)\n : ({\n ...(existingSizeURLField || {}),\n ...baseURLField,\n } as TextField)\n\n return {\n ...existingSizeField,\n name: size.name,\n type: 'group',\n fields: [\n ...(adapter?.fields || []).filter(\n (field) => !('name' in field && ['_objectKey', 'prefix'].includes(field.name)),\n ),\n sizeURLField,\n storedPrefixField,\n baseObjectKeyField,\n ],\n }\n }),\n }\n\n fields.push(sizesField)\n }\n\n // Always insert the prefix field so the schema stays consistent regardless of\n // whether the plugin is enabled or a prefix is configured.\n let existingPrefixFieldIndex = -1\n\n const existingPrefixField = fields.find((existingField, i) => {\n if ('name' in existingField && existingField.name === 'prefix') {\n existingPrefixFieldIndex = i\n return true\n }\n return false\n }) as TextField\n\n if (existingPrefixFieldIndex > -1) {\n fields.splice(existingPrefixFieldIndex, 1)\n }\n\n fields.push({\n ...basePrefixField,\n ...(existingPrefixField || {}),\n defaultValue:\n existingPrefixField?.defaultValue ??\n (useCompositePrefixes ? '' : prefix ? path.posix.join(prefix) : ''),\n hooks: {\n ...existingPrefixField?.hooks,\n beforeChange: [\n ...(existingPrefixField?.hooks?.beforeChange || []),\n getNormalizeUploadPrefixFieldHook({ collectionPrefix: prefix, useCompositePrefixes }),\n ],\n },\n } as TextField)\n\n const existingObjectKeyFieldIndex = fields.findIndex(\n (existingField) => 'name' in existingField && existingField.name === '_objectKey',\n )\n if (existingObjectKeyFieldIndex > -1) {\n fields.splice(existingObjectKeyFieldIndex, 1)\n }\n\n fields.push({ ...baseObjectKeyField })\n\n return fields\n}\n"],"names":["path","getAfterReadHook","getBeforeChangeHook","getNormalizeUploadPrefixFieldHook","getFields","adapter","collection","disablePayloadAccessControl","generateFileURL","prefix","useCompositePrefixes","baseURLField","name","type","admin","hidden","readOnly","label","basePrefixField","disabled","bulkEdit","column","filter","groupBy","baseObjectKeyField","storedPrefixField","fields","existingURLFieldIndex","existingURLField","find","existingField","i","splice","push","hooks","afterRead","beforeChange","originalField","field","originalURLFieldIndex","findIndex","undefined","originalURLField","isOriginal","variants","upload","existingSizesFieldIndex","existingSizesField","sizesField","map","size","existingSizeField","existingSizeURLField","sizeURLField","includes","existingPrefixFieldIndex","existingPrefixField","defaultValue","posix","join","collectionPrefix","existingObjectKeyFieldIndex"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/afterChange.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, CollectionConfig, FileData, TypeWithID } from 'payload'\n\nimport { deepMergeWithSourceArrays, MAIN_BRANCH, scheduleAfterTransactionCommit } from 'payload'\n\nimport type { GeneratedAdapter } from '../types.js'\n\nimport { buildPrefixWithObjectKey } from '../utilities/buildPrefixWithObjectKey.js'\nimport {\n buildStoragePathData,\n buildUploadStoragePathData,\n} from '../utilities/buildStoragePathData.js'\nimport { getIncomingFiles } from '../utilities/getIncomingFiles.js'\nimport { appendProxyPrefix } from './afterRead.js'\n\ninterface Args {\n adapter: GeneratedAdapter\n collection: CollectionConfig\n collectionPrefix?: string\n disablePayloadAccessControl?: boolean\n hasCustomFileURL?: boolean\n useCompositePrefixes?: boolean\n}\n\n// The object's folder: semantic prefix + `_objectKey` segment.\nconst getObjectFolder = (data: unknown): string => {\n const record = (data ?? {}) as { _objectKey?: string; prefix?: string }\n return buildPrefixWithObjectKey({ objectKey: record._objectKey, prefix: record.prefix })\n}\n\nexport const getAfterChangeHook =\n ({\n adapter,\n collection,\n collectionPrefix,\n disablePayloadAccessControl,\n hasCustomFileURL,\n useCompositePrefixes,\n }: Args): CollectionAfterChangeHook<FileData & TypeWithID> =>\n async ({ data, doc, operation, previousDoc, req, select }) => {\n // Skip if this is an internal update to prevent infinite loop\n if (req.context?.skipCloudStorage) {\n return doc\n }\n\n // Restore upload metadata removed by select, including partially selected image sizes.\n const uploadData = select ? deepMergeWithSourceArrays<FileData & TypeWithID>(data, doc) : doc\n const withProxyPrefix = (upload: FileData & TypeWithID): FileData & TypeWithID => {\n const { prefix } = upload as { prefix?: string } & FileData & TypeWithID\n\n if (disablePayloadAccessControl || hasCustomFileURL || !useCompositePrefixes || !prefix) {\n return upload\n }\n\n return {\n ...upload,\n ...(upload.url && {\n url: appendProxyPrefix({ prefix, url: upload.url }),\n }),\n ...(upload.original?.url && {\n original: {\n ...upload.original,\n url: appendProxyPrefix({ prefix, url: upload.original.url }),\n },\n }),\n }\n }\n const isDraftSave = (uploadData as { _status?: string })._status === 'draft'\n const isDraftOverPublished =\n isDraftSave && (previousDoc as { _status?: string } | undefined)?._status === 'published'\n\n if (req.context?._payloadManagedCloudStorage) {\n const metadata = req.context._payloadManagedCloudMetadata as\n | Partial<FileData & TypeWithID>\n | undefined\n\n if (!metadata || Object.keys(metadata).length === 0) {\n return withProxyPrefix(doc)\n }\n\n req.context.skipCloudStorage = true\n req.file = undefined\n req.payloadUploadSizes = undefined\n const originalQuery = req.query\n req.query = { ...req.query }\n delete req.query.uploadEdits\n\n try {\n const updatedDoc = await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: metadata,\n depth: 0,\n draft: isDraftSave,\n overrideAccess: true,\n req,\n select,\n })\n\n return withProxyPrefix({ ...doc, ...updatedDoc })\n } finally {\n req.query = originalQuery\n delete req.context.skipCloudStorage\n }\n }\n\n try {\n const files = getIncomingFiles({ data: uploadData, req })\n\n if (files.length > 0) {\n // Fold `_objectKey` so generated sizes land in the same folder as the original.\n const dataForUpload = { ...uploadData, prefix: getObjectFolder(uploadData) }\n\n const uploadResults = await Promise.all(\n files\n .filter((file) => !file.uploadReference)\n .map((file) =>\n adapter.handleUpload({\n collection,\n data: dataForUpload,\n file,\n req,\n storageFilePath: buildUploadStoragePathData({\n collectionPrefix,\n docPrefix: dataForUpload.prefix,\n filename: file.filename,\n useCompositePrefixes,\n }).storageFilePath,\n }),\n ),\n )\n\n const uploadMetadata = uploadResults\n .filter(\n (result): result is Partial<FileData & TypeWithID> =>\n result != null && typeof result === 'object',\n )\n .reduce(\n (acc, metadata) => ({ ...acc, ...metadata }),\n {} as Partial<FileData & TypeWithID>,\n )\n\n // Adapters may echo `data` back as metadata; keep the document's own `prefix`/`_objectKey`.\n delete (uploadMetadata as Record<string, unknown>).prefix\n delete (uploadMetadata as Record<string, unknown>)._objectKey\n\n let docWithMetadata = doc\n\n if (Object.keys(uploadMetadata).length > 0) {\n if (!req.context) {\n req.context = {}\n }\n req.context.skipCloudStorage = true\n\n // Clear to prevent re-processing\n req.file = undefined\n req.payloadUploadSizes = undefined\n\n try {\n const updatedDoc = await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: uploadMetadata,\n depth: 0,\n draft: isDraftSave,\n overrideAccess: true,\n req,\n select,\n })\n\n // Persist all adapter metadata, but do not add unselected fields to the response.\n docWithMetadata = select ? { ...doc, ...updatedDoc } : { ...doc, ...uploadMetadata }\n } finally {\n delete req.context.skipCloudStorage\n }\n }\n\n // Delete previous files only after the new upload and metadata\n // persistence have succeeded. Deleting earlier would orphan the\n // record if a later step throws (e.g. a user-defined afterChange\n // hook on the same collection).\n if (\n previousDoc &&\n operation === 'update' &&\n !isDraftOverPublished &&\n !collection.versions &&\n !previousDoc.original\n ) {\n let filesToDelete: string[] = []\n\n if (typeof previousDoc?.filename === 'string') {\n filesToDelete.push(previousDoc.filename)\n }\n\n if (typeof previousDoc.variants === 'object') {\n filesToDelete = filesToDelete.concat(\n Object.values(previousDoc?.variants || []).map(\n (resizedFileData) => resizedFileData?.filename as string,\n ),\n )\n }\n\n // Compare full locations: a replacement can reuse a filename while moving\n // a legacy object beneath the collection prefix.\n const newFileData = { ...uploadData, ...uploadMetadata }\n const newFilenames = new Set<string>()\n if (typeof newFileData.filename === 'string') {\n newFilenames.add(newFileData.filename)\n }\n if (typeof newFileData.variants === 'object') {\n for (const size of Object.values(newFileData.variants || {})) {\n if (size?.filename && typeof size.filename === 'string') {\n newFilenames.add(size.filename)\n }\n }\n }\n\n const resolveKey = ({\n data,\n filename,\n }: {\n data: { _objectKey?: string; prefix?: string }\n filename: string\n }) =>\n buildStoragePathData({\n collectionPrefix,\n docPrefix: getObjectFolder(data),\n filename,\n useCompositePrefixes,\n }).storageFilePath\n const newKeys = new Set(\n [...newFilenames].map((filename) =>\n resolveKey({\n data: newFileData as { _objectKey?: string; prefix?: string },\n filename,\n }),\n ),\n )\n const branchDocumentID = getBranchDocumentID(previousDoc)\n\n if (branchDocumentID !== undefined) {\n const retainedMainDocument = (await req.payload.db.findOne({\n branch: false,\n collection: collection.slug,\n req,\n where: {\n and: [{ _branch: { equals: MAIN_BRANCH } }, { id: { equals: branchDocumentID } }],\n },\n })) as null | Record<string, unknown>\n\n if (retainedMainDocument) {\n for (const filename of getDocumentFilenames(retainedMainDocument)) {\n newKeys.add(\n resolveKey({\n data: retainedMainDocument as { _objectKey?: string; prefix?: string },\n filename,\n }),\n )\n }\n }\n }\n\n const deletionTargets = filesToDelete.flatMap((filename) => {\n if (!filename) {\n return []\n }\n const storageFilePath = resolveKey({\n data: previousDoc as { _objectKey?: string; prefix?: string },\n filename,\n })\n return newKeys.has(storageFilePath) ? [] : [{ filename, storageFilePath }]\n })\n\n await scheduleAfterTransactionCommit({\n callback: async () => {\n await Promise.all(\n deletionTargets.map(({ filename, storageFilePath }) =>\n adapter.handleDelete({\n collection,\n doc: previousDoc,\n filename,\n req,\n storageFilePath,\n }),\n ),\n )\n },\n req,\n })\n }\n\n if (docWithMetadata !== doc) {\n return docWithMetadata\n }\n }\n } catch (err: unknown) {\n req.payload.logger.error(\n `There was an error while uploading files corresponding to the collection ${collection.slug} with filename ${doc.filename}:`,\n )\n req.payload.logger.error({ err })\n throw err\n }\n return doc\n }\n\nconst getBranchDocumentID = (doc: unknown): number | string | undefined => {\n if (!doc || typeof doc !== 'object' || Array.isArray(doc)) {\n return undefined\n }\n\n const branchDocument = doc as Record<string, unknown>\n\n if (branchDocument._branch === MAIN_BRANCH) {\n return undefined\n }\n\n const relation = branchDocument._branchDocID\n const value =\n relation && typeof relation === 'object' && !Array.isArray(relation) && 'value' in relation\n ? relation.value\n : relation\n\n return typeof value === 'number' || typeof value === 'string' ? value : undefined\n}\n\nconst getDocumentFilenames = (doc: Record<string, unknown>): string[] => {\n const filenames = typeof doc.filename === 'string' ? [doc.filename] : []\n\n if (doc.variants && typeof doc.variants === 'object' && !Array.isArray(doc.variants)) {\n for (const variant of Object.values(doc.variants)) {\n if (\n variant &&\n typeof variant === 'object' &&\n !Array.isArray(variant) &&\n 'filename' in variant &&\n typeof variant.filename === 'string'\n ) {\n filenames.push(variant.filename)\n }\n }\n }\n\n return filenames\n}\n"],"names":["deepMergeWithSourceArrays","MAIN_BRANCH","scheduleAfterTransactionCommit","buildPrefixWithObjectKey","buildStoragePathData","buildUploadStoragePathData","getIncomingFiles","appendProxyPrefix","getObjectFolder","data","record","objectKey","_objectKey","prefix","getAfterChangeHook","adapter","collection","collectionPrefix","disablePayloadAccessControl","hasCustomFileURL","useCompositePrefixes","doc","operation","previousDoc","req","select","context","skipCloudStorage","uploadData","withProxyPrefix","upload","url","original","isDraftSave","_status","isDraftOverPublished","_payloadManagedCloudStorage","metadata","_payloadManagedCloudMetadata","Object","keys","length","file","undefined","payloadUploadSizes","originalQuery","query","uploadEdits","updatedDoc","payload","update","id","slug","depth","draft","overrideAccess","files","dataForUpload","uploadResults","Promise","all","filter","uploadReference","map","handleUpload","storageFilePath","docPrefix","filename","uploadMetadata","result","reduce","acc","docWithMetadata","versions","filesToDelete","push","variants","concat","values","resizedFileData","newFileData","newFilenames","Set","add","size","resolveKey","newKeys","branchDocumentID","getBranchDocumentID","retainedMainDocument","db","findOne","branch","where","and","_branch","equals","getDocumentFilenames","deletionTargets","flatMap","has","callback","handleDelete","err","logger","error","Array","isArray","branchDocument","relation","_branchDocID","value","filenames","variant"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/hooks/afterChange.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, CollectionConfig, FileData, TypeWithID } from 'payload'\n\nimport { deepMergeWithSourceArrays, MAIN_BRANCH, scheduleAfterTransactionCommit } from 'payload'\n\nimport type { GeneratedAdapter } from '../types.js'\n\nimport { buildPrefixWithObjectKey } from '../utilities/buildPrefixWithObjectKey.js'\nimport {\n buildStoragePathData,\n buildUploadStoragePathData,\n} from '../utilities/buildStoragePathData.js'\nimport { getIncomingFiles } from '../utilities/getIncomingFiles.js'\nimport { appendProxyPrefix } from './afterRead.js'\n\ninterface Args {\n adapter: GeneratedAdapter\n collection: CollectionConfig\n collectionPrefix?: string\n disablePayloadAccessControl?: boolean\n hasCustomFileURL?: boolean\n useCompositePrefixes?: boolean\n}\n\n// The object's folder: semantic prefix + `_objectKey` segment.\nconst getObjectFolder = (data: unknown): string => {\n const record = (data ?? {}) as { _objectKey?: string; prefix?: string }\n return buildPrefixWithObjectKey({ objectKey: record._objectKey, prefix: record.prefix })\n}\n\nexport const getAfterChangeHook =\n ({\n adapter,\n collection,\n collectionPrefix,\n disablePayloadAccessControl,\n hasCustomFileURL,\n useCompositePrefixes,\n }: Args): CollectionAfterChangeHook<FileData & TypeWithID> =>\n async ({ data, doc, operation, previousDoc, req, select }) => {\n // Skip if this is an internal update to prevent infinite loop\n if (req.context?.skipCloudStorage) {\n return doc\n }\n\n // Restore upload metadata removed by select, including partially selected image sizes.\n const uploadData = select ? deepMergeWithSourceArrays<FileData & TypeWithID>(data, doc) : doc\n const withProxyPrefix = (upload: FileData & TypeWithID): FileData & TypeWithID => {\n const { prefix } = upload\n\n if (disablePayloadAccessControl || hasCustomFileURL || !useCompositePrefixes || !prefix) {\n return upload\n }\n\n return {\n ...upload,\n ...(upload.url && {\n url: appendProxyPrefix({ prefix, url: upload.url }),\n }),\n ...(upload.original?.url && {\n original: {\n ...upload.original,\n url: appendProxyPrefix({ prefix, url: upload.original.url }),\n },\n }),\n }\n }\n const isDraftSave = (uploadData as { _status?: string })._status === 'draft'\n const isDraftOverPublished =\n isDraftSave && (previousDoc as { _status?: string } | undefined)?._status === 'published'\n\n if (req.context?._payloadManagedCloudStorage) {\n const metadata = req.context._payloadManagedCloudMetadata as\n | Partial<FileData & TypeWithID>\n | undefined\n\n if (!metadata || Object.keys(metadata).length === 0) {\n return withProxyPrefix(doc)\n }\n\n req.context.skipCloudStorage = true\n req.file = undefined\n req.payloadUploadSizes = undefined\n const originalQuery = req.query\n req.query = { ...req.query }\n delete req.query.uploadEdits\n\n try {\n const updatedDoc = await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: metadata,\n depth: 0,\n draft: isDraftSave,\n overrideAccess: true,\n req,\n select,\n })\n\n return withProxyPrefix({ ...doc, ...updatedDoc })\n } finally {\n req.query = originalQuery\n delete req.context.skipCloudStorage\n }\n }\n\n try {\n const files = getIncomingFiles({ data: uploadData, req })\n\n if (files.length > 0) {\n // Fold `_objectKey` so generated sizes land in the same folder as the original.\n const dataForUpload = { ...uploadData, prefix: getObjectFolder(uploadData) }\n\n const uploadResults = await Promise.all(\n files\n .filter((file) => !file.uploadReference)\n .map((file) =>\n adapter.handleUpload({\n collection,\n data: dataForUpload,\n file,\n req,\n storageFilePath: buildUploadStoragePathData({\n collectionPrefix,\n docPrefix: dataForUpload.prefix,\n filename: file.filename,\n useCompositePrefixes,\n }).storageFilePath,\n }),\n ),\n )\n\n const uploadMetadata = uploadResults\n .filter(\n (result): result is Partial<FileData & TypeWithID> =>\n result != null && typeof result === 'object',\n )\n .reduce(\n (acc, metadata) => ({ ...acc, ...metadata }),\n {} as Partial<FileData & TypeWithID>,\n )\n\n // Adapters may echo `data` back as metadata; keep the document's own `prefix`/`_objectKey`.\n delete (uploadMetadata as Record<string, unknown>).prefix\n delete (uploadMetadata as Record<string, unknown>)._objectKey\n\n let docWithMetadata = doc\n\n if (Object.keys(uploadMetadata).length > 0) {\n if (!req.context) {\n req.context = {}\n }\n req.context.skipCloudStorage = true\n\n // Clear to prevent re-processing\n req.file = undefined\n req.payloadUploadSizes = undefined\n\n try {\n const updatedDoc = await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: uploadMetadata,\n depth: 0,\n draft: isDraftSave,\n overrideAccess: true,\n req,\n select,\n })\n\n // Persist all adapter metadata, but do not add unselected fields to the response.\n docWithMetadata = select ? { ...doc, ...updatedDoc } : { ...doc, ...uploadMetadata }\n } finally {\n delete req.context.skipCloudStorage\n }\n }\n\n // Delete previous files only after the new upload and metadata\n // persistence have succeeded. Deleting earlier would orphan the\n // record if a later step throws (e.g. a user-defined afterChange\n // hook on the same collection).\n if (\n previousDoc &&\n operation === 'update' &&\n !isDraftOverPublished &&\n !collection.versions &&\n !previousDoc.original\n ) {\n let filesToDelete: string[] = []\n\n if (typeof previousDoc?.filename === 'string') {\n filesToDelete.push(previousDoc.filename)\n }\n\n if (typeof previousDoc.variants === 'object') {\n filesToDelete = filesToDelete.concat(\n Object.values(previousDoc?.variants || []).map(\n (resizedFileData) => resizedFileData?.filename as string,\n ),\n )\n }\n\n // Compare full locations: a replacement can reuse a filename while moving\n // a legacy object beneath the collection prefix.\n const newFileData = { ...uploadData, ...uploadMetadata }\n const newFilenames = new Set<string>()\n if (typeof newFileData.filename === 'string') {\n newFilenames.add(newFileData.filename)\n }\n if (typeof newFileData.variants === 'object') {\n for (const size of Object.values(newFileData.variants || {})) {\n if (size?.filename && typeof size.filename === 'string') {\n newFilenames.add(size.filename)\n }\n }\n }\n\n const resolveKey = ({\n data,\n filename,\n }: {\n data: { _objectKey?: string; prefix?: string }\n filename: string\n }) =>\n buildStoragePathData({\n collectionPrefix,\n docPrefix: getObjectFolder(data),\n filename,\n useCompositePrefixes,\n }).storageFilePath\n const newKeys = new Set(\n [...newFilenames].map((filename) =>\n resolveKey({\n data: newFileData,\n filename,\n }),\n ),\n )\n const branchDocumentID = getBranchDocumentID(previousDoc)\n\n if (branchDocumentID !== undefined) {\n const retainedMainDocument = (await req.payload.db.findOne({\n branch: false,\n collection: collection.slug,\n req,\n where: {\n and: [{ _branch: { equals: MAIN_BRANCH } }, { id: { equals: branchDocumentID } }],\n },\n })) as null | Record<string, unknown>\n\n if (retainedMainDocument) {\n for (const filename of getDocumentFilenames(retainedMainDocument)) {\n newKeys.add(\n resolveKey({\n data: retainedMainDocument as { _objectKey?: string; prefix?: string },\n filename,\n }),\n )\n }\n }\n }\n\n const deletionTargets = filesToDelete.flatMap((filename) => {\n if (!filename) {\n return []\n }\n const storageFilePath = resolveKey({\n data: previousDoc,\n filename,\n })\n return newKeys.has(storageFilePath) ? [] : [{ filename, storageFilePath }]\n })\n\n await scheduleAfterTransactionCommit({\n callback: async () => {\n await Promise.all(\n deletionTargets.map(({ filename, storageFilePath }) =>\n adapter.handleDelete({\n collection,\n doc: previousDoc,\n filename,\n req,\n storageFilePath,\n }),\n ),\n )\n },\n req,\n })\n }\n\n if (docWithMetadata !== doc) {\n return docWithMetadata\n }\n }\n } catch (err: unknown) {\n req.payload.logger.error(\n `There was an error while uploading files corresponding to the collection ${collection.slug} with filename ${doc.filename}:`,\n )\n req.payload.logger.error({ err })\n throw err\n }\n return doc\n }\n\nconst getBranchDocumentID = (doc: unknown): number | string | undefined => {\n if (!doc || typeof doc !== 'object' || Array.isArray(doc)) {\n return undefined\n }\n\n const branchDocument = doc as Record<string, unknown>\n\n if (branchDocument._branch === MAIN_BRANCH) {\n return undefined\n }\n\n const relation = branchDocument._branchDocID\n const value =\n relation && typeof relation === 'object' && !Array.isArray(relation) && 'value' in relation\n ? relation.value\n : relation\n\n return typeof value === 'number' || typeof value === 'string' ? value : undefined\n}\n\nconst getDocumentFilenames = (doc: Record<string, unknown>): string[] => {\n const filenames = typeof doc.filename === 'string' ? [doc.filename] : []\n\n if (doc.variants && typeof doc.variants === 'object' && !Array.isArray(doc.variants)) {\n for (const variant of Object.values(doc.variants)) {\n if (\n variant &&\n typeof variant === 'object' &&\n !Array.isArray(variant) &&\n 'filename' in variant &&\n typeof variant.filename === 'string'\n ) {\n filenames.push(variant.filename)\n }\n }\n }\n\n return filenames\n}\n"],"names":["deepMergeWithSourceArrays","MAIN_BRANCH","scheduleAfterTransactionCommit","buildPrefixWithObjectKey","buildStoragePathData","buildUploadStoragePathData","getIncomingFiles","appendProxyPrefix","getObjectFolder","data","record","objectKey","_objectKey","prefix","getAfterChangeHook","adapter","collection","collectionPrefix","disablePayloadAccessControl","hasCustomFileURL","useCompositePrefixes","doc","operation","previousDoc","req","select","context","skipCloudStorage","uploadData","withProxyPrefix","upload","url","original","isDraftSave","_status","isDraftOverPublished","_payloadManagedCloudStorage","metadata","_payloadManagedCloudMetadata","Object","keys","length","file","undefined","payloadUploadSizes","originalQuery","query","uploadEdits","updatedDoc","payload","update","id","slug","depth","draft","overrideAccess","files","dataForUpload","uploadResults","Promise","all","filter","uploadReference","map","handleUpload","storageFilePath","docPrefix","filename","uploadMetadata","result","reduce","acc","docWithMetadata","versions","filesToDelete","push","variants","concat","values","resizedFileData","newFileData","newFilenames","Set","add","size","resolveKey","newKeys","branchDocumentID","getBranchDocumentID","retainedMainDocument","db","findOne","branch","where","and","_branch","equals","getDocumentFilenames","deletionTargets","flatMap","has","callback","handleDelete","err","logger","error","Array","isArray","branchDocument","relation","_branchDocID","value","filenames","variant"],"mappings":"AAEA,SAASA,yBAAyB,EAAEC,WAAW,EAAEC,8BAA8B,QAAQ,UAAS;AAIhG,SAASC,wBAAwB,QAAQ,2CAA0C;AACnF,SACEC,oBAAoB,EACpBC,0BAA0B,QACrB,uCAAsC;AAC7C,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAASC,iBAAiB,QAAQ,iBAAgB;AAWlD,+DAA+D;AAC/D,MAAMC,kBAAkB,CAACC;IACvB,MAAMC,SAAUD,QAAQ,CAAC;IACzB,OAAON,yBAAyB;QAAEQ,WAAWD,OAAOE,UAAU;QAAEC,QAAQH,OAAOG,MAAM;IAAC;AACxF;AAEA,OAAO,MAAMC,qBACX,CAAC,EACCC,OAAO,EACPC,UAAU,EACVC,gBAAgB,EAChBC,2BAA2B,EAC3BC,gBAAgB,EAChBC,oBAAoB,EACf,GACP,OAAO,EAAEX,IAAI,EAAEY,GAAG,EAAEC,SAAS,EAAEC,WAAW,EAAEC,GAAG,EAAEC,MAAM,EAAE;QACvD,8DAA8D;QAC9D,IAAID,IAAIE,OAAO,EAAEC,kBAAkB;YACjC,OAAON;QACT;QAEA,uFAAuF;QACvF,MAAMO,aAAaH,SAASzB,0BAAiDS,MAAMY,OAAOA;QAC1F,MAAMQ,kBAAkB,CAACC;YACvB,MAAM,EAAEjB,MAAM,EAAE,GAAGiB;YAEnB,IAAIZ,+BAA+BC,oBAAoB,CAACC,wBAAwB,CAACP,QAAQ;gBACvF,OAAOiB;YACT;YAEA,OAAO;gBACL,GAAGA,MAAM;gBACT,GAAIA,OAAOC,GAAG,IAAI;oBAChBA,KAAKxB,kBAAkB;wBAAEM;wBAAQkB,KAAKD,OAAOC,GAAG;oBAAC;gBACnD,CAAC;gBACD,GAAID,OAAOE,QAAQ,EAAED,OAAO;oBAC1BC,UAAU;wBACR,GAAGF,OAAOE,QAAQ;wBAClBD,KAAKxB,kBAAkB;4BAAEM;4BAAQkB,KAAKD,OAAOE,QAAQ,CAACD,GAAG;wBAAC;oBAC5D;gBACF,CAAC;YACH;QACF;QACA,MAAME,cAAc,AAACL,WAAoCM,OAAO,KAAK;QACrE,MAAMC,uBACJF,eAAe,AAACV,aAAkDW,YAAY;QAEhF,IAAIV,IAAIE,OAAO,EAAEU,6BAA6B;YAC5C,MAAMC,WAAWb,IAAIE,OAAO,CAACY,4BAA4B;YAIzD,IAAI,CAACD,YAAYE,OAAOC,IAAI,CAACH,UAAUI,MAAM,KAAK,GAAG;gBACnD,OAAOZ,gBAAgBR;YACzB;YAEAG,IAAIE,OAAO,CAACC,gBAAgB,GAAG;YAC/BH,IAAIkB,IAAI,GAAGC;YACXnB,IAAIoB,kBAAkB,GAAGD;YACzB,MAAME,gBAAgBrB,IAAIsB,KAAK;YAC/BtB,IAAIsB,KAAK,GAAG;gBAAE,GAAGtB,IAAIsB,KAAK;YAAC;YAC3B,OAAOtB,IAAIsB,KAAK,CAACC,WAAW;YAE5B,IAAI;gBACF,MAAMC,aAAa,MAAMxB,IAAIyB,OAAO,CAACC,MAAM,CAAC;oBAC1CC,IAAI9B,IAAI8B,EAAE;oBACVnC,YAAYA,WAAWoC,IAAI;oBAC3B3C,MAAM4B;oBACNgB,OAAO;oBACPC,OAAOrB;oBACPsB,gBAAgB;oBAChB/B;oBACAC;gBACF;gBAEA,OAAOI,gBAAgB;oBAAE,GAAGR,GAAG;oBAAE,GAAG2B,UAAU;gBAAC;YACjD,SAAU;gBACRxB,IAAIsB,KAAK,GAAGD;gBACZ,OAAOrB,IAAIE,OAAO,CAACC,gBAAgB;YACrC;QACF;QAEA,IAAI;YACF,MAAM6B,QAAQlD,iBAAiB;gBAAEG,MAAMmB;gBAAYJ;YAAI;YAEvD,IAAIgC,MAAMf,MAAM,GAAG,GAAG;gBACpB,gFAAgF;gBAChF,MAAMgB,gBAAgB;oBAAE,GAAG7B,UAAU;oBAAEf,QAAQL,gBAAgBoB;gBAAY;gBAE3E,MAAM8B,gBAAgB,MAAMC,QAAQC,GAAG,CACrCJ,MACGK,MAAM,CAAC,CAACnB,OAAS,CAACA,KAAKoB,eAAe,EACtCC,GAAG,CAAC,CAACrB,OACJ3B,QAAQiD,YAAY,CAAC;wBACnBhD;wBACAP,MAAMgD;wBACNf;wBACAlB;wBACAyC,iBAAiB5D,2BAA2B;4BAC1CY;4BACAiD,WAAWT,cAAc5C,MAAM;4BAC/BsD,UAAUzB,KAAKyB,QAAQ;4BACvB/C;wBACF,GAAG6C,eAAe;oBACpB;gBAIN,MAAMG,iBAAiBV,cACpBG,MAAM,CACL,CAACQ,SACCA,UAAU,QAAQ,OAAOA,WAAW,UAEvCC,MAAM,CACL,CAACC,KAAKlC,WAAc,CAAA;wBAAE,GAAGkC,GAAG;wBAAE,GAAGlC,QAAQ;oBAAC,CAAA,GAC1C,CAAC;gBAGL,4FAA4F;gBAC5F,OAAO,AAAC+B,eAA2CvD,MAAM;gBACzD,OAAO,AAACuD,eAA2CxD,UAAU;gBAE7D,IAAI4D,kBAAkBnD;gBAEtB,IAAIkB,OAAOC,IAAI,CAAC4B,gBAAgB3B,MAAM,GAAG,GAAG;oBAC1C,IAAI,CAACjB,IAAIE,OAAO,EAAE;wBAChBF,IAAIE,OAAO,GAAG,CAAC;oBACjB;oBACAF,IAAIE,OAAO,CAACC,gBAAgB,GAAG;oBAE/B,iCAAiC;oBACjCH,IAAIkB,IAAI,GAAGC;oBACXnB,IAAIoB,kBAAkB,GAAGD;oBAEzB,IAAI;wBACF,MAAMK,aAAa,MAAMxB,IAAIyB,OAAO,CAACC,MAAM,CAAC;4BAC1CC,IAAI9B,IAAI8B,EAAE;4BACVnC,YAAYA,WAAWoC,IAAI;4BAC3B3C,MAAM2D;4BACNf,OAAO;4BACPC,OAAOrB;4BACPsB,gBAAgB;4BAChB/B;4BACAC;wBACF;wBAEA,kFAAkF;wBAClF+C,kBAAkB/C,SAAS;4BAAE,GAAGJ,GAAG;4BAAE,GAAG2B,UAAU;wBAAC,IAAI;4BAAE,GAAG3B,GAAG;4BAAE,GAAG+C,cAAc;wBAAC;oBACrF,SAAU;wBACR,OAAO5C,IAAIE,OAAO,CAACC,gBAAgB;oBACrC;gBACF;gBAEA,+DAA+D;gBAC/D,gEAAgE;gBAChE,iEAAiE;gBACjE,gCAAgC;gBAChC,IACEJ,eACAD,cAAc,YACd,CAACa,wBACD,CAACnB,WAAWyD,QAAQ,IACpB,CAAClD,YAAYS,QAAQ,EACrB;oBACA,IAAI0C,gBAA0B,EAAE;oBAEhC,IAAI,OAAOnD,aAAa4C,aAAa,UAAU;wBAC7CO,cAAcC,IAAI,CAACpD,YAAY4C,QAAQ;oBACzC;oBAEA,IAAI,OAAO5C,YAAYqD,QAAQ,KAAK,UAAU;wBAC5CF,gBAAgBA,cAAcG,MAAM,CAClCtC,OAAOuC,MAAM,CAACvD,aAAaqD,YAAY,EAAE,EAAEb,GAAG,CAC5C,CAACgB,kBAAoBA,iBAAiBZ;oBAG5C;oBAEA,0EAA0E;oBAC1E,iDAAiD;oBACjD,MAAMa,cAAc;wBAAE,GAAGpD,UAAU;wBAAE,GAAGwC,cAAc;oBAAC;oBACvD,MAAMa,eAAe,IAAIC;oBACzB,IAAI,OAAOF,YAAYb,QAAQ,KAAK,UAAU;wBAC5Cc,aAAaE,GAAG,CAACH,YAAYb,QAAQ;oBACvC;oBACA,IAAI,OAAOa,YAAYJ,QAAQ,KAAK,UAAU;wBAC5C,KAAK,MAAMQ,QAAQ7C,OAAOuC,MAAM,CAACE,YAAYJ,QAAQ,IAAI,CAAC,GAAI;4BAC5D,IAAIQ,MAAMjB,YAAY,OAAOiB,KAAKjB,QAAQ,KAAK,UAAU;gCACvDc,aAAaE,GAAG,CAACC,KAAKjB,QAAQ;4BAChC;wBACF;oBACF;oBAEA,MAAMkB,aAAa,CAAC,EAClB5E,IAAI,EACJ0D,QAAQ,EAIT,GACC/D,qBAAqB;4BACnBa;4BACAiD,WAAW1D,gBAAgBC;4BAC3B0D;4BACA/C;wBACF,GAAG6C,eAAe;oBACpB,MAAMqB,UAAU,IAAIJ,IAClB;2BAAID;qBAAa,CAAClB,GAAG,CAAC,CAACI,WACrBkB,WAAW;4BACT5E,MAAMuE;4BACNb;wBACF;oBAGJ,MAAMoB,mBAAmBC,oBAAoBjE;oBAE7C,IAAIgE,qBAAqB5C,WAAW;wBAClC,MAAM8C,uBAAwB,MAAMjE,IAAIyB,OAAO,CAACyC,EAAE,CAACC,OAAO,CAAC;4BACzDC,QAAQ;4BACR5E,YAAYA,WAAWoC,IAAI;4BAC3B5B;4BACAqE,OAAO;gCACLC,KAAK;oCAAC;wCAAEC,SAAS;4CAAEC,QAAQ/F;wCAAY;oCAAE;oCAAG;wCAAEkD,IAAI;4CAAE6C,QAAQT;wCAAiB;oCAAE;iCAAE;4BACnF;wBACF;wBAEA,IAAIE,sBAAsB;4BACxB,KAAK,MAAMtB,YAAY8B,qBAAqBR,sBAAuB;gCACjEH,QAAQH,GAAG,CACTE,WAAW;oCACT5E,MAAMgF;oCACNtB;gCACF;4BAEJ;wBACF;oBACF;oBAEA,MAAM+B,kBAAkBxB,cAAcyB,OAAO,CAAC,CAAChC;wBAC7C,IAAI,CAACA,UAAU;4BACb,OAAO,EAAE;wBACX;wBACA,MAAMF,kBAAkBoB,WAAW;4BACjC5E,MAAMc;4BACN4C;wBACF;wBACA,OAAOmB,QAAQc,GAAG,CAACnC,mBAAmB,EAAE,GAAG;4BAAC;gCAAEE;gCAAUF;4BAAgB;yBAAE;oBAC5E;oBAEA,MAAM/D,+BAA+B;wBACnCmG,UAAU;4BACR,MAAM1C,QAAQC,GAAG,CACfsC,gBAAgBnC,GAAG,CAAC,CAAC,EAAEI,QAAQ,EAAEF,eAAe,EAAE,GAChDlD,QAAQuF,YAAY,CAAC;oCACnBtF;oCACAK,KAAKE;oCACL4C;oCACA3C;oCACAyC;gCACF;wBAGN;wBACAzC;oBACF;gBACF;gBAEA,IAAIgD,oBAAoBnD,KAAK;oBAC3B,OAAOmD;gBACT;YACF;QACF,EAAE,OAAO+B,KAAc;YACrB/E,IAAIyB,OAAO,CAACuD,MAAM,CAACC,KAAK,CACtB,CAAC,yEAAyE,EAAEzF,WAAWoC,IAAI,CAAC,eAAe,EAAE/B,IAAI8C,QAAQ,CAAC,CAAC,CAAC;YAE9H3C,IAAIyB,OAAO,CAACuD,MAAM,CAACC,KAAK,CAAC;gBAAEF;YAAI;YAC/B,MAAMA;QACR;QACA,OAAOlF;IACT,EAAC;AAEH,MAAMmE,sBAAsB,CAACnE;IAC3B,IAAI,CAACA,OAAO,OAAOA,QAAQ,YAAYqF,MAAMC,OAAO,CAACtF,MAAM;QACzD,OAAOsB;IACT;IAEA,MAAMiE,iBAAiBvF;IAEvB,IAAIuF,eAAeb,OAAO,KAAK9F,aAAa;QAC1C,OAAO0C;IACT;IAEA,MAAMkE,WAAWD,eAAeE,YAAY;IAC5C,MAAMC,QACJF,YAAY,OAAOA,aAAa,YAAY,CAACH,MAAMC,OAAO,CAACE,aAAa,WAAWA,WAC/EA,SAASE,KAAK,GACdF;IAEN,OAAO,OAAOE,UAAU,YAAY,OAAOA,UAAU,WAAWA,QAAQpE;AAC1E;AAEA,MAAMsD,uBAAuB,CAAC5E;IAC5B,MAAM2F,YAAY,OAAO3F,IAAI8C,QAAQ,KAAK,WAAW;QAAC9C,IAAI8C,QAAQ;KAAC,GAAG,EAAE;IAExE,IAAI9C,IAAIuD,QAAQ,IAAI,OAAOvD,IAAIuD,QAAQ,KAAK,YAAY,CAAC8B,MAAMC,OAAO,CAACtF,IAAIuD,QAAQ,GAAG;QACpF,KAAK,MAAMqC,WAAW1E,OAAOuC,MAAM,CAACzD,IAAIuD,QAAQ,EAAG;YACjD,IACEqC,WACA,OAAOA,YAAY,YACnB,CAACP,MAAMC,OAAO,CAACM,YACf,cAAcA,WACd,OAAOA,QAAQ9C,QAAQ,KAAK,UAC5B;gBACA6C,UAAUrC,IAAI,CAACsC,QAAQ9C,QAAQ;YACjC;QACF;IACF;IAEA,OAAO6C;AACT"}
package/package.json CHANGED
@@ -1,13 +1,8 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-cloud-storage",
3
- "version": "4.0.0-internal.ea6e8f8",
3
+ "version": "4.0.0-internal.ec73d44",
4
4
  "description": "The official cloud storage plugin for Payload CMS",
5
5
  "homepage": "https://payloadcms.com",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/payloadcms/payload.git",
9
- "directory": "packages/plugin-cloud-storage"
10
- },
11
6
  "license": "MIT",
12
7
  "author": "Payload <dev@payloadcms.com> (https://payloadcms.com)",
13
8
  "maintainers": [
@@ -17,8 +12,20 @@
17
12
  "url": "https://payloadcms.com"
18
13
  }
19
14
  ],
20
- "sideEffects": false,
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/payloadcms/payload.git",
18
+ "directory": "packages/plugin-cloud-storage"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "*.js",
23
+ "*.d.ts"
24
+ ],
21
25
  "type": "module",
26
+ "sideEffects": false,
27
+ "main": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
22
29
  "exports": {
23
30
  ".": {
24
31
  "import": "./dist/index.js",
@@ -41,31 +48,24 @@
41
48
  "default": "./dist/exports/client.js"
42
49
  }
43
50
  },
44
- "main": "./dist/index.js",
45
- "types": "./dist/index.d.ts",
46
- "files": [
47
- "dist",
48
- "*.js",
49
- "*.d.ts"
50
- ],
51
+ "publishConfig": {
52
+ "registry": "https://registry.npmjs.org/"
53
+ },
51
54
  "dependencies": {
55
+ "@payloadcms/ui": "4.0.0-internal.ec73d44",
52
56
  "find-node-modules": "^2.1.3",
53
- "range-parser": "^1.2.1",
54
- "@payloadcms/ui": "4.0.0-internal.ea6e8f8"
57
+ "range-parser": "^1.2.1"
55
58
  },
56
59
  "devDependencies": {
57
60
  "@types/find-node-modules": "^2.1.2",
58
61
  "@types/react": "19.3.0",
59
62
  "@types/react-dom": "19.3.0",
60
- "payload": "4.0.0-internal.ea6e8f8"
63
+ "payload": "4.0.0-internal.ec73d44"
61
64
  },
62
65
  "peerDependencies": {
66
+ "payload": "4.0.0-internal.ec73d44",
63
67
  "react": "^19.0.1 || ^19.1.2 || ^19.2.1",
64
- "react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
65
- "payload": "4.0.0-internal.ea6e8f8"
66
- },
67
- "publishConfig": {
68
- "registry": "https://registry.npmjs.org/"
68
+ "react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1"
69
69
  },
70
70
  "scripts": {
71
71
  "build": "pnpm build:types && pnpm build:swc ",
@@ -73,8 +73,6 @@
73
73
  "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
74
74
  "build:types": "tsc --emitDeclarationOnly --outDir dist",
75
75
  "clean": "rimraf -g {dist,*.tsbuildinfo}",
76
- "lint": "eslint .",
77
- "lint:fix": "eslint . --fix",
78
76
  "test": "echo \"No tests available.\""
79
77
  }
80
78
  }