@payloadcms/storage-r2 3.78.0-internal-debug.f663370 → 3.78.0-internal.ab11ffa

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":"handleMultiPartUpload.d.ts","sourceRoot":"","sources":["../src/handleMultiPartUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAyC,MAAM,YAAY,CAAA;AAEjF,KAAK,IAAI,GAAG;IACV,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,MAAM,EAAE,QAAQ,CAAA;IAChB,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAA;CAC7C,CAAA;AAGD,eAAO,MAAM,wBAAwB,oCACD,IAAI,KAAG,cAuExC,CAAA"}
1
+ {"version":3,"file":"handleMultiPartUpload.d.ts","sourceRoot":"","sources":["../src/handleMultiPartUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAM7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAyC,MAAM,YAAY,CAAA;AAEjF,KAAK,IAAI,GAAG;IACV,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,MAAM,EAAE,QAAQ,CAAA;IAChB,WAAW,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAA;CAC7C,CAAA;AAGD,eAAO,MAAM,wBAAwB,oCACD,IAAI,KAAG,cAwExC,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import path from 'path';
2
2
  import { APIError, Forbidden } from 'payload';
3
+ import { sanitizeFilename } from 'payload/shared';
3
4
  // Adapted from https://developers.cloudflare.com/r2/api/workers/workers-multipart-usage/
4
5
  export const getHandleMultiPartUpload = ({ access, bucket, collections })=>async (req)=>{
5
6
  const params = Object.fromEntries(req.searchParams);
@@ -37,7 +38,8 @@ export const getHandleMultiPartUpload = ({ access, bucket, collections })=>async
37
38
  }
38
39
  }
39
40
  const prefix = typeof collectionConfig === 'object' && collectionConfig.prefix || '';
40
- const fileKey = path.posix.join(prefix, params.fileName);
41
+ const sanitizedFilename = sanitizeFilename(params.fileName);
42
+ const fileKey = path.posix.join(prefix, sanitizedFilename);
41
43
  const multipartId = params.multipartId;
42
44
  const multipartKey = params.multipartKey;
43
45
  const multipartNumber = parseInt(params.multipartNumber || '');
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/handleMultiPartUpload.ts"],"sourcesContent":["import type { ClientUploadsAccess } from '@payloadcms/plugin-cloud-storage/types'\nimport type { PayloadHandler } from 'payload'\n\nimport path from 'path'\nimport { APIError, Forbidden } from 'payload'\n\nimport type { R2StorageOptions } from './index.js'\nimport type { R2Bucket, R2StorageMultipartUploadHandlerParams } from './types.js'\n\ntype Args = {\n access?: ClientUploadsAccess\n bucket: R2Bucket\n collections: R2StorageOptions['collections']\n}\n\n// Adapted from https://developers.cloudflare.com/r2/api/workers/workers-multipart-usage/\nexport const getHandleMultiPartUpload =\n ({ access, bucket, collections }: Args): PayloadHandler =>\n async (req) => {\n const params = Object.fromEntries(req.searchParams) as R2StorageMultipartUploadHandlerParams\n const collectionSlug = params.collection\n const filetype = params.fileType\n\n const collectionConfig = collections[collectionSlug]\n if (!collectionConfig) {\n throw new APIError(`Collection ${collectionSlug} was not found in R2 Storage options`)\n }\n\n // Check custom access if provided, otherwise check collection's create access\n if (access) {\n if (!(await access({ collectionSlug, req }))) {\n throw new Forbidden(req.t)\n }\n } else {\n // Use the collection's create access control\n const collection = req.payload.collections[collectionSlug]\n if (!collection) {\n throw new APIError(`Collection ${collectionSlug} not found`)\n }\n\n const createAccess = collection.config.access?.create\n if (createAccess) {\n const hasAccess = await createAccess({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n } else if (!req.user) {\n // No custom access and no user - deny by default\n throw new Forbidden(req.t)\n }\n }\n\n const prefix = (typeof collectionConfig === 'object' && collectionConfig.prefix) || ''\n const fileKey = path.posix.join(prefix, params.fileName)\n\n const multipartId = params.multipartId\n const multipartKey = params.multipartKey\n const multipartNumber = parseInt(params.multipartNumber || '')\n\n if (multipartId && multipartKey) {\n const multipartUpload = bucket.resumeMultipartUpload(multipartKey, multipartId)\n const request = req as Request\n\n if (isNaN(multipartNumber)) {\n // Upload complete\n const object = await multipartUpload.complete((await request.json()) as any)\n return new Response(object.key, { status: 200 })\n } else {\n // Upload part\n const uploadedPart = await multipartUpload.uploadPart(\n multipartNumber,\n await request.arrayBuffer(),\n )\n return Response.json(uploadedPart)\n }\n } else {\n // Create multipart upload\n const multipartUpload = await bucket.createMultipartUpload(fileKey, {\n httpMetadata: {\n contentType: filetype,\n },\n })\n\n return Response.json({\n key: multipartUpload.key,\n uploadId: multipartUpload.uploadId,\n })\n }\n }\n"],"names":["path","APIError","Forbidden","getHandleMultiPartUpload","access","bucket","collections","req","params","Object","fromEntries","searchParams","collectionSlug","collection","filetype","fileType","collectionConfig","t","payload","createAccess","config","create","hasAccess","user","prefix","fileKey","posix","join","fileName","multipartId","multipartKey","multipartNumber","parseInt","multipartUpload","resumeMultipartUpload","request","isNaN","object","complete","json","Response","key","status","uploadedPart","uploadPart","arrayBuffer","createMultipartUpload","httpMetadata","contentType","uploadId"],"mappings":"AAGA,OAAOA,UAAU,OAAM;AACvB,SAASC,QAAQ,EAAEC,SAAS,QAAQ,UAAS;AAW7C,yFAAyF;AACzF,OAAO,MAAMC,2BACX,CAAC,EAAEC,MAAM,EAAEC,MAAM,EAAEC,WAAW,EAAQ,GACtC,OAAOC;QACL,MAAMC,SAASC,OAAOC,WAAW,CAACH,IAAII,YAAY;QAClD,MAAMC,iBAAiBJ,OAAOK,UAAU;QACxC,MAAMC,WAAWN,OAAOO,QAAQ;QAEhC,MAAMC,mBAAmBV,WAAW,CAACM,eAAe;QACpD,IAAI,CAACI,kBAAkB;YACrB,MAAM,IAAIf,SAAS,CAAC,WAAW,EAAEW,eAAe,oCAAoC,CAAC;QACvF;QAEA,8EAA8E;QAC9E,IAAIR,QAAQ;YACV,IAAI,CAAE,MAAMA,OAAO;gBAAEQ;gBAAgBL;YAAI,IAAK;gBAC5C,MAAM,IAAIL,UAAUK,IAAIU,CAAC;YAC3B;QACF,OAAO;YACL,6CAA6C;YAC7C,MAAMJ,aAAaN,IAAIW,OAAO,CAACZ,WAAW,CAACM,eAAe;YAC1D,IAAI,CAACC,YAAY;gBACf,MAAM,IAAIZ,SAAS,CAAC,WAAW,EAAEW,eAAe,UAAU,CAAC;YAC7D;YAEA,MAAMO,eAAeN,WAAWO,MAAM,CAAChB,MAAM,EAAEiB;YAC/C,IAAIF,cAAc;gBAChB,MAAMG,YAAY,MAAMH,aAAa;oBAAEZ;gBAAI;gBAC3C,IAAI,CAACe,WAAW;oBACd,MAAM,IAAIpB,UAAUK,IAAIU,CAAC;gBAC3B;YACF,OAAO,IAAI,CAACV,IAAIgB,IAAI,EAAE;gBACpB,iDAAiD;gBACjD,MAAM,IAAIrB,UAAUK,IAAIU,CAAC;YAC3B;QACF;QAEA,MAAMO,SAAS,AAAC,OAAOR,qBAAqB,YAAYA,iBAAiBQ,MAAM,IAAK;QACpF,MAAMC,UAAUzB,KAAK0B,KAAK,CAACC,IAAI,CAACH,QAAQhB,OAAOoB,QAAQ;QAEvD,MAAMC,cAAcrB,OAAOqB,WAAW;QACtC,MAAMC,eAAetB,OAAOsB,YAAY;QACxC,MAAMC,kBAAkBC,SAASxB,OAAOuB,eAAe,IAAI;QAE3D,IAAIF,eAAeC,cAAc;YAC/B,MAAMG,kBAAkB5B,OAAO6B,qBAAqB,CAACJ,cAAcD;YACnE,MAAMM,UAAU5B;YAEhB,IAAI6B,MAAML,kBAAkB;gBAC1B,kBAAkB;gBAClB,MAAMM,SAAS,MAAMJ,gBAAgBK,QAAQ,CAAE,MAAMH,QAAQI,IAAI;gBACjE,OAAO,IAAIC,SAASH,OAAOI,GAAG,EAAE;oBAAEC,QAAQ;gBAAI;YAChD,OAAO;gBACL,cAAc;gBACd,MAAMC,eAAe,MAAMV,gBAAgBW,UAAU,CACnDb,iBACA,MAAMI,QAAQU,WAAW;gBAE3B,OAAOL,SAASD,IAAI,CAACI;YACvB;QACF,OAAO;YACL,0BAA0B;YAC1B,MAAMV,kBAAkB,MAAM5B,OAAOyC,qBAAqB,CAACrB,SAAS;gBAClEsB,cAAc;oBACZC,aAAalC;gBACf;YACF;YAEA,OAAO0B,SAASD,IAAI,CAAC;gBACnBE,KAAKR,gBAAgBQ,GAAG;gBACxBQ,UAAUhB,gBAAgBgB,QAAQ;YACpC;QACF;IACF,EAAC"}
1
+ {"version":3,"sources":["../src/handleMultiPartUpload.ts"],"sourcesContent":["import type { ClientUploadsAccess } from '@payloadcms/plugin-cloud-storage/types'\nimport type { PayloadHandler } from 'payload'\n\nimport path from 'path'\nimport { APIError, Forbidden } from 'payload'\nimport { sanitizeFilename } from 'payload/shared'\n\nimport type { R2StorageOptions } from './index.js'\nimport type { R2Bucket, R2StorageMultipartUploadHandlerParams } from './types.js'\n\ntype Args = {\n access?: ClientUploadsAccess\n bucket: R2Bucket\n collections: R2StorageOptions['collections']\n}\n\n// Adapted from https://developers.cloudflare.com/r2/api/workers/workers-multipart-usage/\nexport const getHandleMultiPartUpload =\n ({ access, bucket, collections }: Args): PayloadHandler =>\n async (req) => {\n const params = Object.fromEntries(req.searchParams) as R2StorageMultipartUploadHandlerParams\n const collectionSlug = params.collection\n const filetype = params.fileType\n\n const collectionConfig = collections[collectionSlug]\n if (!collectionConfig) {\n throw new APIError(`Collection ${collectionSlug} was not found in R2 Storage options`)\n }\n\n // Check custom access if provided, otherwise check collection's create access\n if (access) {\n if (!(await access({ collectionSlug, req }))) {\n throw new Forbidden(req.t)\n }\n } else {\n // Use the collection's create access control\n const collection = req.payload.collections[collectionSlug]\n if (!collection) {\n throw new APIError(`Collection ${collectionSlug} not found`)\n }\n\n const createAccess = collection.config.access?.create\n if (createAccess) {\n const hasAccess = await createAccess({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n } else if (!req.user) {\n // No custom access and no user - deny by default\n throw new Forbidden(req.t)\n }\n }\n\n const prefix = (typeof collectionConfig === 'object' && collectionConfig.prefix) || ''\n const sanitizedFilename = sanitizeFilename(params.fileName)\n const fileKey = path.posix.join(prefix, sanitizedFilename)\n\n const multipartId = params.multipartId\n const multipartKey = params.multipartKey\n const multipartNumber = parseInt(params.multipartNumber || '')\n\n if (multipartId && multipartKey) {\n const multipartUpload = bucket.resumeMultipartUpload(multipartKey, multipartId)\n const request = req as Request\n\n if (isNaN(multipartNumber)) {\n // Upload complete\n const object = await multipartUpload.complete((await request.json()) as any)\n return new Response(object.key, { status: 200 })\n } else {\n // Upload part\n const uploadedPart = await multipartUpload.uploadPart(\n multipartNumber,\n await request.arrayBuffer(),\n )\n return Response.json(uploadedPart)\n }\n } else {\n // Create multipart upload\n const multipartUpload = await bucket.createMultipartUpload(fileKey, {\n httpMetadata: {\n contentType: filetype,\n },\n })\n\n return Response.json({\n key: multipartUpload.key,\n uploadId: multipartUpload.uploadId,\n })\n }\n }\n"],"names":["path","APIError","Forbidden","sanitizeFilename","getHandleMultiPartUpload","access","bucket","collections","req","params","Object","fromEntries","searchParams","collectionSlug","collection","filetype","fileType","collectionConfig","t","payload","createAccess","config","create","hasAccess","user","prefix","sanitizedFilename","fileName","fileKey","posix","join","multipartId","multipartKey","multipartNumber","parseInt","multipartUpload","resumeMultipartUpload","request","isNaN","object","complete","json","Response","key","status","uploadedPart","uploadPart","arrayBuffer","createMultipartUpload","httpMetadata","contentType","uploadId"],"mappings":"AAGA,OAAOA,UAAU,OAAM;AACvB,SAASC,QAAQ,EAAEC,SAAS,QAAQ,UAAS;AAC7C,SAASC,gBAAgB,QAAQ,iBAAgB;AAWjD,yFAAyF;AACzF,OAAO,MAAMC,2BACX,CAAC,EAAEC,MAAM,EAAEC,MAAM,EAAEC,WAAW,EAAQ,GACtC,OAAOC;QACL,MAAMC,SAASC,OAAOC,WAAW,CAACH,IAAII,YAAY;QAClD,MAAMC,iBAAiBJ,OAAOK,UAAU;QACxC,MAAMC,WAAWN,OAAOO,QAAQ;QAEhC,MAAMC,mBAAmBV,WAAW,CAACM,eAAe;QACpD,IAAI,CAACI,kBAAkB;YACrB,MAAM,IAAIhB,SAAS,CAAC,WAAW,EAAEY,eAAe,oCAAoC,CAAC;QACvF;QAEA,8EAA8E;QAC9E,IAAIR,QAAQ;YACV,IAAI,CAAE,MAAMA,OAAO;gBAAEQ;gBAAgBL;YAAI,IAAK;gBAC5C,MAAM,IAAIN,UAAUM,IAAIU,CAAC;YAC3B;QACF,OAAO;YACL,6CAA6C;YAC7C,MAAMJ,aAAaN,IAAIW,OAAO,CAACZ,WAAW,CAACM,eAAe;YAC1D,IAAI,CAACC,YAAY;gBACf,MAAM,IAAIb,SAAS,CAAC,WAAW,EAAEY,eAAe,UAAU,CAAC;YAC7D;YAEA,MAAMO,eAAeN,WAAWO,MAAM,CAAChB,MAAM,EAAEiB;YAC/C,IAAIF,cAAc;gBAChB,MAAMG,YAAY,MAAMH,aAAa;oBAAEZ;gBAAI;gBAC3C,IAAI,CAACe,WAAW;oBACd,MAAM,IAAIrB,UAAUM,IAAIU,CAAC;gBAC3B;YACF,OAAO,IAAI,CAACV,IAAIgB,IAAI,EAAE;gBACpB,iDAAiD;gBACjD,MAAM,IAAItB,UAAUM,IAAIU,CAAC;YAC3B;QACF;QAEA,MAAMO,SAAS,AAAC,OAAOR,qBAAqB,YAAYA,iBAAiBQ,MAAM,IAAK;QACpF,MAAMC,oBAAoBvB,iBAAiBM,OAAOkB,QAAQ;QAC1D,MAAMC,UAAU5B,KAAK6B,KAAK,CAACC,IAAI,CAACL,QAAQC;QAExC,MAAMK,cAActB,OAAOsB,WAAW;QACtC,MAAMC,eAAevB,OAAOuB,YAAY;QACxC,MAAMC,kBAAkBC,SAASzB,OAAOwB,eAAe,IAAI;QAE3D,IAAIF,eAAeC,cAAc;YAC/B,MAAMG,kBAAkB7B,OAAO8B,qBAAqB,CAACJ,cAAcD;YACnE,MAAMM,UAAU7B;YAEhB,IAAI8B,MAAML,kBAAkB;gBAC1B,kBAAkB;gBAClB,MAAMM,SAAS,MAAMJ,gBAAgBK,QAAQ,CAAE,MAAMH,QAAQI,IAAI;gBACjE,OAAO,IAAIC,SAASH,OAAOI,GAAG,EAAE;oBAAEC,QAAQ;gBAAI;YAChD,OAAO;gBACL,cAAc;gBACd,MAAMC,eAAe,MAAMV,gBAAgBW,UAAU,CACnDb,iBACA,MAAMI,QAAQU,WAAW;gBAE3B,OAAOL,SAASD,IAAI,CAACI;YACvB;QACF,OAAO;YACL,0BAA0B;YAC1B,MAAMV,kBAAkB,MAAM7B,OAAO0C,qBAAqB,CAACpB,SAAS;gBAClEqB,cAAc;oBACZC,aAAanC;gBACf;YACF;YAEA,OAAO2B,SAASD,IAAI,CAAC;gBACnBE,KAAKR,gBAAgBQ,GAAG;gBACxBQ,UAAUhB,gBAAgBgB,QAAQ;YACpC;QACF;IACF,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/storage-r2",
3
- "version": "3.78.0-internal-debug.f663370",
3
+ "version": "3.78.0-internal.ab11ffa",
4
4
  "description": "Payload storage adapter for Cloudflare R2",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -37,14 +37,14 @@
37
37
  "dist"
38
38
  ],
39
39
  "dependencies": {
40
- "@payloadcms/plugin-cloud-storage": "3.78.0-internal-debug.f663370"
40
+ "@payloadcms/plugin-cloud-storage": "3.78.0-internal.ab11ffa"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@cloudflare/workers-types": "4.20260218.0",
44
- "payload": "3.78.0-internal-debug.f663370"
44
+ "payload": "3.78.0-internal.ab11ffa"
45
45
  },
46
46
  "peerDependencies": {
47
- "payload": "3.78.0-internal-debug.f663370"
47
+ "payload": "3.78.0-internal.ab11ffa"
48
48
  },
49
49
  "engines": {
50
50
  "node": "^18.20.2 || >=20.9.0"