@payloadcms/storage-gcs 3.84.0-internal.d5d6e43 → 3.84.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,9 @@
1
+ import type { Storage } from '@google-cloud/storage';
2
+ import type { HandleDelete } from '@payloadcms/plugin-cloud-storage/types';
3
+ interface Args {
4
+ bucket: string;
5
+ getStorageClient: () => Storage;
6
+ }
7
+ export declare const getHandleDelete: ({ bucket, getStorageClient }: Args) => HandleDelete;
8
+ export {};
9
+ //# 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,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAI1E,UAAU,IAAI;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,MAAM,OAAO,CAAA;CAChC;AAED,eAAO,MAAM,eAAe,iCAAkC,IAAI,KAAG,YAMpE,CAAA"}
@@ -0,0 +1,10 @@
1
+ import path from 'path';
2
+ export const getHandleDelete = ({ bucket, getStorageClient })=>{
3
+ return async ({ doc: { prefix = '' }, filename })=>{
4
+ await getStorageClient().bucket(bucket).file(path.posix.join(prefix, filename)).delete({
5
+ ignoreNotFound: true
6
+ });
7
+ };
8
+ };
9
+
10
+ //# sourceMappingURL=handleDelete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/handleDelete.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type { HandleDelete } from '@payloadcms/plugin-cloud-storage/types'\n\nimport path from 'path'\n\ninterface Args {\n bucket: string\n getStorageClient: () => Storage\n}\n\nexport const getHandleDelete = ({ bucket, getStorageClient }: Args): HandleDelete => {\n return async ({ doc: { prefix = '' }, filename }) => {\n await getStorageClient().bucket(bucket).file(path.posix.join(prefix, filename)).delete({\n ignoreNotFound: true,\n })\n }\n}\n"],"names":["path","getHandleDelete","bucket","getStorageClient","doc","prefix","filename","file","posix","join","delete","ignoreNotFound"],"mappings":"AAGA,OAAOA,UAAU,OAAM;AAOvB,OAAO,MAAMC,kBAAkB,CAAC,EAAEC,MAAM,EAAEC,gBAAgB,EAAQ;IAChE,OAAO,OAAO,EAAEC,KAAK,EAAEC,SAAS,EAAE,EAAE,EAAEC,QAAQ,EAAE;QAC9C,MAAMH,mBAAmBD,MAAM,CAACA,QAAQK,IAAI,CAACP,KAAKQ,KAAK,CAACC,IAAI,CAACJ,QAAQC,WAAWI,MAAM,CAAC;YACrFC,gBAAgB;QAClB;IACF;AACF,EAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Storage } from '@google-cloud/storage';
2
+ import type { HandleUpload } from '@payloadcms/plugin-cloud-storage/types';
3
+ import type { CollectionConfig } from 'payload';
4
+ interface Args {
5
+ acl?: 'Private' | 'Public';
6
+ bucket: string;
7
+ collection: CollectionConfig;
8
+ getStorageClient: () => Storage;
9
+ prefix?: string;
10
+ }
11
+ export declare const getHandleUpload: ({ acl, bucket, getStorageClient, prefix, }: Args) => HandleUpload;
12
+ export {};
13
+ //# 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,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI/C,UAAU,IAAI;IACZ,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,gBAAgB,CAAA;IAC5B,gBAAgB,EAAE,MAAM,OAAO,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,eAAe,+CAKzB,IAAI,KAAG,YAiBT,CAAA"}
@@ -0,0 +1,18 @@
1
+ import path from 'path';
2
+ export const getHandleUpload = ({ acl, bucket, getStorageClient, prefix = '' })=>{
3
+ return async ({ data, file })=>{
4
+ const fileKey = path.posix.join(data.prefix || prefix, file.filename);
5
+ const gcsFile = getStorageClient().bucket(bucket).file(fileKey);
6
+ await gcsFile.save(file.buffer, {
7
+ metadata: {
8
+ contentType: file.mimeType
9
+ }
10
+ });
11
+ if (acl) {
12
+ await gcsFile[`make${acl}`]();
13
+ }
14
+ return data;
15
+ };
16
+ };
17
+
18
+ //# sourceMappingURL=handleUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/handleUpload.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type { HandleUpload } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionConfig } from 'payload'\n\nimport path from 'path'\n\ninterface Args {\n acl?: 'Private' | 'Public'\n bucket: string\n collection: CollectionConfig\n getStorageClient: () => Storage\n prefix?: string\n}\n\nexport const getHandleUpload = ({\n acl,\n bucket,\n getStorageClient,\n prefix = '',\n}: Args): HandleUpload => {\n return async ({ data, file }) => {\n const fileKey = path.posix.join(data.prefix || prefix, file.filename)\n\n const gcsFile = getStorageClient().bucket(bucket).file(fileKey)\n await gcsFile.save(file.buffer, {\n metadata: {\n contentType: file.mimeType,\n },\n })\n\n if (acl) {\n await gcsFile[`make${acl}`]()\n }\n\n return data\n }\n}\n"],"names":["path","getHandleUpload","acl","bucket","getStorageClient","prefix","data","file","fileKey","posix","join","filename","gcsFile","save","buffer","metadata","contentType","mimeType"],"mappings":"AAIA,OAAOA,UAAU,OAAM;AAUvB,OAAO,MAAMC,kBAAkB,CAAC,EAC9BC,GAAG,EACHC,MAAM,EACNC,gBAAgB,EAChBC,SAAS,EAAE,EACN;IACL,OAAO,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE;QAC1B,MAAMC,UAAUR,KAAKS,KAAK,CAACC,IAAI,CAACJ,KAAKD,MAAM,IAAIA,QAAQE,KAAKI,QAAQ;QAEpE,MAAMC,UAAUR,mBAAmBD,MAAM,CAACA,QAAQI,IAAI,CAACC;QACvD,MAAMI,QAAQC,IAAI,CAACN,KAAKO,MAAM,EAAE;YAC9BC,UAAU;gBACRC,aAAaT,KAAKU,QAAQ;YAC5B;QACF;QAEA,IAAIf,KAAK;YACP,MAAMU,OAAO,CAAC,CAAC,IAAI,EAAEV,KAAK,CAAC;QAC7B;QAEA,OAAOI;IACT;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 Storage } from '@google-cloud/storage';
4
+ interface Args {
5
+ bucket: string;
6
+ collection: CollectionConfig;
7
+ getStorageClient: () => Storage;
8
+ }
9
+ export declare const getHandler: ({ bucket, collection, getStorageClient }: 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;AAE/C,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAM9D,UAAU,IAAI;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,gBAAgB,CAAA;IAC5B,gBAAgB,EAAE,MAAM,OAAO,CAAA;CAChC;AAED,eAAO,MAAM,UAAU,6CAA8C,IAAI,KAAG,aAuF3E,CAAA"}
@@ -0,0 +1,92 @@
1
+ import { ApiError } from '@google-cloud/storage';
2
+ import { getFilePrefix } from '@payloadcms/plugin-cloud-storage/utilities';
3
+ import path from 'path';
4
+ import { getRangeRequestInfo } from 'payload/internal';
5
+ import { sanitizeFilename } from 'payload/shared';
6
+ export const getHandler = ({ bucket, collection, getStorageClient })=>{
7
+ return async (req, { headers: incomingHeaders, params: { clientUploadContext, filename } })=>{
8
+ try {
9
+ const prefix = await getFilePrefix({
10
+ clientUploadContext,
11
+ collection,
12
+ filename,
13
+ req
14
+ });
15
+ const file = getStorageClient().bucket(bucket).file(path.posix.join(prefix, sanitizeFilename(filename)));
16
+ const [metadata] = await file.getMetadata();
17
+ // Handle range request
18
+ const rangeHeader = req.headers.get('range');
19
+ const fileSize = Number(metadata.size);
20
+ const rangeResult = getRangeRequestInfo({
21
+ fileSize,
22
+ rangeHeader
23
+ });
24
+ if (rangeResult.type === 'invalid') {
25
+ return new Response(null, {
26
+ headers: new Headers(rangeResult.headers),
27
+ status: rangeResult.status
28
+ });
29
+ }
30
+ const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match');
31
+ const objectEtag = metadata.etag;
32
+ let headers = new Headers(incomingHeaders);
33
+ // Add range-related headers from the result
34
+ for (const [key, value] of Object.entries(rangeResult.headers)){
35
+ headers.append(key, value);
36
+ }
37
+ headers.append('Content-Type', String(metadata.contentType));
38
+ headers.append('ETag', String(metadata.etag));
39
+ // Add Content-Security-Policy header for SVG files to prevent executable code
40
+ if (metadata.contentType === 'image/svg+xml') {
41
+ headers.append('Content-Security-Policy', "script-src 'none'");
42
+ }
43
+ if (collection.upload && typeof collection.upload === 'object' && typeof collection.upload.modifyResponseHeaders === 'function') {
44
+ headers = collection.upload.modifyResponseHeaders({
45
+ headers
46
+ }) || headers;
47
+ }
48
+ if (etagFromHeaders && etagFromHeaders === objectEtag) {
49
+ return new Response(null, {
50
+ headers,
51
+ status: 304
52
+ });
53
+ }
54
+ // Manually create a ReadableStream for the web from a Node.js stream.
55
+ const readableStream = new ReadableStream({
56
+ start (controller) {
57
+ const streamOptions = rangeResult.type === 'partial' ? {
58
+ end: rangeResult.rangeEnd,
59
+ start: rangeResult.rangeStart
60
+ } : {};
61
+ const nodeStream = file.createReadStream(streamOptions);
62
+ nodeStream.on('data', (chunk)=>{
63
+ controller.enqueue(new Uint8Array(chunk));
64
+ });
65
+ nodeStream.on('end', ()=>{
66
+ controller.close();
67
+ });
68
+ nodeStream.on('error', (err)=>{
69
+ controller.error(err);
70
+ });
71
+ }
72
+ });
73
+ return new Response(readableStream, {
74
+ headers,
75
+ status: rangeResult.status
76
+ });
77
+ } catch (err) {
78
+ if (err instanceof ApiError && err.code === 404) {
79
+ return new Response(null, {
80
+ status: 404,
81
+ statusText: 'Not Found'
82
+ });
83
+ }
84
+ req.payload.logger.error(err);
85
+ return new Response('Internal Server Error', {
86
+ status: 500
87
+ });
88
+ }
89
+ };
90
+ };
91
+
92
+ //# 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 { ApiError, type Storage } from '@google-cloud/storage'\nimport { getFilePrefix } from '@payloadcms/plugin-cloud-storage/utilities'\nimport path from 'path'\nimport { getRangeRequestInfo } from 'payload/internal'\nimport { sanitizeFilename } from 'payload/shared'\n\ninterface Args {\n bucket: string\n collection: CollectionConfig\n getStorageClient: () => Storage\n}\n\nexport const getHandler = ({ bucket, collection, getStorageClient }: Args): StaticHandler => {\n return async (req, { headers: incomingHeaders, params: { clientUploadContext, filename } }) => {\n try {\n const prefix = await getFilePrefix({ clientUploadContext, collection, filename, req })\n const file = getStorageClient()\n .bucket(bucket)\n .file(path.posix.join(prefix, sanitizeFilename(filename)))\n\n const [metadata] = await file.getMetadata()\n\n // Handle range request\n const rangeHeader = req.headers.get('range')\n const fileSize = Number(metadata.size)\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 const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\n const objectEtag = metadata.etag\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 headers.append('Content-Type', String(metadata.contentType))\n headers.append('ETag', String(metadata.etag))\n\n // Add Content-Security-Policy header for SVG files to prevent executable code\n if (metadata.contentType === 'image/svg+xml') {\n headers.append('Content-Security-Policy', \"script-src 'none'\")\n }\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 === objectEtag) {\n return new Response(null, {\n headers,\n status: 304,\n })\n }\n\n // Manually create a ReadableStream for the web from a Node.js stream.\n const readableStream = new ReadableStream({\n start(controller) {\n const streamOptions =\n rangeResult.type === 'partial'\n ? { end: rangeResult.rangeEnd, start: rangeResult.rangeStart }\n : {}\n const nodeStream = file.createReadStream(streamOptions)\n nodeStream.on('data', (chunk) => {\n controller.enqueue(new Uint8Array(chunk))\n })\n nodeStream.on('end', () => {\n controller.close()\n })\n nodeStream.on('error', (err) => {\n controller.error(err)\n })\n },\n })\n\n return new Response(readableStream, {\n headers,\n status: rangeResult.status,\n })\n } catch (err: unknown) {\n if (err instanceof ApiError && err.code === 404) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n req.payload.logger.error(err)\n return new Response('Internal Server Error', { status: 500 })\n }\n }\n}\n"],"names":["ApiError","getFilePrefix","path","getRangeRequestInfo","sanitizeFilename","getHandler","bucket","collection","getStorageClient","req","headers","incomingHeaders","params","clientUploadContext","filename","prefix","file","posix","join","metadata","getMetadata","rangeHeader","get","fileSize","Number","size","rangeResult","type","Response","Headers","status","etagFromHeaders","objectEtag","etag","key","value","Object","entries","append","String","contentType","upload","modifyResponseHeaders","readableStream","ReadableStream","start","controller","streamOptions","end","rangeEnd","rangeStart","nodeStream","createReadStream","on","chunk","enqueue","Uint8Array","close","err","error","code","statusText","payload","logger"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/storage-gcs",
3
- "version": "3.84.0-internal.d5d6e43",
3
+ "version": "3.84.0",
4
4
  "description": "Payload storage adapter for Google Cloud Storage",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -38,13 +38,13 @@
38
38
  ],
39
39
  "dependencies": {
40
40
  "@google-cloud/storage": "7.19.0",
41
- "@payloadcms/plugin-cloud-storage": "3.84.0-internal.d5d6e43"
41
+ "@payloadcms/plugin-cloud-storage": "3.84.0"
42
42
  },
43
43
  "devDependencies": {
44
- "payload": "3.84.0-internal.d5d6e43"
44
+ "payload": "3.84.0"
45
45
  },
46
46
  "peerDependencies": {
47
- "payload": "3.84.0-internal.d5d6e43"
47
+ "payload": "3.84.0"
48
48
  },
49
49
  "engines": {
50
50
  "node": "^18.20.2 || >=20.9.0"