@payloadcms/plugin-cloud-storage 3.77.0-canary.8 → 3.77.0-internal.16f474b

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;AAEhG,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,CA0F/E,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;AAEhG,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,CA8F/E,CAAA"}
@@ -49,6 +49,9 @@ export const getAfterChangeHook = ({ adapter, collection })=>async ({ doc, opera
49
49
  req.context = {};
50
50
  }
51
51
  req.context.skipCloudStorage = true;
52
+ // Clear to prevent re-processing
53
+ req.file = undefined;
54
+ req.payloadUploadSizes = undefined;
52
55
  await req.payload.update({
53
56
  id: doc.id,
54
57
  collection: collection.slug,
@@ -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 try {\n const files = getIncomingFiles({ data: doc, req })\n\n if (files.length > 0) {\n // If there is a previous doc, files and the operation is update,\n // delete the old files before uploading the new ones.\n if (previousDoc && operation === 'update') {\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 const deletionPromises = filesToDelete.map(async (filename) => {\n if (filename) {\n await adapter.handleDelete({ collection, doc: previousDoc, filename, req })\n }\n })\n\n await Promise.all(deletionPromises)\n }\n\n const uploadResults = await Promise.all(\n files.map((file) =>\n adapter.handleUpload({\n clientUploadContext: file.clientUploadContext,\n collection,\n data: doc,\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 if (Object.keys(uploadMetadata).length > 0) {\n try {\n if (!req.context) {\n req.context = {}\n }\n req.context.skipCloudStorage = true\n\n await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: uploadMetadata,\n depth: 0,\n req,\n })\n delete req.context.skipCloudStorage\n return { ...doc, ...uploadMetadata }\n } catch (updateError: unknown) {\n req.payload.logger.warn(\n `Failed to persist upload data for collection ${collection.slug} document ${doc.id}: ${String(updateError)}`,\n )\n }\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":["getIncomingFiles","getAfterChangeHook","adapter","collection","doc","operation","previousDoc","req","context","skipCloudStorage","files","data","length","filesToDelete","filename","push","sizes","concat","Object","values","map","resizedFileData","deletionPromises","handleDelete","Promise","all","uploadResults","file","handleUpload","clientUploadContext","uploadMetadata","filter","result","reduce","acc","metadata","keys","payload","update","id","slug","depth","updateError","logger","warn","String","err","error"],"mappings":"AAIA,SAASA,gBAAgB,QAAQ,mCAAkC;AAOnE,OAAO,MAAMC,qBACX,CAAC,EAAEC,OAAO,EAAEC,UAAU,EAAQ,GAC9B,OAAO,EAAEC,GAAG,EAAEC,SAAS,EAAEC,WAAW,EAAEC,GAAG,EAAE;QACzC,8DAA8D;QAC9D,IAAIA,IAAIC,OAAO,EAAEC,kBAAkB;YACjC,OAAOL;QACT;QAEA,IAAI;YACF,MAAMM,QAAQV,iBAAiB;gBAAEW,MAAMP;gBAAKG;YAAI;YAEhD,IAAIG,MAAME,MAAM,GAAG,GAAG;gBACpB,iEAAiE;gBACjE,sDAAsD;gBACtD,IAAIN,eAAeD,cAAc,UAAU;oBACzC,IAAIQ,gBAA0B,EAAE;oBAEhC,IAAI,OAAOP,aAAaQ,aAAa,UAAU;wBAC7CD,cAAcE,IAAI,CAACT,YAAYQ,QAAQ;oBACzC;oBAEA,IAAI,OAAOR,YAAYU,KAAK,KAAK,UAAU;wBACzCH,gBAAgBA,cAAcI,MAAM,CAClCC,OAAOC,MAAM,CAACb,aAAaU,SAAS,EAAE,EAAEI,GAAG,CACzC,CAACC,kBAAoBA,iBAAiBP;oBAG5C;oBAEA,MAAMQ,mBAAmBT,cAAcO,GAAG,CAAC,OAAON;wBAChD,IAAIA,UAAU;4BACZ,MAAMZ,QAAQqB,YAAY,CAAC;gCAAEpB;gCAAYC,KAAKE;gCAAaQ;gCAAUP;4BAAI;wBAC3E;oBACF;oBAEA,MAAMiB,QAAQC,GAAG,CAACH;gBACpB;gBAEA,MAAMI,gBAAgB,MAAMF,QAAQC,GAAG,CACrCf,MAAMU,GAAG,CAAC,CAACO,OACTzB,QAAQ0B,YAAY,CAAC;wBACnBC,qBAAqBF,KAAKE,mBAAmB;wBAC7C1B;wBACAQ,MAAMP;wBACNuB;wBACApB;oBACF;gBAIJ,MAAMuB,iBAAiBJ,cACpBK,MAAM,CACL,CAACC,SACCA,UAAU,QAAQ,OAAOA,WAAW,UAEvCC,MAAM,CACL,CAACC,KAAKC,WAAc,CAAA;wBAAE,GAAGD,GAAG;wBAAE,GAAGC,QAAQ;oBAAC,CAAA,GAC1C,CAAC;gBAGL,IAAIjB,OAAOkB,IAAI,CAACN,gBAAgBlB,MAAM,GAAG,GAAG;oBAC1C,IAAI;wBACF,IAAI,CAACL,IAAIC,OAAO,EAAE;4BAChBD,IAAIC,OAAO,GAAG,CAAC;wBACjB;wBACAD,IAAIC,OAAO,CAACC,gBAAgB,GAAG;wBAE/B,MAAMF,IAAI8B,OAAO,CAACC,MAAM,CAAC;4BACvBC,IAAInC,IAAImC,EAAE;4BACVpC,YAAYA,WAAWqC,IAAI;4BAC3B7B,MAAMmB;4BACNW,OAAO;4BACPlC;wBACF;wBACA,OAAOA,IAAIC,OAAO,CAACC,gBAAgB;wBACnC,OAAO;4BAAE,GAAGL,GAAG;4BAAE,GAAG0B,cAAc;wBAAC;oBACrC,EAAE,OAAOY,aAAsB;wBAC7BnC,IAAI8B,OAAO,CAACM,MAAM,CAACC,IAAI,CACrB,CAAC,6CAA6C,EAAEzC,WAAWqC,IAAI,CAAC,UAAU,EAAEpC,IAAImC,EAAE,CAAC,EAAE,EAAEM,OAAOH,cAAc;oBAEhH;gBACF;YACF;QACF,EAAE,OAAOI,KAAc;YACrBvC,IAAI8B,OAAO,CAACM,MAAM,CAACI,KAAK,CACtB,CAAC,yEAAyE,EAAE5C,WAAWqC,IAAI,CAAC,eAAe,EAAEpC,IAAIU,QAAQ,CAAC,CAAC,CAAC;YAE9HP,IAAI8B,OAAO,CAACM,MAAM,CAACI,KAAK,CAAC;gBAAED;YAAI;YAC/B,MAAMA;QACR;QACA,OAAO1C;IACT,EAAC"}
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 try {\n const files = getIncomingFiles({ data: doc, req })\n\n if (files.length > 0) {\n // If there is a previous doc, files and the operation is update,\n // delete the old files before uploading the new ones.\n if (previousDoc && operation === 'update') {\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 const deletionPromises = filesToDelete.map(async (filename) => {\n if (filename) {\n await adapter.handleDelete({ collection, doc: previousDoc, filename, req })\n }\n })\n\n await Promise.all(deletionPromises)\n }\n\n const uploadResults = await Promise.all(\n files.map((file) =>\n adapter.handleUpload({\n clientUploadContext: file.clientUploadContext,\n collection,\n data: doc,\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 if (Object.keys(uploadMetadata).length > 0) {\n try {\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 await req.payload.update({\n id: doc.id,\n collection: collection.slug,\n data: uploadMetadata,\n depth: 0,\n req,\n })\n delete req.context.skipCloudStorage\n return { ...doc, ...uploadMetadata }\n } catch (updateError: unknown) {\n req.payload.logger.warn(\n `Failed to persist upload data for collection ${collection.slug} document ${doc.id}: ${String(updateError)}`,\n )\n }\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":["getIncomingFiles","getAfterChangeHook","adapter","collection","doc","operation","previousDoc","req","context","skipCloudStorage","files","data","length","filesToDelete","filename","push","sizes","concat","Object","values","map","resizedFileData","deletionPromises","handleDelete","Promise","all","uploadResults","file","handleUpload","clientUploadContext","uploadMetadata","filter","result","reduce","acc","metadata","keys","undefined","payloadUploadSizes","payload","update","id","slug","depth","updateError","logger","warn","String","err","error"],"mappings":"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"}
@@ -2,7 +2,7 @@ export const getAfterReadHook = ({ adapter, collection, disablePayloadAccessCont
2
2
  const filename = size ? data?.sizes?.[size.name]?.filename : data?.filename;
3
3
  const prefix = data?.prefix;
4
4
  let url = value;
5
- if (disablePayloadAccessControl && filename) {
5
+ if (filename) {
6
6
  if (generateFileURL) {
7
7
  url = await generateFileURL({
8
8
  collection,
@@ -10,7 +10,7 @@ export const getAfterReadHook = ({ adapter, collection, disablePayloadAccessCont
10
10
  prefix,
11
11
  size
12
12
  });
13
- } else if (adapter.generateURL) {
13
+ } else if (disablePayloadAccessControl && adapter.generateURL) {
14
14
  url = await adapter.generateURL({
15
15
  collection,
16
16
  data,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/afterRead.ts"],"sourcesContent":["import type { CollectionConfig, FieldHook, ImageSize } from 'payload'\n\nimport type { GeneratedAdapter, GenerateFileURL } from '../types.js'\n\ninterface Args {\n adapter: GeneratedAdapter\n collection: CollectionConfig\n disablePayloadAccessControl?: boolean\n generateFileURL?: GenerateFileURL\n size?: ImageSize\n}\n\nexport const getAfterReadHook =\n ({ adapter, collection, disablePayloadAccessControl, generateFileURL, size }: Args): FieldHook =>\n async ({ data, value }) => {\n const filename = size ? data?.sizes?.[size.name]?.filename : data?.filename\n const prefix = data?.prefix\n let url = value\n\n if (disablePayloadAccessControl && filename) {\n if (generateFileURL) {\n url = await generateFileURL({\n collection,\n filename,\n prefix,\n size,\n })\n } else if (adapter.generateURL) {\n url = await adapter.generateURL({\n collection,\n data,\n filename,\n prefix,\n })\n }\n }\n\n return url\n }\n"],"names":["getAfterReadHook","adapter","collection","disablePayloadAccessControl","generateFileURL","size","data","value","filename","sizes","name","prefix","url","generateURL"],"mappings":"AAYA,OAAO,MAAMA,mBACX,CAAC,EAAEC,OAAO,EAAEC,UAAU,EAAEC,2BAA2B,EAAEC,eAAe,EAAEC,IAAI,EAAQ,GAClF,OAAO,EAAEC,IAAI,EAAEC,KAAK,EAAE;QACpB,MAAMC,WAAWH,OAAOC,MAAMG,OAAO,CAACJ,KAAKK,IAAI,CAAC,EAAEF,WAAWF,MAAME;QACnE,MAAMG,SAASL,MAAMK;QACrB,IAAIC,MAAML;QAEV,IAAIJ,+BAA+BK,UAAU;YAC3C,IAAIJ,iBAAiB;gBACnBQ,MAAM,MAAMR,gBAAgB;oBAC1BF;oBACAM;oBACAG;oBACAN;gBACF;YACF,OAAO,IAAIJ,QAAQY,WAAW,EAAE;gBAC9BD,MAAM,MAAMX,QAAQY,WAAW,CAAC;oBAC9BX;oBACAI;oBACAE;oBACAG;gBACF;YACF;QACF;QAEA,OAAOC;IACT,EAAC"}
1
+ {"version":3,"sources":["../../src/hooks/afterRead.ts"],"sourcesContent":["import type { CollectionConfig, FieldHook, ImageSize } from 'payload'\n\nimport type { GeneratedAdapter, GenerateFileURL } from '../types.js'\n\ninterface Args {\n adapter: GeneratedAdapter\n collection: CollectionConfig\n disablePayloadAccessControl?: boolean\n generateFileURL?: GenerateFileURL\n size?: ImageSize\n}\n\nexport const getAfterReadHook =\n ({ adapter, collection, disablePayloadAccessControl, generateFileURL, size }: Args): FieldHook =>\n async ({ data, value }) => {\n const filename = size ? data?.sizes?.[size.name]?.filename : data?.filename\n const prefix = data?.prefix\n let url = value\n\n if (filename) {\n if (generateFileURL) {\n url = await generateFileURL({\n collection,\n filename,\n prefix,\n size,\n })\n } else if (disablePayloadAccessControl && adapter.generateURL) {\n url = await adapter.generateURL({\n collection,\n data,\n filename,\n prefix,\n })\n }\n }\n\n return url\n }\n"],"names":["getAfterReadHook","adapter","collection","disablePayloadAccessControl","generateFileURL","size","data","value","filename","sizes","name","prefix","url","generateURL"],"mappings":"AAYA,OAAO,MAAMA,mBACX,CAAC,EAAEC,OAAO,EAAEC,UAAU,EAAEC,2BAA2B,EAAEC,eAAe,EAAEC,IAAI,EAAQ,GAClF,OAAO,EAAEC,IAAI,EAAEC,KAAK,EAAE;QACpB,MAAMC,WAAWH,OAAOC,MAAMG,OAAO,CAACJ,KAAKK,IAAI,CAAC,EAAEF,WAAWF,MAAME;QACnE,MAAMG,SAASL,MAAMK;QACrB,IAAIC,MAAML;QAEV,IAAIC,UAAU;YACZ,IAAIJ,iBAAiB;gBACnBQ,MAAM,MAAMR,gBAAgB;oBAC1BF;oBACAM;oBACAG;oBACAN;gBACF;YACF,OAAO,IAAIF,+BAA+BF,QAAQY,WAAW,EAAE;gBAC7DD,MAAM,MAAMX,QAAQY,WAAW,CAAC;oBAC9BX;oBACAI;oBACAE;oBACAG;gBACF;YACF;QACF;QAEA,OAAOC;IACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"beforeChange.d.ts","sourceRoot":"","sources":["../../src/hooks/beforeChange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEpE,UAAU,IAAI;IACZ,OAAO,EAAE,gBAAgB,CAAA;IACzB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,eAAO,MAAM,mBAAmB,gFACgD,IAAI,KAAG,SAiCpF,CAAA"}
1
+ {"version":3,"file":"beforeChange.d.ts","sourceRoot":"","sources":["../../src/hooks/beforeChange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEpE,UAAU,IAAI;IACZ,OAAO,EAAE,gBAAgB,CAAA;IACzB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,2BAA2B,CAAC,EAAE,OAAO,CAAA;IACrC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,eAAO,MAAM,mBAAmB,gFACgD,IAAI,KAAG,SA2BpF,CAAA"}
@@ -1,31 +1,25 @@
1
1
  export const getBeforeChangeHook = ({ adapter, collection, disablePayloadAccessControl, generateFileURL, size })=>async ({ data, originalDoc, value })=>{
2
- if (!disablePayloadAccessControl) {
3
- return value;
4
- } else {
5
- const newFilename = size ? data?.sizes?.[size.name]?.filename : data?.filename;
6
- const originalFilename = size ? originalDoc?.sizes?.[size.name]?.filename : originalDoc?.filename;
7
- const filename = newFilename || originalFilename;
8
- const prefix = data?.prefix;
9
- let url = value;
10
- // Store the full URL in the database so files can be accessed directly
11
- // from the storage provider without going through Payload's API
12
- if (generateFileURL) {
13
- url = await generateFileURL({
14
- collection,
15
- filename,
16
- prefix,
17
- size
18
- });
19
- } else if (adapter.generateURL) {
20
- url = await adapter.generateURL({
21
- collection,
22
- data: data || originalDoc,
23
- filename,
24
- prefix
25
- });
26
- }
27
- return url;
2
+ const newFilename = size ? data?.sizes?.[size.name]?.filename : data?.filename;
3
+ const originalFilename = size ? originalDoc?.sizes?.[size.name]?.filename : originalDoc?.filename;
4
+ const filename = newFilename || originalFilename;
5
+ const prefix = data?.prefix;
6
+ let url = value;
7
+ if (generateFileURL && filename) {
8
+ url = await generateFileURL({
9
+ collection,
10
+ filename,
11
+ prefix,
12
+ size
13
+ });
14
+ } else if (disablePayloadAccessControl && filename && adapter.generateURL) {
15
+ url = await adapter.generateURL({
16
+ collection,
17
+ data: data || originalDoc,
18
+ filename,
19
+ prefix
20
+ });
28
21
  }
22
+ return url;
29
23
  };
30
24
 
31
25
  //# sourceMappingURL=beforeChange.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/beforeChange.ts"],"sourcesContent":["import type { CollectionConfig, FieldHook, ImageSize } from 'payload'\n\nimport type { GeneratedAdapter, GenerateFileURL } from '../types.js'\n\ninterface Args {\n adapter: GeneratedAdapter\n collection: CollectionConfig\n disablePayloadAccessControl?: boolean\n generateFileURL?: GenerateFileURL\n size?: ImageSize\n}\n\nexport const getBeforeChangeHook =\n ({ adapter, collection, disablePayloadAccessControl, generateFileURL, size }: Args): FieldHook =>\n async ({ data, originalDoc, value }) => {\n if (!disablePayloadAccessControl) {\n return value\n } else {\n const newFilename = size ? data?.sizes?.[size.name]?.filename : data?.filename\n const originalFilename = size\n ? originalDoc?.sizes?.[size.name]?.filename\n : originalDoc?.filename\n const filename = newFilename || originalFilename\n const prefix = data?.prefix\n let url = value\n\n // Store the full URL in the database so files can be accessed directly\n // from the storage provider without going through Payload's API\n if (generateFileURL) {\n url = await generateFileURL({\n collection,\n filename,\n prefix,\n size,\n })\n } else if (adapter.generateURL) {\n url = await adapter.generateURL({\n collection,\n data: data || originalDoc,\n filename,\n prefix,\n })\n }\n\n return url\n }\n }\n"],"names":["getBeforeChangeHook","adapter","collection","disablePayloadAccessControl","generateFileURL","size","data","originalDoc","value","newFilename","sizes","name","filename","originalFilename","prefix","url","generateURL"],"mappings":"AAYA,OAAO,MAAMA,sBACX,CAAC,EAAEC,OAAO,EAAEC,UAAU,EAAEC,2BAA2B,EAAEC,eAAe,EAAEC,IAAI,EAAQ,GAClF,OAAO,EAAEC,IAAI,EAAEC,WAAW,EAAEC,KAAK,EAAE;QACjC,IAAI,CAACL,6BAA6B;YAChC,OAAOK;QACT,OAAO;YACL,MAAMC,cAAcJ,OAAOC,MAAMI,OAAO,CAACL,KAAKM,IAAI,CAAC,EAAEC,WAAWN,MAAMM;YACtE,MAAMC,mBAAmBR,OACrBE,aAAaG,OAAO,CAACL,KAAKM,IAAI,CAAC,EAAEC,WACjCL,aAAaK;YACjB,MAAMA,WAAWH,eAAeI;YAChC,MAAMC,SAASR,MAAMQ;YACrB,IAAIC,MAAMP;YAEV,uEAAuE;YACvE,gEAAgE;YAChE,IAAIJ,iBAAiB;gBACnBW,MAAM,MAAMX,gBAAgB;oBAC1BF;oBACAU;oBACAE;oBACAT;gBACF;YACF,OAAO,IAAIJ,QAAQe,WAAW,EAAE;gBAC9BD,MAAM,MAAMd,QAAQe,WAAW,CAAC;oBAC9Bd;oBACAI,MAAMA,QAAQC;oBACdK;oBACAE;gBACF;YACF;YAEA,OAAOC;QACT;IACF,EAAC"}
1
+ {"version":3,"sources":["../../src/hooks/beforeChange.ts"],"sourcesContent":["import type { CollectionConfig, FieldHook, ImageSize } from 'payload'\n\nimport type { GeneratedAdapter, GenerateFileURL } from '../types.js'\n\ninterface Args {\n adapter: GeneratedAdapter\n collection: CollectionConfig\n disablePayloadAccessControl?: boolean\n generateFileURL?: GenerateFileURL\n size?: ImageSize\n}\n\nexport const getBeforeChangeHook =\n ({ adapter, collection, disablePayloadAccessControl, generateFileURL, size }: Args): FieldHook =>\n async ({ data, originalDoc, value }) => {\n const newFilename = size ? data?.sizes?.[size.name]?.filename : data?.filename\n const originalFilename = size\n ? originalDoc?.sizes?.[size.name]?.filename\n : originalDoc?.filename\n const filename = newFilename || originalFilename\n const prefix = data?.prefix\n let url = value\n\n if (generateFileURL && filename) {\n url = await generateFileURL({\n collection,\n filename,\n prefix,\n size,\n })\n } else if (disablePayloadAccessControl && filename && adapter.generateURL) {\n url = await adapter.generateURL({\n collection,\n data: data || originalDoc,\n filename,\n prefix,\n })\n }\n\n return url\n }\n"],"names":["getBeforeChangeHook","adapter","collection","disablePayloadAccessControl","generateFileURL","size","data","originalDoc","value","newFilename","sizes","name","filename","originalFilename","prefix","url","generateURL"],"mappings":"AAYA,OAAO,MAAMA,sBACX,CAAC,EAAEC,OAAO,EAAEC,UAAU,EAAEC,2BAA2B,EAAEC,eAAe,EAAEC,IAAI,EAAQ,GAClF,OAAO,EAAEC,IAAI,EAAEC,WAAW,EAAEC,KAAK,EAAE;QACjC,MAAMC,cAAcJ,OAAOC,MAAMI,OAAO,CAACL,KAAKM,IAAI,CAAC,EAAEC,WAAWN,MAAMM;QACtE,MAAMC,mBAAmBR,OACrBE,aAAaG,OAAO,CAACL,KAAKM,IAAI,CAAC,EAAEC,WACjCL,aAAaK;QACjB,MAAMA,WAAWH,eAAeI;QAChC,MAAMC,SAASR,MAAMQ;QACrB,IAAIC,MAAMP;QAEV,IAAIJ,mBAAmBQ,UAAU;YAC/BG,MAAM,MAAMX,gBAAgB;gBAC1BF;gBACAU;gBACAE;gBACAT;YACF;QACF,OAAO,IAAIF,+BAA+BS,YAAYX,QAAQe,WAAW,EAAE;YACzED,MAAM,MAAMd,QAAQe,WAAW,CAAC;gBAC9Bd;gBACAI,MAAMA,QAAQC;gBACdK;gBACAE;YACF;QACF;QAEA,OAAOC;IACT,EAAC"}
@@ -0,0 +1,6 @@
1
+ import type { CollectionBeforeChangeHook, FileData, TypeWithID } from 'payload';
2
+ /**
3
+ * Preserves req.file in req.context and ensures nested calls don't overwrite the original file data.
4
+ */
5
+ export declare const getPreserveFileDataHook: () => CollectionBeforeChangeHook<FileData & TypeWithID>;
6
+ //# sourceMappingURL=preserveFileData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserveFileData.d.ts","sourceRoot":"","sources":["../../src/hooks/preserveFileData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAE/E;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAC9B,0BAA0B,CAAC,QAAQ,GAAG,UAAU,CASnD,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Preserves req.file in req.context and ensures nested calls don't overwrite the original file data.
3
+ */ export const getPreserveFileDataHook = ()=>({ req })=>{
4
+ if (req.file && !req.context?._payloadCloudStorage) {
5
+ req.context = req.context || {};
6
+ req.context._payloadCloudStorage = {
7
+ file: req.file,
8
+ uploadSizes: req.payloadUploadSizes
9
+ };
10
+ }
11
+ };
12
+
13
+ //# sourceMappingURL=preserveFileData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/preserveFileData.ts"],"sourcesContent":["import type { CollectionBeforeChangeHook, FileData, TypeWithID } from 'payload'\n\n/**\n * Preserves req.file in req.context and ensures nested calls don't overwrite the original file data.\n */\nexport const getPreserveFileDataHook =\n (): CollectionBeforeChangeHook<FileData & TypeWithID> =>\n ({ req }) => {\n if (req.file && !req.context?._payloadCloudStorage) {\n req.context = req.context || {}\n req.context._payloadCloudStorage = {\n file: req.file,\n uploadSizes: req.payloadUploadSizes,\n }\n }\n }\n"],"names":["getPreserveFileDataHook","req","file","context","_payloadCloudStorage","uploadSizes","payloadUploadSizes"],"mappings":"AAEA;;CAEC,GACD,OAAO,MAAMA,0BACX,IACA,CAAC,EAAEC,GAAG,EAAE;QACN,IAAIA,IAAIC,IAAI,IAAI,CAACD,IAAIE,OAAO,EAAEC,sBAAsB;YAClDH,IAAIE,OAAO,GAAGF,IAAIE,OAAO,IAAI,CAAC;YAC9BF,IAAIE,OAAO,CAACC,oBAAoB,GAAG;gBACjCF,MAAMD,IAAIC,IAAI;gBACdG,aAAaJ,IAAIK,kBAAkB;YACrC;QACF;IACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAErC,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,YAAY,CAAA;AAe1D,eAAO,MAAM,kBAAkB,kBACb,aAAa,sBACZ,MAAM,KAAG,MAqKzB,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAErC,OAAO,KAAK,EAAa,aAAa,EAAE,MAAM,YAAY,CAAA;AAgB1D,eAAO,MAAM,kBAAkB,kBACb,aAAa,sBACZ,MAAM,KAAG,MAyKzB,CAAA"}
package/dist/plugin.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { getFields } from './fields/getFields.js';
2
2
  import { getAfterChangeHook } from './hooks/afterChange.js';
3
3
  import { getAfterDeleteHook } from './hooks/afterDelete.js';
4
+ import { getPreserveFileDataHook } from './hooks/preserveFileData.js';
4
5
  // This plugin extends all targeted collections by offloading uploaded files
5
6
  // to cloud storage instead of solely storing files locally.
6
7
  // It is based on an adapter approach, where adapters can be written for any cloud provider.
@@ -129,6 +130,10 @@ export const cloudStoragePlugin = (pluginOptions)=>(incomingConfig)=>{
129
130
  adapter,
130
131
  collection: existingCollection
131
132
  })
133
+ ],
134
+ beforeChange: [
135
+ ...existingCollection.hooks?.beforeChange || [],
136
+ getPreserveFileDataHook()
132
137
  ]
133
138
  },
134
139
  upload: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport type { AllowList, PluginOptions } from './types.js'\n\nimport { getFields } from './fields/getFields.js'\nimport { getAfterChangeHook } from './hooks/afterChange.js'\nimport { getAfterDeleteHook } from './hooks/afterDelete.js'\n\n// This plugin extends all targeted collections by offloading uploaded files\n// to cloud storage instead of solely storing files locally.\n\n// It is based on an adapter approach, where adapters can be written for any cloud provider.\n// Adapters are responsible for providing four actions that this plugin will use:\n// 1. handleUpload, 2. handleDelete, 3. generateURL, 4. staticHandler\n\n// Optionally, the adapter can specify any Webpack config overrides if they are necessary.\n\nexport const cloudStoragePlugin =\n (pluginOptions: PluginOptions) =>\n (incomingConfig: Config): Config => {\n const { alwaysInsertFields, collections: allCollectionOptions, enabled } = pluginOptions\n const config = { ...incomingConfig }\n\n // If disabled but alwaysInsertFields is true, only insert fields without full plugin functionality\n if (enabled === false) {\n if (alwaysInsertFields) {\n return {\n ...config,\n collections: (config.collections || []).map((existingCollection) => {\n const options = allCollectionOptions[existingCollection.slug]\n\n if (options) {\n // If adapter is provided, use it to get fields\n const adapter = options.adapter\n ? options.adapter({\n collection: existingCollection,\n prefix: options.prefix,\n })\n : undefined\n\n const fields = getFields({\n adapter,\n alwaysInsertFields: true,\n collection: existingCollection,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n generateFileURL: options.generateFileURL,\n prefix: options.prefix,\n })\n\n return {\n ...existingCollection,\n fields,\n }\n }\n\n return existingCollection\n }),\n }\n }\n\n return config\n }\n\n const initFunctions: Array<() => void> = []\n\n return {\n ...config,\n collections: (config.collections || []).map((existingCollection) => {\n const options = allCollectionOptions[existingCollection.slug]\n\n if (options?.adapter) {\n const adapter = options.adapter({\n collection: existingCollection,\n prefix: options.prefix,\n })\n\n if (adapter.onInit) {\n initFunctions.push(adapter.onInit)\n }\n\n const fields = getFields({\n adapter,\n collection: existingCollection,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n generateFileURL: options.generateFileURL,\n prefix: options.prefix,\n })\n\n const handlers = [\n ...(typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.handlers)\n ? existingCollection.upload.handlers\n : []),\n ]\n\n if (!options.disablePayloadAccessControl) {\n handlers.push(adapter.staticHandler)\n // Else if disablePayloadAccessControl: true and clientUploads is used\n // Build the \"proxied\" handler that responses only when the file was requested by client upload in addDataAndFileToRequest\n } else if (adapter.clientUploads) {\n handlers.push((req, args) => {\n if ('clientUploadContext' in args.params) {\n return adapter.staticHandler(req, args)\n }\n })\n }\n\n const getSkipSafeFetchSetting = (): AllowList | boolean => {\n if (options.disablePayloadAccessControl) {\n return true\n }\n const isBooleanTrueSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n existingCollection.upload.skipSafeFetch === true\n\n const isAllowListSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.skipSafeFetch)\n\n if (isBooleanTrueSkipSafeFetch) {\n return true\n } else if (isAllowListSkipSafeFetch) {\n const existingSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.skipSafeFetch)\n ? existingCollection.upload.skipSafeFetch\n : []\n\n const hasExactLocalhostMatch = existingSkipSafeFetch.some((entry) => {\n const entryKeys = Object.keys(entry)\n return entryKeys.length === 1 && entry.hostname === 'localhost'\n })\n\n const localhostEntry =\n process.env.NODE_ENV !== 'production' && !hasExactLocalhostMatch\n ? [{ hostname: 'localhost' }]\n : []\n\n return [...existingSkipSafeFetch, ...localhostEntry]\n }\n\n if (process.env.NODE_ENV !== 'production') {\n return [{ hostname: 'localhost' }]\n }\n\n return false\n }\n\n return {\n ...existingCollection,\n fields,\n hooks: {\n ...(existingCollection.hooks || {}),\n afterChange: [\n ...(existingCollection.hooks?.afterChange || []),\n getAfterChangeHook({ adapter, collection: existingCollection }),\n ],\n afterDelete: [\n ...(existingCollection.hooks?.afterDelete || []),\n getAfterDeleteHook({ adapter, collection: existingCollection }),\n ],\n },\n upload: {\n ...(typeof existingCollection.upload === 'object' ? existingCollection.upload : {}),\n adapter: adapter.name,\n disableLocalStorage:\n typeof options.disableLocalStorage === 'boolean'\n ? options.disableLocalStorage\n : true,\n handlers,\n skipSafeFetch: getSkipSafeFetchSetting(),\n },\n }\n }\n\n return existingCollection\n }),\n onInit: async (payload) => {\n initFunctions.forEach((fn) => fn())\n if (config.onInit) {\n await config.onInit(payload)\n }\n },\n }\n }\n"],"names":["getFields","getAfterChangeHook","getAfterDeleteHook","cloudStoragePlugin","pluginOptions","incomingConfig","alwaysInsertFields","collections","allCollectionOptions","enabled","config","map","existingCollection","options","slug","adapter","collection","prefix","undefined","fields","disablePayloadAccessControl","generateFileURL","initFunctions","onInit","push","handlers","upload","Array","isArray","staticHandler","clientUploads","req","args","params","getSkipSafeFetchSetting","isBooleanTrueSkipSafeFetch","skipSafeFetch","isAllowListSkipSafeFetch","existingSkipSafeFetch","hasExactLocalhostMatch","some","entry","entryKeys","Object","keys","length","hostname","localhostEntry","process","env","NODE_ENV","hooks","afterChange","afterDelete","name","disableLocalStorage","payload","forEach","fn"],"mappings":"AAIA,SAASA,SAAS,QAAQ,wBAAuB;AACjD,SAASC,kBAAkB,QAAQ,yBAAwB;AAC3D,SAASC,kBAAkB,QAAQ,yBAAwB;AAE3D,4EAA4E;AAC5E,4DAA4D;AAE5D,4FAA4F;AAC5F,iFAAiF;AACjF,qEAAqE;AAErE,0FAA0F;AAE1F,OAAO,MAAMC,qBACX,CAACC,gBACD,CAACC;QACC,MAAM,EAAEC,kBAAkB,EAAEC,aAAaC,oBAAoB,EAAEC,OAAO,EAAE,GAAGL;QAC3E,MAAMM,SAAS;YAAE,GAAGL,cAAc;QAAC;QAEnC,mGAAmG;QACnG,IAAII,YAAY,OAAO;YACrB,IAAIH,oBAAoB;gBACtB,OAAO;oBACL,GAAGI,MAAM;oBACTH,aAAa,AAACG,CAAAA,OAAOH,WAAW,IAAI,EAAE,AAAD,EAAGI,GAAG,CAAC,CAACC;wBAC3C,MAAMC,UAAUL,oBAAoB,CAACI,mBAAmBE,IAAI,CAAC;wBAE7D,IAAID,SAAS;4BACX,+CAA+C;4BAC/C,MAAME,UAAUF,QAAQE,OAAO,GAC3BF,QAAQE,OAAO,CAAC;gCACdC,YAAYJ;gCACZK,QAAQJ,QAAQI,MAAM;4BACxB,KACAC;4BAEJ,MAAMC,SAASnB,UAAU;gCACvBe;gCACAT,oBAAoB;gCACpBU,YAAYJ;gCACZQ,6BAA6BP,QAAQO,2BAA2B;gCAChEC,iBAAiBR,QAAQQ,eAAe;gCACxCJ,QAAQJ,QAAQI,MAAM;4BACxB;4BAEA,OAAO;gCACL,GAAGL,kBAAkB;gCACrBO;4BACF;wBACF;wBAEA,OAAOP;oBACT;gBACF;YACF;YAEA,OAAOF;QACT;QAEA,MAAMY,gBAAmC,EAAE;QAE3C,OAAO;YACL,GAAGZ,MAAM;YACTH,aAAa,AAACG,CAAAA,OAAOH,WAAW,IAAI,EAAE,AAAD,EAAGI,GAAG,CAAC,CAACC;gBAC3C,MAAMC,UAAUL,oBAAoB,CAACI,mBAAmBE,IAAI,CAAC;gBAE7D,IAAID,SAASE,SAAS;oBACpB,MAAMA,UAAUF,QAAQE,OAAO,CAAC;wBAC9BC,YAAYJ;wBACZK,QAAQJ,QAAQI,MAAM;oBACxB;oBAEA,IAAIF,QAAQQ,MAAM,EAAE;wBAClBD,cAAcE,IAAI,CAACT,QAAQQ,MAAM;oBACnC;oBAEA,MAAMJ,SAASnB,UAAU;wBACvBe;wBACAC,YAAYJ;wBACZQ,6BAA6BP,QAAQO,2BAA2B;wBAChEC,iBAAiBR,QAAQQ,eAAe;wBACxCJ,QAAQJ,QAAQI,MAAM;oBACxB;oBAEA,MAAMQ,WAAW;2BACX,OAAOb,mBAAmBc,MAAM,KAAK,YACzCC,MAAMC,OAAO,CAAChB,mBAAmBc,MAAM,CAACD,QAAQ,IAC5Cb,mBAAmBc,MAAM,CAACD,QAAQ,GAClC,EAAE;qBACP;oBAED,IAAI,CAACZ,QAAQO,2BAA2B,EAAE;wBACxCK,SAASD,IAAI,CAACT,QAAQc,aAAa;oBACnC,sEAAsE;oBACtE,0HAA0H;oBAC5H,OAAO,IAAId,QAAQe,aAAa,EAAE;wBAChCL,SAASD,IAAI,CAAC,CAACO,KAAKC;4BAClB,IAAI,yBAAyBA,KAAKC,MAAM,EAAE;gCACxC,OAAOlB,QAAQc,aAAa,CAACE,KAAKC;4BACpC;wBACF;oBACF;oBAEA,MAAME,0BAA0B;wBAC9B,IAAIrB,QAAQO,2BAA2B,EAAE;4BACvC,OAAO;wBACT;wBACA,MAAMe,6BACJ,OAAOvB,mBAAmBc,MAAM,KAAK,YACrCd,mBAAmBc,MAAM,CAACU,aAAa,KAAK;wBAE9C,MAAMC,2BACJ,OAAOzB,mBAAmBc,MAAM,KAAK,YACrCC,MAAMC,OAAO,CAAChB,mBAAmBc,MAAM,CAACU,aAAa;wBAEvD,IAAID,4BAA4B;4BAC9B,OAAO;wBACT,OAAO,IAAIE,0BAA0B;4BACnC,MAAMC,wBACJ,OAAO1B,mBAAmBc,MAAM,KAAK,YACrCC,MAAMC,OAAO,CAAChB,mBAAmBc,MAAM,CAACU,aAAa,IACjDxB,mBAAmBc,MAAM,CAACU,aAAa,GACvC,EAAE;4BAER,MAAMG,yBAAyBD,sBAAsBE,IAAI,CAAC,CAACC;gCACzD,MAAMC,YAAYC,OAAOC,IAAI,CAACH;gCAC9B,OAAOC,UAAUG,MAAM,KAAK,KAAKJ,MAAMK,QAAQ,KAAK;4BACtD;4BAEA,MAAMC,iBACJC,QAAQC,GAAG,CAACC,QAAQ,KAAK,gBAAgB,CAACX,yBACtC;gCAAC;oCAAEO,UAAU;gCAAY;6BAAE,GAC3B,EAAE;4BAER,OAAO;mCAAIR;mCAA0BS;6BAAe;wBACtD;wBAEA,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,cAAc;4BACzC,OAAO;gCAAC;oCAAEJ,UAAU;gCAAY;6BAAE;wBACpC;wBAEA,OAAO;oBACT;oBAEA,OAAO;wBACL,GAAGlC,kBAAkB;wBACrBO;wBACAgC,OAAO;4BACL,GAAIvC,mBAAmBuC,KAAK,IAAI,CAAC,CAAC;4BAClCC,aAAa;mCACPxC,mBAAmBuC,KAAK,EAAEC,eAAe,EAAE;gCAC/CnD,mBAAmB;oCAAEc;oCAASC,YAAYJ;gCAAmB;6BAC9D;4BACDyC,aAAa;mCACPzC,mBAAmBuC,KAAK,EAAEE,eAAe,EAAE;gCAC/CnD,mBAAmB;oCAAEa;oCAASC,YAAYJ;gCAAmB;6BAC9D;wBACH;wBACAc,QAAQ;4BACN,GAAI,OAAOd,mBAAmBc,MAAM,KAAK,WAAWd,mBAAmBc,MAAM,GAAG,CAAC,CAAC;4BAClFX,SAASA,QAAQuC,IAAI;4BACrBC,qBACE,OAAO1C,QAAQ0C,mBAAmB,KAAK,YACnC1C,QAAQ0C,mBAAmB,GAC3B;4BACN9B;4BACAW,eAAeF;wBACjB;oBACF;gBACF;gBAEA,OAAOtB;YACT;YACAW,QAAQ,OAAOiC;gBACblC,cAAcmC,OAAO,CAAC,CAACC,KAAOA;gBAC9B,IAAIhD,OAAOa,MAAM,EAAE;oBACjB,MAAMb,OAAOa,MAAM,CAACiC;gBACtB;YACF;QACF;IACF,EAAC"}
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport type { AllowList, PluginOptions } from './types.js'\n\nimport { getFields } from './fields/getFields.js'\nimport { getAfterChangeHook } from './hooks/afterChange.js'\nimport { getAfterDeleteHook } from './hooks/afterDelete.js'\nimport { getPreserveFileDataHook } from './hooks/preserveFileData.js'\n\n// This plugin extends all targeted collections by offloading uploaded files\n// to cloud storage instead of solely storing files locally.\n\n// It is based on an adapter approach, where adapters can be written for any cloud provider.\n// Adapters are responsible for providing four actions that this plugin will use:\n// 1. handleUpload, 2. handleDelete, 3. generateURL, 4. staticHandler\n\n// Optionally, the adapter can specify any Webpack config overrides if they are necessary.\n\nexport const cloudStoragePlugin =\n (pluginOptions: PluginOptions) =>\n (incomingConfig: Config): Config => {\n const { alwaysInsertFields, collections: allCollectionOptions, enabled } = pluginOptions\n const config = { ...incomingConfig }\n\n // If disabled but alwaysInsertFields is true, only insert fields without full plugin functionality\n if (enabled === false) {\n if (alwaysInsertFields) {\n return {\n ...config,\n collections: (config.collections || []).map((existingCollection) => {\n const options = allCollectionOptions[existingCollection.slug]\n\n if (options) {\n // If adapter is provided, use it to get fields\n const adapter = options.adapter\n ? options.adapter({\n collection: existingCollection,\n prefix: options.prefix,\n })\n : undefined\n\n const fields = getFields({\n adapter,\n alwaysInsertFields: true,\n collection: existingCollection,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n generateFileURL: options.generateFileURL,\n prefix: options.prefix,\n })\n\n return {\n ...existingCollection,\n fields,\n }\n }\n\n return existingCollection\n }),\n }\n }\n\n return config\n }\n\n const initFunctions: Array<() => void> = []\n\n return {\n ...config,\n collections: (config.collections || []).map((existingCollection) => {\n const options = allCollectionOptions[existingCollection.slug]\n\n if (options?.adapter) {\n const adapter = options.adapter({\n collection: existingCollection,\n prefix: options.prefix,\n })\n\n if (adapter.onInit) {\n initFunctions.push(adapter.onInit)\n }\n\n const fields = getFields({\n adapter,\n collection: existingCollection,\n disablePayloadAccessControl: options.disablePayloadAccessControl,\n generateFileURL: options.generateFileURL,\n prefix: options.prefix,\n })\n\n const handlers = [\n ...(typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.handlers)\n ? existingCollection.upload.handlers\n : []),\n ]\n\n if (!options.disablePayloadAccessControl) {\n handlers.push(adapter.staticHandler)\n // Else if disablePayloadAccessControl: true and clientUploads is used\n // Build the \"proxied\" handler that responses only when the file was requested by client upload in addDataAndFileToRequest\n } else if (adapter.clientUploads) {\n handlers.push((req, args) => {\n if ('clientUploadContext' in args.params) {\n return adapter.staticHandler(req, args)\n }\n })\n }\n\n const getSkipSafeFetchSetting = (): AllowList | boolean => {\n if (options.disablePayloadAccessControl) {\n return true\n }\n const isBooleanTrueSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n existingCollection.upload.skipSafeFetch === true\n\n const isAllowListSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.skipSafeFetch)\n\n if (isBooleanTrueSkipSafeFetch) {\n return true\n } else if (isAllowListSkipSafeFetch) {\n const existingSkipSafeFetch =\n typeof existingCollection.upload === 'object' &&\n Array.isArray(existingCollection.upload.skipSafeFetch)\n ? existingCollection.upload.skipSafeFetch\n : []\n\n const hasExactLocalhostMatch = existingSkipSafeFetch.some((entry) => {\n const entryKeys = Object.keys(entry)\n return entryKeys.length === 1 && entry.hostname === 'localhost'\n })\n\n const localhostEntry =\n process.env.NODE_ENV !== 'production' && !hasExactLocalhostMatch\n ? [{ hostname: 'localhost' }]\n : []\n\n return [...existingSkipSafeFetch, ...localhostEntry]\n }\n\n if (process.env.NODE_ENV !== 'production') {\n return [{ hostname: 'localhost' }]\n }\n\n return false\n }\n\n return {\n ...existingCollection,\n fields,\n hooks: {\n ...(existingCollection.hooks || {}),\n afterChange: [\n ...(existingCollection.hooks?.afterChange || []),\n getAfterChangeHook({ adapter, collection: existingCollection }),\n ],\n afterDelete: [\n ...(existingCollection.hooks?.afterDelete || []),\n getAfterDeleteHook({ adapter, collection: existingCollection }),\n ],\n beforeChange: [\n ...(existingCollection.hooks?.beforeChange || []),\n getPreserveFileDataHook(),\n ],\n },\n upload: {\n ...(typeof existingCollection.upload === 'object' ? existingCollection.upload : {}),\n adapter: adapter.name,\n disableLocalStorage:\n typeof options.disableLocalStorage === 'boolean'\n ? options.disableLocalStorage\n : true,\n handlers,\n skipSafeFetch: getSkipSafeFetchSetting(),\n },\n }\n }\n\n return existingCollection\n }),\n onInit: async (payload) => {\n initFunctions.forEach((fn) => fn())\n if (config.onInit) {\n await config.onInit(payload)\n }\n },\n }\n }\n"],"names":["getFields","getAfterChangeHook","getAfterDeleteHook","getPreserveFileDataHook","cloudStoragePlugin","pluginOptions","incomingConfig","alwaysInsertFields","collections","allCollectionOptions","enabled","config","map","existingCollection","options","slug","adapter","collection","prefix","undefined","fields","disablePayloadAccessControl","generateFileURL","initFunctions","onInit","push","handlers","upload","Array","isArray","staticHandler","clientUploads","req","args","params","getSkipSafeFetchSetting","isBooleanTrueSkipSafeFetch","skipSafeFetch","isAllowListSkipSafeFetch","existingSkipSafeFetch","hasExactLocalhostMatch","some","entry","entryKeys","Object","keys","length","hostname","localhostEntry","process","env","NODE_ENV","hooks","afterChange","afterDelete","beforeChange","name","disableLocalStorage","payload","forEach","fn"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getIncomingFiles.d.ts","sourceRoot":"","sources":["../../src/utilities/getIncomingFiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAEvC,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,GAAG,GACJ,EAAE;IACD,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,IAAI,EAAE,CAkCT"}
1
+ {"version":3,"file":"getIncomingFiles.d.ts","sourceRoot":"","sources":["../../src/utilities/getIncomingFiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAOvC,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,GAAG,GACJ,EAAE;IACD,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;CACpB,GAAG,IAAI,EAAE,CAqCT"}
@@ -1,5 +1,8 @@
1
1
  export function getIncomingFiles({ data, req }) {
2
- const file = req.file;
2
+ // Fall back to context if req.file was cleared
3
+ const ctx = req.context?._payloadCloudStorage;
4
+ const file = req.file ?? ctx?.file;
5
+ const payloadUploadSizes = req.payloadUploadSizes ?? ctx?.uploadSizes;
3
6
  let files = [];
4
7
  if (file && data.filename && data.mimeType) {
5
8
  const mainFile = {
@@ -15,12 +18,12 @@ export function getIncomingFiles({ data, req }) {
15
18
  ];
16
19
  if (data?.sizes) {
17
20
  Object.entries(data.sizes).forEach(([key, resizedFileData])=>{
18
- if (req.payloadUploadSizes?.[key] && resizedFileData.mimeType) {
21
+ if (payloadUploadSizes?.[key] && resizedFileData.mimeType) {
19
22
  files = files.concat([
20
23
  {
21
- buffer: req.payloadUploadSizes[key],
24
+ buffer: payloadUploadSizes[key],
22
25
  filename: `${resizedFileData.filename}`,
23
- filesize: req.payloadUploadSizes[key].length,
26
+ filesize: payloadUploadSizes[key].length,
24
27
  mimeType: resizedFileData.mimeType
25
28
  }
26
29
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getIncomingFiles.ts"],"sourcesContent":["import type { FileData, PayloadRequest } from 'payload'\n\nimport type { File } from '../types.js'\n\nexport function getIncomingFiles({\n data,\n req,\n}: {\n data: Partial<FileData>\n req: PayloadRequest\n}): File[] {\n const file = req.file\n\n let files: File[] = []\n\n if (file && data.filename && data.mimeType) {\n const mainFile: File = {\n buffer: file.data,\n clientUploadContext: file.clientUploadContext,\n filename: data.filename,\n filesize: file.size,\n mimeType: data.mimeType,\n tempFilePath: file.tempFilePath,\n }\n\n files = [mainFile]\n\n if (data?.sizes) {\n Object.entries(data.sizes).forEach(([key, resizedFileData]) => {\n if (req.payloadUploadSizes?.[key] && resizedFileData.mimeType) {\n files = files.concat([\n {\n buffer: req.payloadUploadSizes[key],\n filename: `${resizedFileData.filename}`,\n filesize: req.payloadUploadSizes[key].length,\n mimeType: resizedFileData.mimeType,\n },\n ])\n }\n })\n }\n }\n\n return files\n}\n"],"names":["getIncomingFiles","data","req","file","files","filename","mimeType","mainFile","buffer","clientUploadContext","filesize","size","tempFilePath","sizes","Object","entries","forEach","key","resizedFileData","payloadUploadSizes","concat","length"],"mappings":"AAIA,OAAO,SAASA,iBAAiB,EAC/BC,IAAI,EACJC,GAAG,EAIJ;IACC,MAAMC,OAAOD,IAAIC,IAAI;IAErB,IAAIC,QAAgB,EAAE;IAEtB,IAAID,QAAQF,KAAKI,QAAQ,IAAIJ,KAAKK,QAAQ,EAAE;QAC1C,MAAMC,WAAiB;YACrBC,QAAQL,KAAKF,IAAI;YACjBQ,qBAAqBN,KAAKM,mBAAmB;YAC7CJ,UAAUJ,KAAKI,QAAQ;YACvBK,UAAUP,KAAKQ,IAAI;YACnBL,UAAUL,KAAKK,QAAQ;YACvBM,cAAcT,KAAKS,YAAY;QACjC;QAEAR,QAAQ;YAACG;SAAS;QAElB,IAAIN,MAAMY,OAAO;YACfC,OAAOC,OAAO,CAACd,KAAKY,KAAK,EAAEG,OAAO,CAAC,CAAC,CAACC,KAAKC,gBAAgB;gBACxD,IAAIhB,IAAIiB,kBAAkB,EAAE,CAACF,IAAI,IAAIC,gBAAgBZ,QAAQ,EAAE;oBAC7DF,QAAQA,MAAMgB,MAAM,CAAC;wBACnB;4BACEZ,QAAQN,IAAIiB,kBAAkB,CAACF,IAAI;4BACnCZ,UAAU,GAAGa,gBAAgBb,QAAQ,EAAE;4BACvCK,UAAUR,IAAIiB,kBAAkB,CAACF,IAAI,CAACI,MAAM;4BAC5Cf,UAAUY,gBAAgBZ,QAAQ;wBACpC;qBACD;gBACH;YACF;QACF;IACF;IAEA,OAAOF;AACT"}
1
+ {"version":3,"sources":["../../src/utilities/getIncomingFiles.ts"],"sourcesContent":["import type { FileData, PayloadRequest } from 'payload'\n\nimport type { File } from '../types.js'\n\ninterface CloudStorageContext {\n file: PayloadRequest['file']\n uploadSizes: PayloadRequest['payloadUploadSizes']\n}\n\nexport function getIncomingFiles({\n data,\n req,\n}: {\n data: Partial<FileData>\n req: PayloadRequest\n}): File[] {\n // Fall back to context if req.file was cleared\n const ctx = req.context?._payloadCloudStorage as CloudStorageContext | undefined\n const file = req.file ?? ctx?.file\n const payloadUploadSizes = req.payloadUploadSizes ?? ctx?.uploadSizes\n\n let files: File[] = []\n\n if (file && data.filename && data.mimeType) {\n const mainFile: File = {\n buffer: file.data,\n clientUploadContext: file.clientUploadContext,\n filename: data.filename,\n filesize: file.size,\n mimeType: data.mimeType,\n tempFilePath: file.tempFilePath,\n }\n\n files = [mainFile]\n\n if (data?.sizes) {\n Object.entries(data.sizes).forEach(([key, resizedFileData]) => {\n if (payloadUploadSizes?.[key] && resizedFileData.mimeType) {\n files = files.concat([\n {\n buffer: payloadUploadSizes[key],\n filename: `${resizedFileData.filename}`,\n filesize: payloadUploadSizes[key].length,\n mimeType: resizedFileData.mimeType,\n },\n ])\n }\n })\n }\n }\n\n return files\n}\n"],"names":["getIncomingFiles","data","req","ctx","context","_payloadCloudStorage","file","payloadUploadSizes","uploadSizes","files","filename","mimeType","mainFile","buffer","clientUploadContext","filesize","size","tempFilePath","sizes","Object","entries","forEach","key","resizedFileData","concat","length"],"mappings":"AASA,OAAO,SAASA,iBAAiB,EAC/BC,IAAI,EACJC,GAAG,EAIJ;IACC,+CAA+C;IAC/C,MAAMC,MAAMD,IAAIE,OAAO,EAAEC;IACzB,MAAMC,OAAOJ,IAAII,IAAI,IAAIH,KAAKG;IAC9B,MAAMC,qBAAqBL,IAAIK,kBAAkB,IAAIJ,KAAKK;IAE1D,IAAIC,QAAgB,EAAE;IAEtB,IAAIH,QAAQL,KAAKS,QAAQ,IAAIT,KAAKU,QAAQ,EAAE;QAC1C,MAAMC,WAAiB;YACrBC,QAAQP,KAAKL,IAAI;YACjBa,qBAAqBR,KAAKQ,mBAAmB;YAC7CJ,UAAUT,KAAKS,QAAQ;YACvBK,UAAUT,KAAKU,IAAI;YACnBL,UAAUV,KAAKU,QAAQ;YACvBM,cAAcX,KAAKW,YAAY;QACjC;QAEAR,QAAQ;YAACG;SAAS;QAElB,IAAIX,MAAMiB,OAAO;YACfC,OAAOC,OAAO,CAACnB,KAAKiB,KAAK,EAAEG,OAAO,CAAC,CAAC,CAACC,KAAKC,gBAAgB;gBACxD,IAAIhB,oBAAoB,CAACe,IAAI,IAAIC,gBAAgBZ,QAAQ,EAAE;oBACzDF,QAAQA,MAAMe,MAAM,CAAC;wBACnB;4BACEX,QAAQN,kBAAkB,CAACe,IAAI;4BAC/BZ,UAAU,GAAGa,gBAAgBb,QAAQ,EAAE;4BACvCK,UAAUR,kBAAkB,CAACe,IAAI,CAACG,MAAM;4BACxCd,UAAUY,gBAAgBZ,QAAQ;wBACpC;qBACD;gBACH;YACF;QACF;IACF;IAEA,OAAOF;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-cloud-storage",
3
- "version": "3.77.0-canary.8",
3
+ "version": "3.77.0-internal.16f474b",
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": "3.77.0-canary.8"
54
+ "@payloadcms/ui": "3.77.0-internal.16f474b"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@types/find-node-modules": "^2.1.2",
58
58
  "@types/react": "19.2.9",
59
59
  "@types/react-dom": "19.2.3",
60
- "payload": "3.77.0-canary.8"
60
+ "payload": "3.77.0-internal.16f474b"
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": "3.77.0-canary.8"
65
+ "payload": "3.77.0-internal.16f474b"
66
66
  },
67
67
  "publishConfig": {
68
68
  "registry": "https://registry.npmjs.org/"