@payloadcms/storage-r2 3.83.0-internal.86b7bfb → 3.83.0

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.
@@ -0,0 +1,8 @@
1
+ import type { HandleDelete } from '@payloadcms/plugin-cloud-storage/types';
2
+ import type { R2Bucket } from './types.js';
3
+ interface Args {
4
+ bucket: R2Bucket;
5
+ }
6
+ export declare const getHandleDelete: ({ bucket }: Args) => HandleDelete;
7
+ export {};
8
+ //# sourceMappingURL=handleDelete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleDelete.d.ts","sourceRoot":"","sources":["../src/handleDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAI1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,UAAU,IAAI;IACZ,MAAM,EAAE,QAAQ,CAAA;CACjB;AAED,eAAO,MAAM,eAAe,eAAgB,IAAI,KAAG,YAIlD,CAAA"}
@@ -0,0 +1,8 @@
1
+ import path from 'path';
2
+ export const getHandleDelete = ({ bucket })=>{
3
+ return async ({ doc: { prefix = '' }, filename })=>{
4
+ await bucket.delete(path.posix.join(prefix, filename));
5
+ };
6
+ };
7
+
8
+ //# sourceMappingURL=handleDelete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/handleDelete.ts"],"sourcesContent":["import type { HandleDelete } from '@payloadcms/plugin-cloud-storage/types'\n\nimport path from 'path'\n\nimport type { R2Bucket } from './types.js'\n\ninterface Args {\n bucket: R2Bucket\n}\n\nexport const getHandleDelete = ({ bucket }: Args): HandleDelete => {\n return async ({ doc: { prefix = '' }, filename }) => {\n await bucket.delete(path.posix.join(prefix, filename))\n }\n}\n"],"names":["path","getHandleDelete","bucket","doc","prefix","filename","delete","posix","join"],"mappings":"AAEA,OAAOA,UAAU,OAAM;AAQvB,OAAO,MAAMC,kBAAkB,CAAC,EAAEC,MAAM,EAAQ;IAC9C,OAAO,OAAO,EAAEC,KAAK,EAAEC,SAAS,EAAE,EAAE,EAAEC,QAAQ,EAAE;QAC9C,MAAMH,OAAOI,MAAM,CAACN,KAAKO,KAAK,CAACC,IAAI,CAACJ,QAAQC;IAC9C;AACF,EAAC"}
@@ -0,0 +1,11 @@
1
+ import type { HandleUpload } from '@payloadcms/plugin-cloud-storage/types';
2
+ import type { CollectionConfig } from 'payload';
3
+ import type { R2Bucket } from './types.js';
4
+ interface Args {
5
+ bucket: R2Bucket;
6
+ collection: CollectionConfig;
7
+ prefix?: string;
8
+ }
9
+ export declare const getHandleUpload: ({ bucket, prefix }: Args) => HandleUpload;
10
+ export {};
11
+ //# sourceMappingURL=handleUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleUpload.d.ts","sourceRoot":"","sources":["../src/handleUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,UAAU,IAAI;IACZ,MAAM,EAAE,QAAQ,CAAA;IAChB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,eAAe,uBAA6B,IAAI,KAAG,YAQ/D,CAAA"}
@@ -0,0 +1,16 @@
1
+ import path from 'path';
2
+ export const getHandleUpload = ({ bucket, prefix = '' })=>{
3
+ return async ({ data, file })=>{
4
+ // Read more: https://github.com/cloudflare/workers-sdk/issues/6047#issuecomment-2691217843
5
+ const buffer = process.env.NODE_ENV === 'development' ? new Blob([
6
+ file.buffer
7
+ ]) : file.buffer;
8
+ await bucket.put(path.posix.join(data.prefix || prefix, file.filename), buffer, {
9
+ httpMetadata: {
10
+ contentType: file.mimeType
11
+ }
12
+ });
13
+ };
14
+ };
15
+
16
+ //# sourceMappingURL=handleUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/handleUpload.ts"],"sourcesContent":["import type { HandleUpload } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionConfig } from 'payload'\n\nimport path from 'path'\n\nimport type { R2Bucket } from './types.js'\n\ninterface Args {\n bucket: R2Bucket\n collection: CollectionConfig\n prefix?: string\n}\n\nexport const getHandleUpload = ({ bucket, prefix = '' }: Args): HandleUpload => {\n return async ({ data, file }) => {\n // Read more: https://github.com/cloudflare/workers-sdk/issues/6047#issuecomment-2691217843\n const buffer = process.env.NODE_ENV === 'development' ? new Blob([file.buffer]) : file.buffer\n await bucket.put(path.posix.join(data.prefix || prefix, file.filename), buffer, {\n httpMetadata: { contentType: file.mimeType },\n })\n }\n}\n"],"names":["path","getHandleUpload","bucket","prefix","data","file","buffer","process","env","NODE_ENV","Blob","put","posix","join","filename","httpMetadata","contentType","mimeType"],"mappings":"AAGA,OAAOA,UAAU,OAAM;AAUvB,OAAO,MAAMC,kBAAkB,CAAC,EAAEC,MAAM,EAAEC,SAAS,EAAE,EAAQ;IAC3D,OAAO,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE;QAC1B,2FAA2F;QAC3F,MAAMC,SAASC,QAAQC,GAAG,CAACC,QAAQ,KAAK,gBAAgB,IAAIC,KAAK;YAACL,KAAKC,MAAM;SAAC,IAAID,KAAKC,MAAM;QAC7F,MAAMJ,OAAOS,GAAG,CAACX,KAAKY,KAAK,CAACC,IAAI,CAACT,KAAKD,MAAM,IAAIA,QAAQE,KAAKS,QAAQ,GAAGR,QAAQ;YAC9ES,cAAc;gBAAEC,aAAaX,KAAKY,QAAQ;YAAC;QAC7C;IACF;AACF,EAAC"}
@@ -0,0 +1,11 @@
1
+ import type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types';
2
+ import type { CollectionConfig } from 'payload';
3
+ import type { R2Bucket } from './types.js';
4
+ interface Args {
5
+ bucket: R2Bucket;
6
+ collection: CollectionConfig;
7
+ prefix?: string;
8
+ }
9
+ export declare const getHandler: ({ bucket, collection, prefix }: Args) => StaticHandler;
10
+ export {};
11
+ //# sourceMappingURL=staticHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticHandler.d.ts","sourceRoot":"","sources":["../src/staticHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAM/C,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAA;AAExD,UAAU,IAAI;IACZ,MAAM,EAAE,QAAQ,CAAA;IAChB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID,eAAO,MAAM,UAAU,mCAAyC,IAAI,KAAG,aA2GtE,CAAA"}
@@ -0,0 +1,107 @@
1
+ import path from 'path';
2
+ import { getRangeRequestInfo } from 'payload/internal';
3
+ import { sanitizeFilename } from 'payload/shared';
4
+ const isMiniflare = process.env.NODE_ENV === 'development';
5
+ export const getHandler = ({ bucket, collection, prefix = '' })=>{
6
+ return async (req, { headers: incomingHeaders, params: { clientUploadContext, filename } })=>{
7
+ try {
8
+ const key = path.posix.join(prefix, sanitizeFilename(filename));
9
+ // Get file size for range validation
10
+ const headObj = await bucket?.head(key);
11
+ if (!headObj) {
12
+ return new Response(null, {
13
+ status: 404,
14
+ statusText: 'Not Found'
15
+ });
16
+ }
17
+ const fileSize = headObj.size;
18
+ // Don't return large file uploads back to the client, or the Worker will run out of memory
19
+ if (fileSize > 50 * 1024 * 1024 && clientUploadContext) {
20
+ return new Response(null, {
21
+ status: 200
22
+ });
23
+ }
24
+ // Handle range request
25
+ const rangeHeader = req.headers.get('range');
26
+ const rangeResult = getRangeRequestInfo({
27
+ fileSize,
28
+ rangeHeader
29
+ });
30
+ if (rangeResult.type === 'invalid') {
31
+ return new Response(null, {
32
+ headers: new Headers(rangeResult.headers),
33
+ status: rangeResult.status
34
+ });
35
+ }
36
+ // Get object with range if needed
37
+ // Due to https://github.com/cloudflare/workers-sdk/issues/6047
38
+ // We cannot send a Headers instance to Miniflare
39
+ const obj = rangeResult.type === 'partial' && !isMiniflare ? await bucket?.get(key, {
40
+ range: {
41
+ length: rangeResult.rangeEnd - rangeResult.rangeStart + 1,
42
+ offset: rangeResult.rangeStart
43
+ }
44
+ }) : await bucket?.get(key);
45
+ if (!obj || obj.body == undefined) {
46
+ return new Response(null, {
47
+ status: 404,
48
+ statusText: 'Not Found'
49
+ });
50
+ }
51
+ let headers = new Headers(incomingHeaders);
52
+ // Add range-related headers from the result
53
+ for (const [key, value] of Object.entries(rangeResult.headers)){
54
+ headers.append(key, value);
55
+ }
56
+ // Add R2-specific headers
57
+ if (isMiniflare) {
58
+ // In development with Miniflare, manually set headers from httpMetadata
59
+ const metadata = obj.httpMetadata;
60
+ if (metadata?.cacheControl) {
61
+ headers.set('Cache-Control', metadata.cacheControl);
62
+ }
63
+ if (metadata?.contentDisposition) {
64
+ headers.set('Content-Disposition', metadata.contentDisposition);
65
+ }
66
+ if (metadata?.contentEncoding) {
67
+ headers.set('Content-Encoding', metadata.contentEncoding);
68
+ }
69
+ if (metadata?.contentLanguage) {
70
+ headers.set('Content-Language', metadata.contentLanguage);
71
+ }
72
+ if (metadata?.contentType) {
73
+ headers.set('Content-Type', metadata.contentType);
74
+ }
75
+ } else {
76
+ obj.writeHttpMetadata(headers);
77
+ }
78
+ // Add Content-Security-Policy header for SVG files to prevent executable code
79
+ const contentType = headers.get('Content-Type');
80
+ if (contentType === 'image/svg+xml') {
81
+ headers.set('Content-Security-Policy', "script-src 'none'");
82
+ }
83
+ const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match');
84
+ if (collection.upload && typeof collection.upload === 'object' && typeof collection.upload.modifyResponseHeaders === 'function') {
85
+ headers = collection.upload.modifyResponseHeaders({
86
+ headers
87
+ }) || headers;
88
+ }
89
+ if (etagFromHeaders && etagFromHeaders === obj.etag) {
90
+ return new Response(null, {
91
+ headers,
92
+ status: 304
93
+ });
94
+ }
95
+ return new Response(obj.body, {
96
+ headers,
97
+ status: rangeResult.status
98
+ });
99
+ } catch (err) {
100
+ return new Response('Internal Server Error', {
101
+ status: 500
102
+ });
103
+ }
104
+ };
105
+ };
106
+
107
+ //# sourceMappingURL=staticHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionConfig } from 'payload'\n\nimport path from 'path'\nimport { getRangeRequestInfo } from 'payload/internal'\nimport { sanitizeFilename } from 'payload/shared'\n\nimport type { R2Bucket, R2ObjectBody } from './types.js'\n\ninterface Args {\n bucket: R2Bucket\n collection: CollectionConfig\n prefix?: string\n}\n\nconst isMiniflare = process.env.NODE_ENV === 'development'\n\nexport const getHandler = ({ bucket, collection, prefix = '' }: Args): StaticHandler => {\n return async (req, { headers: incomingHeaders, params: { clientUploadContext, filename } }) => {\n try {\n const key = path.posix.join(prefix, sanitizeFilename(filename))\n\n // Get file size for range validation\n const headObj = await bucket?.head(key)\n if (!headObj) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const fileSize = headObj.size\n\n // Don't return large file uploads back to the client, or the Worker will run out of memory\n if (fileSize > 50 * 1024 * 1024 && clientUploadContext) {\n return new Response(null, { status: 200 })\n }\n\n // Handle range request\n const rangeHeader = req.headers.get('range')\n const rangeResult = getRangeRequestInfo({ fileSize, rangeHeader })\n\n if (rangeResult.type === 'invalid') {\n return new Response(null, {\n headers: new Headers(rangeResult.headers),\n status: rangeResult.status,\n })\n }\n\n // Get object with range if needed\n // Due to https://github.com/cloudflare/workers-sdk/issues/6047\n // We cannot send a Headers instance to Miniflare\n const obj =\n rangeResult.type === 'partial' && !isMiniflare\n ? await bucket?.get(key, {\n range: {\n length: rangeResult.rangeEnd - rangeResult.rangeStart + 1,\n offset: rangeResult.rangeStart,\n },\n })\n : await bucket?.get(key)\n\n if (!obj || obj.body == undefined) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n let headers = new Headers(incomingHeaders)\n\n // Add range-related headers from the result\n for (const [key, value] of Object.entries(rangeResult.headers)) {\n headers.append(key, value)\n }\n\n // Add R2-specific headers\n if (isMiniflare) {\n // In development with Miniflare, manually set headers from httpMetadata\n const metadata = obj.httpMetadata\n if (metadata?.cacheControl) {\n headers.set('Cache-Control', metadata.cacheControl)\n }\n if (metadata?.contentDisposition) {\n headers.set('Content-Disposition', metadata.contentDisposition)\n }\n if (metadata?.contentEncoding) {\n headers.set('Content-Encoding', metadata.contentEncoding)\n }\n if (metadata?.contentLanguage) {\n headers.set('Content-Language', metadata.contentLanguage)\n }\n if (metadata?.contentType) {\n headers.set('Content-Type', metadata.contentType)\n }\n } else {\n obj.writeHttpMetadata(headers)\n }\n\n // Add Content-Security-Policy header for SVG files to prevent executable code\n const contentType = headers.get('Content-Type')\n if (contentType === 'image/svg+xml') {\n headers.set('Content-Security-Policy', \"script-src 'none'\")\n }\n\n const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\n\n if (\n collection.upload &&\n typeof collection.upload === 'object' &&\n typeof collection.upload.modifyResponseHeaders === 'function'\n ) {\n headers = collection.upload.modifyResponseHeaders({ headers }) || headers\n }\n\n if (etagFromHeaders && etagFromHeaders === obj.etag) {\n return new Response(null, {\n headers,\n status: 304,\n })\n }\n\n return new Response(obj.body, {\n headers,\n status: rangeResult.status,\n })\n } catch (err: unknown) {\n return new Response('Internal Server Error', { status: 500 })\n }\n }\n}\n"],"names":["path","getRangeRequestInfo","sanitizeFilename","isMiniflare","process","env","NODE_ENV","getHandler","bucket","collection","prefix","req","headers","incomingHeaders","params","clientUploadContext","filename","key","posix","join","headObj","head","Response","status","statusText","fileSize","size","rangeHeader","get","rangeResult","type","Headers","obj","range","length","rangeEnd","rangeStart","offset","body","undefined","value","Object","entries","append","metadata","httpMetadata","cacheControl","set","contentDisposition","contentEncoding","contentLanguage","contentType","writeHttpMetadata","etagFromHeaders","upload","modifyResponseHeaders","etag","err"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/storage-r2",
3
- "version": "3.83.0-internal.86b7bfb",
3
+ "version": "3.83.0",
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.83.0-internal.86b7bfb"
40
+ "@payloadcms/plugin-cloud-storage": "3.83.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@cloudflare/workers-types": "4.20260218.0",
44
- "payload": "3.83.0-internal.86b7bfb"
44
+ "payload": "3.83.0"
45
45
  },
46
46
  "peerDependencies": {
47
- "payload": "3.83.0-internal.86b7bfb"
47
+ "payload": "3.83.0"
48
48
  },
49
49
  "engines": {
50
50
  "node": "^18.20.2 || >=20.9.0"