@payloadcms/storage-r2 3.91.0 → 3.92.1

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":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,mBAAmB,EAEpB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAM1C,UAAU,mBAAmB;IAC3B,MAAM,EAAE,QAAQ,CAAA;IAChB,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,aAAa,EACb,oBAA4B,GAC7B,EAAE,mBAAmB,GAAG,OAAO,CAiC/B"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,mBAAmB,EAEpB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAM1C,UAAU,mBAAmB;IAC3B,MAAM,EAAE,QAAQ,CAAA;IAChB,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,aAAa,EACb,oBAA4B,GAC7B,EAAE,mBAAmB,GAAG,OAAO,CAkC/B"}
package/dist/adapter.js CHANGED
@@ -14,7 +14,8 @@ export function createR2Adapter({ bucket, clientUploads, useCompositePrefixes =
14
14
  bucket,
15
15
  buffer: file.buffer,
16
16
  mimeType: file.mimeType,
17
- storageFilePath
17
+ storageFilePath,
18
+ tempFilePath: file.tempFilePath
18
19
  }),
19
20
  staticHandler: (req, { doc, headers, params: { clientUploadContext, filename } })=>getFile({
20
21
  bucket,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapter.ts"],"sourcesContent":["import type {\n Adapter,\n ClientUploadsConfig,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\n\nimport type { R2Bucket } from './types.js'\n\nimport { deleteFile } from './deleteFile.js'\nimport { getFile } from './getFile.js'\nimport { uploadFile } from './uploadFile.js'\n\ninterface CreateR2AdapterArgs {\n bucket: R2Bucket\n clientUploads?: ClientUploadsConfig\n useCompositePrefixes?: boolean\n}\n\nexport function createR2Adapter({\n bucket,\n clientUploads,\n useCompositePrefixes = false,\n}: CreateR2AdapterArgs): Adapter {\n return ({ collection, prefix = '' }): GeneratedAdapter => ({\n name: 'r2',\n clientUploads,\n requiresClientUploadReceipt: true,\n\n handleDelete: ({ storageFilePath }) =>\n deleteFile({\n bucket,\n storageFilePath,\n }),\n\n handleUpload: ({ file, storageFilePath }) =>\n uploadFile({\n bucket,\n buffer: file.buffer,\n mimeType: file.mimeType,\n storageFilePath,\n }),\n\n staticHandler: (req, { doc, headers, params: { clientUploadContext, filename } }) =>\n getFile({\n bucket,\n clientUploadContext,\n collection,\n doc,\n filename,\n incomingHeaders: headers,\n prefix,\n req,\n useCompositePrefixes,\n }),\n })\n}\n"],"names":["deleteFile","getFile","uploadFile","createR2Adapter","bucket","clientUploads","useCompositePrefixes","collection","prefix","name","requiresClientUploadReceipt","handleDelete","storageFilePath","handleUpload","file","buffer","mimeType","staticHandler","req","doc","headers","params","clientUploadContext","filename","incomingHeaders"],"mappings":"AAQA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,OAAO,QAAQ,eAAc;AACtC,SAASC,UAAU,QAAQ,kBAAiB;AAQ5C,OAAO,SAASC,gBAAgB,EAC9BC,MAAM,EACNC,aAAa,EACbC,uBAAuB,KAAK,EACR;IACpB,OAAO,CAAC,EAAEC,UAAU,EAAEC,SAAS,EAAE,EAAE,GAAwB,CAAA;YACzDC,MAAM;YACNJ;YACAK,6BAA6B;YAE7BC,cAAc,CAAC,EAAEC,eAAe,EAAE,GAChCZ,WAAW;oBACTI;oBACAQ;gBACF;YAEFC,cAAc,CAAC,EAAEC,IAAI,EAAEF,eAAe,EAAE,GACtCV,WAAW;oBACTE;oBACAW,QAAQD,KAAKC,MAAM;oBACnBC,UAAUF,KAAKE,QAAQ;oBACvBJ;gBACF;YAEFK,eAAe,CAACC,KAAK,EAAEC,GAAG,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,mBAAmB,EAAEC,QAAQ,EAAE,EAAE,GAC9EtB,QAAQ;oBACNG;oBACAkB;oBACAf;oBACAY;oBACAI;oBACAC,iBAAiBJ;oBACjBZ;oBACAU;oBACAZ;gBACF;QACJ,CAAA;AACF"}
1
+ {"version":3,"sources":["../src/adapter.ts"],"sourcesContent":["import type {\n Adapter,\n ClientUploadsConfig,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\n\nimport type { R2Bucket } from './types.js'\n\nimport { deleteFile } from './deleteFile.js'\nimport { getFile } from './getFile.js'\nimport { uploadFile } from './uploadFile.js'\n\ninterface CreateR2AdapterArgs {\n bucket: R2Bucket\n clientUploads?: ClientUploadsConfig\n useCompositePrefixes?: boolean\n}\n\nexport function createR2Adapter({\n bucket,\n clientUploads,\n useCompositePrefixes = false,\n}: CreateR2AdapterArgs): Adapter {\n return ({ collection, prefix = '' }): GeneratedAdapter => ({\n name: 'r2',\n clientUploads,\n requiresClientUploadReceipt: true,\n\n handleDelete: ({ storageFilePath }) =>\n deleteFile({\n bucket,\n storageFilePath,\n }),\n\n handleUpload: ({ file, storageFilePath }) =>\n uploadFile({\n bucket,\n buffer: file.buffer,\n mimeType: file.mimeType,\n storageFilePath,\n tempFilePath: file.tempFilePath,\n }),\n\n staticHandler: (req, { doc, headers, params: { clientUploadContext, filename } }) =>\n getFile({\n bucket,\n clientUploadContext,\n collection,\n doc,\n filename,\n incomingHeaders: headers,\n prefix,\n req,\n useCompositePrefixes,\n }),\n })\n}\n"],"names":["deleteFile","getFile","uploadFile","createR2Adapter","bucket","clientUploads","useCompositePrefixes","collection","prefix","name","requiresClientUploadReceipt","handleDelete","storageFilePath","handleUpload","file","buffer","mimeType","tempFilePath","staticHandler","req","doc","headers","params","clientUploadContext","filename","incomingHeaders"],"mappings":"AAQA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,OAAO,QAAQ,eAAc;AACtC,SAASC,UAAU,QAAQ,kBAAiB;AAQ5C,OAAO,SAASC,gBAAgB,EAC9BC,MAAM,EACNC,aAAa,EACbC,uBAAuB,KAAK,EACR;IACpB,OAAO,CAAC,EAAEC,UAAU,EAAEC,SAAS,EAAE,EAAE,GAAwB,CAAA;YACzDC,MAAM;YACNJ;YACAK,6BAA6B;YAE7BC,cAAc,CAAC,EAAEC,eAAe,EAAE,GAChCZ,WAAW;oBACTI;oBACAQ;gBACF;YAEFC,cAAc,CAAC,EAAEC,IAAI,EAAEF,eAAe,EAAE,GACtCV,WAAW;oBACTE;oBACAW,QAAQD,KAAKC,MAAM;oBACnBC,UAAUF,KAAKE,QAAQ;oBACvBJ;oBACAK,cAAcH,KAAKG,YAAY;gBACjC;YAEFC,eAAe,CAACC,KAAK,EAAEC,GAAG,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,mBAAmB,EAAEC,QAAQ,EAAE,EAAE,GAC9EvB,QAAQ;oBACNG;oBACAmB;oBACAhB;oBACAa;oBACAI;oBACAC,iBAAiBJ;oBACjBb;oBACAW;oBACAb;gBACF;QACJ,CAAA;AACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.spec.d.ts","sourceRoot":"","sources":["../src/adapter.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { rm, writeFile } from 'fs/promises';
3
+ import { tmpdir } from 'os';
4
+ import path from 'path';
5
+ import { expect, it } from 'vitest';
6
+ import { createR2Adapter } from './adapter.js';
7
+ it('should upload the temporary file contents', async ()=>{
8
+ const bytes = Buffer.from('processed image contents');
9
+ const tempFilePath = path.join(tmpdir(), `r2-upload-${randomUUID()}`);
10
+ let storedBody;
11
+ const bucket = {
12
+ put: (_key, body)=>{
13
+ storedBody = body;
14
+ }
15
+ };
16
+ const adapter = createR2Adapter({
17
+ bucket: bucket
18
+ })({
19
+ collection: {
20
+ slug: 'media'
21
+ }
22
+ });
23
+ await writeFile(tempFilePath, bytes);
24
+ try {
25
+ await adapter.handleUpload({
26
+ file: {
27
+ buffer: Buffer.alloc(0),
28
+ mimeType: 'image/png',
29
+ tempFilePath
30
+ },
31
+ storageFilePath: 'processed.png'
32
+ });
33
+ expect(Buffer.from(await new Response(storedBody).arrayBuffer())).toEqual(bytes);
34
+ } finally{
35
+ await rm(tempFilePath, {
36
+ force: true
37
+ });
38
+ }
39
+ });
40
+
41
+ //# sourceMappingURL=adapter.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapter.spec.ts"],"sourcesContent":["import { randomUUID } from 'crypto'\nimport { rm, writeFile } from 'fs/promises'\nimport { tmpdir } from 'os'\nimport path from 'path'\nimport { expect, it } from 'vitest'\n\nimport { createR2Adapter } from './adapter.js'\n\nit('should upload the temporary file contents', async () => {\n const bytes = Buffer.from('processed image contents')\n const tempFilePath = path.join(tmpdir(), `r2-upload-${randomUUID()}`)\n let storedBody: Blob | Buffer | undefined\n const bucket = {\n put: (_key: string, body: Blob | Buffer) => {\n storedBody = body\n },\n }\n const adapter = createR2Adapter({ bucket: bucket as never })({\n collection: { slug: 'media' },\n } as never)\n\n await writeFile(tempFilePath, bytes)\n\n try {\n await adapter.handleUpload({\n file: { buffer: Buffer.alloc(0), mimeType: 'image/png', tempFilePath },\n storageFilePath: 'processed.png',\n } as never)\n\n expect(Buffer.from(await new Response(storedBody).arrayBuffer())).toEqual(bytes)\n } finally {\n await rm(tempFilePath, { force: true })\n }\n})\n"],"names":["randomUUID","rm","writeFile","tmpdir","path","expect","it","createR2Adapter","bytes","Buffer","from","tempFilePath","join","storedBody","bucket","put","_key","body","adapter","collection","slug","handleUpload","file","buffer","alloc","mimeType","storageFilePath","Response","arrayBuffer","toEqual","force"],"mappings":"AAAA,SAASA,UAAU,QAAQ,SAAQ;AACnC,SAASC,EAAE,EAAEC,SAAS,QAAQ,cAAa;AAC3C,SAASC,MAAM,QAAQ,KAAI;AAC3B,OAAOC,UAAU,OAAM;AACvB,SAASC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAEnC,SAASC,eAAe,QAAQ,eAAc;AAE9CD,GAAG,6CAA6C;IAC9C,MAAME,QAAQC,OAAOC,IAAI,CAAC;IAC1B,MAAMC,eAAeP,KAAKQ,IAAI,CAACT,UAAU,CAAC,UAAU,EAAEH,cAAc;IACpE,IAAIa;IACJ,MAAMC,SAAS;QACbC,KAAK,CAACC,MAAcC;YAClBJ,aAAaI;QACf;IACF;IACA,MAAMC,UAAUX,gBAAgB;QAAEO,QAAQA;IAAgB,GAAG;QAC3DK,YAAY;YAAEC,MAAM;QAAQ;IAC9B;IAEA,MAAMlB,UAAUS,cAAcH;IAE9B,IAAI;QACF,MAAMU,QAAQG,YAAY,CAAC;YACzBC,MAAM;gBAAEC,QAAQd,OAAOe,KAAK,CAAC;gBAAIC,UAAU;gBAAad;YAAa;YACrEe,iBAAiB;QACnB;QAEArB,OAAOI,OAAOC,IAAI,CAAC,MAAM,IAAIiB,SAASd,YAAYe,WAAW,KAAKC,OAAO,CAACrB;IAC5E,SAAU;QACR,MAAMP,GAAGU,cAAc;YAAEmB,OAAO;QAAK;IACvC;AACF"}
@@ -4,7 +4,8 @@ interface UploadFileArgs {
4
4
  buffer: Buffer;
5
5
  mimeType: string;
6
6
  storageFilePath: string;
7
+ tempFilePath?: string;
7
8
  }
8
- export declare function uploadFile({ bucket, buffer, mimeType, storageFilePath, }: UploadFileArgs): Promise<void>;
9
+ export declare function uploadFile({ bucket, buffer, mimeType, storageFilePath, tempFilePath, }: UploadFileArgs): Promise<void>;
9
10
  export {};
10
11
  //# sourceMappingURL=uploadFile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"uploadFile.d.ts","sourceRoot":"","sources":["../src/uploadFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAI1C,UAAU,cAAc;IACtB,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,wBAAsB,UAAU,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,QAAQ,EACR,eAAe,GAChB,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhC"}
1
+ {"version":3,"file":"uploadFile.d.ts","sourceRoot":"","sources":["../src/uploadFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAI1C,UAAU,cAAc;IACtB,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAsB,UAAU,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,QAAQ,EACR,eAAe,EACf,YAAY,GACb,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAahC"}
@@ -1,9 +1,14 @@
1
1
  const isMiniflare = process.env.NODE_ENV === 'development';
2
- export async function uploadFile({ bucket, buffer, mimeType, storageFilePath }) {
2
+ export async function uploadFile({ bucket, buffer, mimeType, storageFilePath, tempFilePath }) {
3
3
  // Read more: https://github.com/cloudflare/workers-sdk/issues/6047#issuecomment-2691217843
4
- const body = isMiniflare ? new Blob([
4
+ let body = isMiniflare ? new Blob([
5
5
  buffer
6
6
  ]) : buffer;
7
+ if (tempFilePath) {
8
+ // Workers require filesystem compatibility to use temp files, so keep this import conditional.
9
+ const { openAsBlob } = await import('fs');
10
+ body = await openAsBlob(tempFilePath);
11
+ }
7
12
  await bucket.put(storageFilePath, body, {
8
13
  httpMetadata: {
9
14
  contentType: mimeType
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/uploadFile.ts"],"sourcesContent":["import type { R2Bucket } from './types.js'\n\nconst isMiniflare = process.env.NODE_ENV === 'development'\n\ninterface UploadFileArgs {\n bucket: R2Bucket\n buffer: Buffer\n mimeType: string\n storageFilePath: string\n}\n\nexport async function uploadFile({\n bucket,\n buffer,\n mimeType,\n storageFilePath,\n}: UploadFileArgs): Promise<void> {\n // Read more: https://github.com/cloudflare/workers-sdk/issues/6047#issuecomment-2691217843\n const body = isMiniflare ? new Blob([buffer]) : buffer\n\n await bucket.put(storageFilePath, body, {\n httpMetadata: { contentType: mimeType },\n })\n}\n"],"names":["isMiniflare","process","env","NODE_ENV","uploadFile","bucket","buffer","mimeType","storageFilePath","body","Blob","put","httpMetadata","contentType"],"mappings":"AAEA,MAAMA,cAAcC,QAAQC,GAAG,CAACC,QAAQ,KAAK;AAS7C,OAAO,eAAeC,WAAW,EAC/BC,MAAM,EACNC,MAAM,EACNC,QAAQ,EACRC,eAAe,EACA;IACf,2FAA2F;IAC3F,MAAMC,OAAOT,cAAc,IAAIU,KAAK;QAACJ;KAAO,IAAIA;IAEhD,MAAMD,OAAOM,GAAG,CAACH,iBAAiBC,MAAM;QACtCG,cAAc;YAAEC,aAAaN;QAAS;IACxC;AACF"}
1
+ {"version":3,"sources":["../src/uploadFile.ts"],"sourcesContent":["import type { R2Bucket } from './types.js'\n\nconst isMiniflare = process.env.NODE_ENV === 'development'\n\ninterface UploadFileArgs {\n bucket: R2Bucket\n buffer: Buffer\n mimeType: string\n storageFilePath: string\n tempFilePath?: string\n}\n\nexport async function uploadFile({\n bucket,\n buffer,\n mimeType,\n storageFilePath,\n tempFilePath,\n}: UploadFileArgs): Promise<void> {\n // Read more: https://github.com/cloudflare/workers-sdk/issues/6047#issuecomment-2691217843\n let body = isMiniflare ? new Blob([buffer]) : buffer\n\n if (tempFilePath) {\n // Workers require filesystem compatibility to use temp files, so keep this import conditional.\n const { openAsBlob } = await import('fs')\n body = await openAsBlob(tempFilePath)\n }\n\n await bucket.put(storageFilePath, body, {\n httpMetadata: { contentType: mimeType },\n })\n}\n"],"names":["isMiniflare","process","env","NODE_ENV","uploadFile","bucket","buffer","mimeType","storageFilePath","tempFilePath","body","Blob","openAsBlob","put","httpMetadata","contentType"],"mappings":"AAEA,MAAMA,cAAcC,QAAQC,GAAG,CAACC,QAAQ,KAAK;AAU7C,OAAO,eAAeC,WAAW,EAC/BC,MAAM,EACNC,MAAM,EACNC,QAAQ,EACRC,eAAe,EACfC,YAAY,EACG;IACf,2FAA2F;IAC3F,IAAIC,OAAOV,cAAc,IAAIW,KAAK;QAACL;KAAO,IAAIA;IAE9C,IAAIG,cAAc;QAChB,+FAA+F;QAC/F,MAAM,EAAEG,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC;QACpCF,OAAO,MAAME,WAAWH;IAC1B;IAEA,MAAMJ,OAAOQ,GAAG,CAACL,iBAAiBE,MAAM;QACtCI,cAAc;YAAEC,aAAaR;QAAS;IACxC;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/storage-r2",
3
- "version": "3.91.0",
3
+ "version": "3.92.1",
4
4
  "description": "Payload storage adapter for Cloudflare R2",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -37,17 +37,17 @@
37
37
  "dist"
38
38
  ],
39
39
  "dependencies": {
40
- "@payloadcms/plugin-cloud-storage": "3.91.0"
40
+ "@payloadcms/plugin-cloud-storage": "3.92.1"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@cloudflare/workers-types": "4.20260218.0",
44
- "payload": "3.91.0"
44
+ "payload": "3.92.1"
45
45
  },
46
46
  "peerDependencies": {
47
- "payload": "3.91.0"
47
+ "payload": "3.92.1"
48
48
  },
49
49
  "engines": {
50
- "node": ">=20.18.1"
50
+ "node": "^22.23.4 || >=24.22.1"
51
51
  },
52
52
  "scripts": {
53
53
  "build": "pnpm build:types && pnpm build:swc",