@payloadcms/plugin-cloud-storage 4.0.0-internal.af6aad0 → 4.0.0-internal.b8e7c89
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,"file":"afterChange.d.ts","sourceRoot":"","sources":["../../src/hooks/afterChange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"afterChange.d.ts","sourceRoot":"","sources":["../../src/hooks/afterChange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAIhG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAInD,UAAU,IAAI;IACZ,OAAO,EAAE,gBAAgB,CAAA;IACzB,UAAU,EAAE,gBAAgB,CAAA;CAC7B;AAED,eAAO,MAAM,kBAAkB,4BACH,IAAI,KAAG,yBAAyB,CAAC,QAAQ,GAAG,UAAU,CA8H/E,CAAA"}
|
|
@@ -1,20 +1,23 @@
|
|
|
1
|
+
import { deepMergeWithSourceArrays } from 'payload';
|
|
1
2
|
import { getIncomingFiles } from '../utilities/getIncomingFiles.js';
|
|
2
|
-
export const getAfterChangeHook = ({ adapter, collection })=>async ({ doc, operation, previousDoc, req })=>{
|
|
3
|
+
export const getAfterChangeHook = ({ adapter, collection })=>async ({ data, doc, operation, previousDoc, req, select })=>{
|
|
3
4
|
// Skip if this is an internal update to prevent infinite loop
|
|
4
5
|
if (req.context?.skipCloudStorage) {
|
|
5
6
|
return doc;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
+
// Restore upload metadata removed by select, including partially selected image sizes.
|
|
9
|
+
const uploadData = select ? deepMergeWithSourceArrays(data, doc) : doc;
|
|
10
|
+
const isDraftSave = uploadData._status === 'draft';
|
|
8
11
|
const isDraftOverPublished = isDraftSave && previousDoc?._status === 'published';
|
|
9
12
|
try {
|
|
10
13
|
const files = getIncomingFiles({
|
|
11
|
-
data:
|
|
14
|
+
data: uploadData,
|
|
12
15
|
req
|
|
13
16
|
});
|
|
14
17
|
if (files.length > 0) {
|
|
15
18
|
const uploadResults = await Promise.all(files.filter((file)=>!file.uploadReference).map((file)=>adapter.handleUpload({
|
|
16
19
|
collection,
|
|
17
|
-
data:
|
|
20
|
+
data: uploadData,
|
|
18
21
|
file,
|
|
19
22
|
req
|
|
20
23
|
})));
|
|
@@ -32,21 +35,26 @@ export const getAfterChangeHook = ({ adapter, collection })=>async ({ doc, opera
|
|
|
32
35
|
req.file = undefined;
|
|
33
36
|
req.payloadUploadSizes = undefined;
|
|
34
37
|
try {
|
|
35
|
-
await req.payload.update({
|
|
38
|
+
const updatedDoc = await req.payload.update({
|
|
36
39
|
id: doc.id,
|
|
37
40
|
collection: collection.slug,
|
|
38
41
|
data: uploadMetadata,
|
|
39
42
|
depth: 0,
|
|
40
43
|
draft: isDraftSave,
|
|
41
|
-
req
|
|
44
|
+
req,
|
|
45
|
+
select
|
|
42
46
|
});
|
|
47
|
+
// Persist all adapter metadata, but do not add unselected fields to the response.
|
|
48
|
+
docWithMetadata = select ? {
|
|
49
|
+
...doc,
|
|
50
|
+
...updatedDoc
|
|
51
|
+
} : {
|
|
52
|
+
...doc,
|
|
53
|
+
...uploadMetadata
|
|
54
|
+
};
|
|
43
55
|
} finally{
|
|
44
56
|
delete req.context.skipCloudStorage;
|
|
45
57
|
}
|
|
46
|
-
docWithMetadata = {
|
|
47
|
-
...doc,
|
|
48
|
-
...uploadMetadata
|
|
49
|
-
};
|
|
50
58
|
}
|
|
51
59
|
// Delete previous files only after the new upload and metadata
|
|
52
60
|
// persistence have succeeded. Deleting earlier would orphan the
|
|
@@ -63,12 +71,16 @@ export const getAfterChangeHook = ({ adapter, collection })=>async ({ doc, opera
|
|
|
63
71
|
// Collect new filenames (main + sizes) so we don't delete a
|
|
64
72
|
// file that the new upload reused (e.g. same filename on reupload
|
|
65
73
|
// where Payload overwrites in place).
|
|
74
|
+
const newFileData = {
|
|
75
|
+
...uploadData,
|
|
76
|
+
...uploadMetadata
|
|
77
|
+
};
|
|
66
78
|
const newFilenames = new Set();
|
|
67
|
-
if (typeof
|
|
68
|
-
newFilenames.add(
|
|
79
|
+
if (typeof newFileData.filename === 'string') {
|
|
80
|
+
newFilenames.add(newFileData.filename);
|
|
69
81
|
}
|
|
70
|
-
if (typeof
|
|
71
|
-
for (const size of Object.values(
|
|
82
|
+
if (typeof newFileData.sizes === 'object') {
|
|
83
|
+
for (const size of Object.values(newFileData.sizes || {})){
|
|
72
84
|
if (size?.filename && typeof size.filename === 'string') {
|
|
73
85
|
newFilenames.add(size.filename);
|
|
74
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/afterChange.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, CollectionConfig, FileData, TypeWithID } from 'payload'\n\nimport type { GeneratedAdapter } from '../types.js'\n\nimport { getIncomingFiles } from '../utilities/getIncomingFiles.js'\n\ninterface Args {\n adapter: GeneratedAdapter\n collection: CollectionConfig\n}\n\nexport const getAfterChangeHook =\n ({ adapter, collection }: Args): CollectionAfterChangeHook<FileData & TypeWithID> =>\n async ({ doc, operation, previousDoc, req }) => {\n // Skip if this is an internal update to prevent infinite loop\n if (req.context?.skipCloudStorage) {\n return doc\n }\n\n const
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/afterChange.ts"],"sourcesContent":["import type { CollectionAfterChangeHook, CollectionConfig, FileData, TypeWithID } from 'payload'\n\nimport { deepMergeWithSourceArrays } from 'payload'\n\nimport type { GeneratedAdapter } from '../types.js'\n\nimport { getIncomingFiles } from '../utilities/getIncomingFiles.js'\n\ninterface Args {\n adapter: GeneratedAdapter\n collection: CollectionConfig\n}\n\nexport const getAfterChangeHook =\n ({ adapter, collection }: 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 isDraftSave = (uploadData as { _status?: string })._status === 'draft'\n const isDraftOverPublished =\n isDraftSave && (previousDoc as { _status?: string } | undefined)?._status === 'published'\n\n try {\n const files = getIncomingFiles({ data: uploadData, req })\n\n if (files.length > 0) {\n const uploadResults = await Promise.all(\n files\n .filter((file) => !file.uploadReference)\n .map((file) =>\n adapter.handleUpload({\n collection,\n data: uploadData,\n file,\n req,\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 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 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 (previousDoc && operation === 'update' && !isDraftOverPublished) {\n let filesToDelete: string[] = []\n\n if (typeof previousDoc?.filename === 'string') {\n filesToDelete.push(previousDoc.filename)\n }\n\n if (typeof previousDoc.sizes === 'object') {\n filesToDelete = filesToDelete.concat(\n Object.values(previousDoc?.sizes || []).map(\n (resizedFileData) => resizedFileData?.filename as string,\n ),\n )\n }\n\n // Collect new filenames (main + sizes) so we don't delete a\n // file that the new upload reused (e.g. same filename on reupload\n // where Payload overwrites in place).\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.sizes === 'object') {\n for (const size of Object.values(newFileData.sizes || {})) {\n if (size?.filename && typeof size.filename === 'string') {\n newFilenames.add(size.filename)\n }\n }\n }\n\n const deletionPromises = filesToDelete.map(async (filename) => {\n if (filename && !newFilenames.has(filename)) {\n await adapter.handleDelete({ collection, doc: previousDoc, filename, req })\n }\n })\n\n await Promise.all(deletionPromises)\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"],"names":["deepMergeWithSourceArrays","getIncomingFiles","getAfterChangeHook","adapter","collection","data","doc","operation","previousDoc","req","select","context","skipCloudStorage","uploadData","isDraftSave","_status","isDraftOverPublished","files","length","uploadResults","Promise","all","filter","file","uploadReference","map","handleUpload","uploadMetadata","result","reduce","acc","metadata","docWithMetadata","Object","keys","undefined","payloadUploadSizes","updatedDoc","payload","update","id","slug","depth","draft","filesToDelete","filename","push","sizes","concat","values","resizedFileData","newFileData","newFilenames","Set","add","size","deletionPromises","has","handleDelete","err","logger","error"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/plugin-cloud-storage",
|
|
3
|
-
"version": "4.0.0-internal.
|
|
3
|
+
"version": "4.0.0-internal.b8e7c89",
|
|
4
4
|
"description": "The official cloud storage plugin for Payload CMS",
|
|
5
5
|
"homepage": "https://payloadcms.com",
|
|
6
6
|
"repository": {
|
|
@@ -51,18 +51,18 @@
|
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"find-node-modules": "^2.1.3",
|
|
53
53
|
"range-parser": "^1.2.1",
|
|
54
|
-
"@payloadcms/ui": "4.0.0-internal.
|
|
54
|
+
"@payloadcms/ui": "4.0.0-internal.b8e7c89"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@types/find-node-modules": "^2.1.2",
|
|
58
58
|
"@types/react": "19.2.14",
|
|
59
59
|
"@types/react-dom": "19.2.3",
|
|
60
|
-
"payload": "4.0.0-internal.
|
|
60
|
+
"payload": "4.0.0-internal.b8e7c89"
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|
|
63
63
|
"react": "^19.0.1 || ^19.1.2 || ^19.2.1",
|
|
64
64
|
"react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
|
|
65
|
-
"payload": "4.0.0-internal.
|
|
65
|
+
"payload": "4.0.0-internal.b8e7c89"
|
|
66
66
|
},
|
|
67
67
|
"publishConfig": {
|
|
68
68
|
"registry": "https://registry.npmjs.org/"
|