@payloadcms/storage-gcs 3.24.0 → 3.25.0-canary.3d5c763

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.
package/README.md CHANGED
@@ -14,6 +14,7 @@ pnpm add @payloadcms/storage-gcs
14
14
 
15
15
  - Configure the `collections` object to specify which collections should use the Google Cloud Storage adapter. The slug _must_ match one of your existing collection slugs.
16
16
  - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection.
17
+ - When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method for the bucket to your website.
17
18
 
18
19
  ```ts
19
20
  import { gcsStorage } from '@payloadcms/storage-gcs'
@@ -0,0 +1,8 @@
1
+ export declare const GcsClientUploadHandler: ({ children, collectionSlug, enabled, extra, serverHandlerPath, }: {
2
+ children: import("react").ReactNode;
3
+ collectionSlug: import("packages/payload/src/index.js").UploadCollectionSlug;
4
+ enabled?: boolean;
5
+ extra: Record<string, unknown>;
6
+ serverHandlerPath: string;
7
+ }) => import("react").JSX.Element;
8
+ //# sourceMappingURL=GcsClientUploadHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GcsClientUploadHandler.d.ts","sourceRoot":"","sources":["../../src/client/GcsClientUploadHandler.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB;;;;;;aAqB0B,OAAO,aADlE,CAAA"}
@@ -0,0 +1,26 @@
1
+ 'use client';
2
+ import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client';
3
+ export const GcsClientUploadHandler = createClientUploadHandler({
4
+ handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL })=>{
5
+ const response = await fetch(`${serverURL}${apiRoute}${serverHandlerPath}`, {
6
+ body: JSON.stringify({
7
+ collectionSlug,
8
+ filename: file.name,
9
+ mimeType: file.type
10
+ }),
11
+ credentials: 'include',
12
+ method: 'POST'
13
+ });
14
+ const { url } = await response.json();
15
+ await fetch(url, {
16
+ body: file,
17
+ headers: {
18
+ 'Content-Length': file.size.toString(),
19
+ 'Content-Type': file.type
20
+ },
21
+ method: 'PUT'
22
+ });
23
+ }
24
+ });
25
+
26
+ //# sourceMappingURL=GcsClientUploadHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/GcsClientUploadHandler.ts"],"sourcesContent":["'use client'\nimport { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client'\n\nexport const GcsClientUploadHandler = createClientUploadHandler({\n handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL }) => {\n const response = await fetch(`${serverURL}${apiRoute}${serverHandlerPath}`, {\n body: JSON.stringify({\n collectionSlug,\n filename: file.name,\n mimeType: file.type,\n }),\n credentials: 'include',\n method: 'POST',\n })\n\n const { url } = await response.json()\n\n await fetch(url, {\n body: file,\n headers: { 'Content-Length': file.size.toString(), 'Content-Type': file.type },\n method: 'PUT',\n })\n },\n})\n"],"names":["createClientUploadHandler","GcsClientUploadHandler","handler","apiRoute","collectionSlug","file","serverHandlerPath","serverURL","response","fetch","body","JSON","stringify","filename","name","mimeType","type","credentials","method","url","json","headers","size","toString"],"mappings":"AAAA;AACA,SAASA,yBAAyB,QAAQ,0CAAyC;AAEnF,OAAO,MAAMC,yBAAyBD,0BAA0B;IAC9DE,SAAS,OAAO,EAAEC,QAAQ,EAAEC,cAAc,EAAEC,IAAI,EAAEC,iBAAiB,EAAEC,SAAS,EAAE;QAC9E,MAAMC,WAAW,MAAMC,MAAM,GAAGF,YAAYJ,WAAWG,mBAAmB,EAAE;YAC1EI,MAAMC,KAAKC,SAAS,CAAC;gBACnBR;gBACAS,UAAUR,KAAKS,IAAI;gBACnBC,UAAUV,KAAKW,IAAI;YACrB;YACAC,aAAa;YACbC,QAAQ;QACV;QAEA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAMX,SAASY,IAAI;QAEnC,MAAMX,MAAMU,KAAK;YACfT,MAAML;YACNgB,SAAS;gBAAE,kBAAkBhB,KAAKiB,IAAI,CAACC,QAAQ;gBAAI,gBAAgBlB,KAAKW,IAAI;YAAC;YAC7EE,QAAQ;QACV;IACF;AACF,GAAE"}
@@ -0,0 +1,2 @@
1
+ export { GcsClientUploadHandler } from '../client/GcsClientUploadHandler.js';
2
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { GcsClientUploadHandler } from '../client/GcsClientUploadHandler.js';
2
+
3
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { GcsClientUploadHandler } from '../client/GcsClientUploadHandler.js'\n"],"names":["GcsClientUploadHandler"],"mappings":"AAAA,SAASA,sBAAsB,QAAQ,sCAAqC"}
@@ -0,0 +1,14 @@
1
+ import type { Storage } from '@google-cloud/storage';
2
+ import type { ClientUploadsAccess } from '@payloadcms/plugin-cloud-storage/types';
3
+ import type { PayloadHandler } from 'payload';
4
+ import type { GcsStorageOptions } from './index.js';
5
+ interface Args {
6
+ access?: ClientUploadsAccess;
7
+ acl?: 'private' | 'public-read';
8
+ bucket: string;
9
+ collections: GcsStorageOptions['collections'];
10
+ getStorageClient: () => Storage;
11
+ }
12
+ export declare const getGenerateSignedURLHandler: ({ access, bucket, collections, getStorageClient, }: Args) => PayloadHandler;
13
+ export {};
14
+ //# sourceMappingURL=generateSignedURL.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSignedURL.d.ts","sourceRoot":"","sources":["../src/generateSignedURL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,UAAU,IAAI;IACZ,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,GAAG,CAAC,EAAE,SAAS,GAAG,aAAa,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAA;IAC7C,gBAAgB,EAAE,MAAM,OAAO,CAAA;CAChC;AAID,eAAO,MAAM,2BAA2B,uDAKrC,IAAI,KAAG,cAiCT,CAAA"}
@@ -0,0 +1,34 @@
1
+ import path from 'path';
2
+ import { APIError, Forbidden } from 'payload';
3
+ const defaultAccess = ({ req })=>!!req.user;
4
+ export const getGenerateSignedURLHandler = ({ access = defaultAccess, bucket, collections, getStorageClient })=>{
5
+ return async (req)=>{
6
+ if (!req.json) {
7
+ throw new APIError('Unreachable');
8
+ }
9
+ const { collectionSlug, filename, mimeType } = await req.json();
10
+ const collectionS3Config = collections[collectionSlug];
11
+ if (!collectionS3Config) {
12
+ throw new APIError(`Collection ${collectionSlug} was not found in S3 options`);
13
+ }
14
+ const prefix = typeof collectionS3Config === 'object' && collectionS3Config.prefix || '';
15
+ if (!await access({
16
+ collectionSlug,
17
+ req
18
+ })) {
19
+ throw new Forbidden();
20
+ }
21
+ const fileKey = path.posix.join(prefix, filename);
22
+ const [url] = await getStorageClient().bucket(bucket).file(fileKey).getSignedUrl({
23
+ action: 'write',
24
+ contentType: mimeType,
25
+ expires: Date.now() + 60 * 60 * 5,
26
+ version: 'v4'
27
+ });
28
+ return Response.json({
29
+ url
30
+ });
31
+ };
32
+ };
33
+
34
+ //# sourceMappingURL=generateSignedURL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/generateSignedURL.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport 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 { GcsStorageOptions } from './index.js'\n\ninterface Args {\n access?: ClientUploadsAccess\n acl?: 'private' | 'public-read'\n bucket: string\n collections: GcsStorageOptions['collections']\n getStorageClient: () => Storage\n}\n\nconst defaultAccess: Args['access'] = ({ req }) => !!req.user\n\nexport const getGenerateSignedURLHandler = ({\n access = defaultAccess,\n bucket,\n collections,\n getStorageClient,\n}: Args): PayloadHandler => {\n return async (req) => {\n if (!req.json) {\n throw new APIError('Unreachable')\n }\n\n const { collectionSlug, filename, mimeType } = await req.json()\n\n const collectionS3Config = collections[collectionSlug]\n if (!collectionS3Config) {\n throw new APIError(`Collection ${collectionSlug} was not found in S3 options`)\n }\n\n const prefix = (typeof collectionS3Config === 'object' && collectionS3Config.prefix) || ''\n\n if (!(await access({ collectionSlug, req }))) {\n throw new Forbidden()\n }\n\n const fileKey = path.posix.join(prefix, filename)\n\n const [url] = await getStorageClient()\n .bucket(bucket)\n .file(fileKey)\n .getSignedUrl({\n action: 'write',\n contentType: mimeType,\n expires: Date.now() + 60 * 60 * 5,\n version: 'v4',\n })\n\n return Response.json({ url })\n }\n}\n"],"names":["path","APIError","Forbidden","defaultAccess","req","user","getGenerateSignedURLHandler","access","bucket","collections","getStorageClient","json","collectionSlug","filename","mimeType","collectionS3Config","prefix","fileKey","posix","join","url","file","getSignedUrl","action","contentType","expires","Date","now","version","Response"],"mappings":"AAIA,OAAOA,UAAU,OAAM;AACvB,SAASC,QAAQ,EAAEC,SAAS,QAAQ,UAAS;AAY7C,MAAMC,gBAAgC,CAAC,EAAEC,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;AAE7D,OAAO,MAAMC,8BAA8B,CAAC,EAC1CC,SAASJ,aAAa,EACtBK,MAAM,EACNC,WAAW,EACXC,gBAAgB,EACX;IACL,OAAO,OAAON;QACZ,IAAI,CAACA,IAAIO,IAAI,EAAE;YACb,MAAM,IAAIV,SAAS;QACrB;QAEA,MAAM,EAAEW,cAAc,EAAEC,QAAQ,EAAEC,QAAQ,EAAE,GAAG,MAAMV,IAAIO,IAAI;QAE7D,MAAMI,qBAAqBN,WAAW,CAACG,eAAe;QACtD,IAAI,CAACG,oBAAoB;YACvB,MAAM,IAAId,SAAS,CAAC,WAAW,EAAEW,eAAe,4BAA4B,CAAC;QAC/E;QAEA,MAAMI,SAAS,AAAC,OAAOD,uBAAuB,YAAYA,mBAAmBC,MAAM,IAAK;QAExF,IAAI,CAAE,MAAMT,OAAO;YAAEK;YAAgBR;QAAI,IAAK;YAC5C,MAAM,IAAIF;QACZ;QAEA,MAAMe,UAAUjB,KAAKkB,KAAK,CAACC,IAAI,CAACH,QAAQH;QAExC,MAAM,CAACO,IAAI,GAAG,MAAMV,mBACjBF,MAAM,CAACA,QACPa,IAAI,CAACJ,SACLK,YAAY,CAAC;YACZC,QAAQ;YACRC,aAAaV;YACbW,SAASC,KAAKC,GAAG,KAAK,KAAK,KAAK;YAChCC,SAAS;QACX;QAEF,OAAOC,SAASlB,IAAI,CAAC;YAAES;QAAI;IAC7B;AACF,EAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { StorageOptions } from '@google-cloud/storage';
2
- import type { CollectionOptions } from '@payloadcms/plugin-cloud-storage/types';
2
+ import type { ClientUploadsConfig, CollectionOptions } from '@payloadcms/plugin-cloud-storage/types';
3
3
  import type { Plugin, UploadCollectionSlug } from 'payload';
4
4
  export interface GcsStorageOptions {
5
5
  acl?: 'Private' | 'Public';
@@ -7,6 +7,10 @@ export interface GcsStorageOptions {
7
7
  * The name of the bucket to use.
8
8
  */
9
9
  bucket: string;
10
+ /**
11
+ * Do uploads directly on the client to bypass limits on Vercel. You must allow CORS PUT method for the bucket to your website.
12
+ */
13
+ clientUploads?: ClientUploadsConfig;
10
14
  /**
11
15
  * Collection options to apply the S3 adapter to.
12
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAGV,iBAAiB,EAElB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,KAAK,EAAU,MAAM,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAUnE,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;IAE1B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAC7F;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;OAIG;IACH,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,KAAK,gBAAgB,GAAG,CAAC,cAAc,EAAE,iBAAiB,KAAK,MAAM,CAAA;AAErE,eAAO,MAAM,UAAU,EAAE,gBA4CtB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAEV,mBAAmB,EAEnB,iBAAiB,EAElB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,KAAK,EAAU,MAAM,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAWnE,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;IAE1B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAC7F;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;OAIG;IACH,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,KAAK,gBAAgB,GAAG,CAAC,cAAc,EAAE,iBAAiB,KAAK,MAAM,CAAA;AAErE,eAAO,MAAM,UAAU,EAAE,gBAiGtB,CAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Storage } from '@google-cloud/storage';
2
2
  import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage';
3
+ import { getGenerateSignedURLHandler } from './generateSignedURL.js';
3
4
  import { getGenerateURL } from './generateURL.js';
4
5
  import { getHandleDelete } from './handleDelete.js';
5
6
  import { getHandleUpload } from './handleUpload.js';
@@ -8,7 +9,48 @@ export const gcsStorage = (gcsStorageOptions)=>(incomingConfig)=>{
8
9
  if (gcsStorageOptions.enabled === false) {
9
10
  return incomingConfig;
10
11
  }
11
- const adapter = gcsStorageInternal(gcsStorageOptions);
12
+ let storageClient = null;
13
+ const getStorageClient = ()=>{
14
+ if (storageClient) {
15
+ return storageClient;
16
+ }
17
+ storageClient = new Storage(gcsStorageOptions.options);
18
+ return storageClient;
19
+ };
20
+ const adapter = gcsStorageInternal(getStorageClient, gcsStorageOptions);
21
+ if (gcsStorageOptions.clientUploads) {
22
+ if (!incomingConfig.endpoints) {
23
+ incomingConfig.endpoints = [];
24
+ }
25
+ incomingConfig.endpoints.push({
26
+ handler: getGenerateSignedURLHandler({
27
+ access: typeof gcsStorageOptions.clientUploads === 'object' ? gcsStorageOptions.clientUploads.access : undefined,
28
+ bucket: gcsStorageOptions.bucket,
29
+ collections: gcsStorageOptions.collections,
30
+ getStorageClient
31
+ }),
32
+ method: 'post',
33
+ path: '/storage-gcs-generate-signed-url'
34
+ });
35
+ }
36
+ if (!incomingConfig.admin) {
37
+ incomingConfig.admin = {};
38
+ }
39
+ if (!incomingConfig.admin.components) {
40
+ incomingConfig.admin.components = {};
41
+ }
42
+ if (!incomingConfig.admin.components.providers) {
43
+ incomingConfig.admin.components.providers = [];
44
+ }
45
+ for(const collectionSlug in gcsStorageOptions.collections){
46
+ incomingConfig.admin.components.providers.push({
47
+ clientProps: {
48
+ collectionSlug,
49
+ enabled: !!gcsStorageOptions.clientUploads
50
+ },
51
+ path: '@payloadcms/storage-gcs/client#GcsClientUploadHandler'
52
+ });
53
+ }
12
54
  // Add adapter to each collection option object
13
55
  const collectionsWithAdapter = Object.entries(gcsStorageOptions.collections).reduce((acc, [slug, collOptions])=>({
14
56
  ...acc,
@@ -37,16 +79,8 @@ export const gcsStorage = (gcsStorageOptions)=>(incomingConfig)=>{
37
79
  collections: collectionsWithAdapter
38
80
  })(config);
39
81
  };
40
- function gcsStorageInternal({ acl, bucket, options }) {
82
+ function gcsStorageInternal(getStorageClient, { acl, bucket }) {
41
83
  return ({ collection, prefix })=>{
42
- let storageClient = null;
43
- const getStorageClient = ()=>{
44
- if (storageClient) {
45
- return storageClient;
46
- }
47
- storageClient = new Storage(options);
48
- return storageClient;
49
- };
50
84
  return {
51
85
  name: 'gcs',
52
86
  generateURL: getGenerateURL({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { StorageOptions } from '@google-cloud/storage'\nimport type {\n Adapter,\n PluginOptions as CloudStoragePluginOptions,\n CollectionOptions,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { Config, Plugin, UploadCollectionSlug } from 'payload'\n\nimport { Storage } from '@google-cloud/storage'\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\n\nimport { getGenerateURL } from './generateURL.js'\nimport { getHandleDelete } from './handleDelete.js'\nimport { getHandleUpload } from './handleUpload.js'\nimport { getHandler } from './staticHandler.js'\n\nexport interface GcsStorageOptions {\n acl?: 'Private' | 'Public'\n\n /**\n * The name of the bucket to use.\n */\n bucket: string\n /**\n * Collection options to apply the S3 adapter to.\n */\n collections: Partial<Record<UploadCollectionSlug, Omit<CollectionOptions, 'adapter'> | true>>\n /**\n * Whether or not to enable the plugin\n *\n * Default: true\n */\n enabled?: boolean\n\n /**\n * Google Cloud Storage client configuration.\n *\n * @see https://github.com/googleapis/nodejs-storage\n */\n options: StorageOptions\n}\n\ntype GcsStoragePlugin = (gcsStorageArgs: GcsStorageOptions) => Plugin\n\nexport const gcsStorage: GcsStoragePlugin =\n (gcsStorageOptions: GcsStorageOptions) =>\n (incomingConfig: Config): Config => {\n if (gcsStorageOptions.enabled === false) {\n return incomingConfig\n }\n\n const adapter = gcsStorageInternal(gcsStorageOptions)\n\n // Add adapter to each collection option object\n const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries(\n gcsStorageOptions.collections,\n ).reduce(\n (acc, [slug, collOptions]) => ({\n ...acc,\n [slug]: {\n ...(collOptions === true ? {} : collOptions),\n adapter,\n },\n }),\n {} as Record<string, CollectionOptions>,\n )\n\n // Set disableLocalStorage: true for collections specified in the plugin options\n const config = {\n ...incomingConfig,\n collections: (incomingConfig.collections || []).map((collection) => {\n if (!collectionsWithAdapter[collection.slug]) {\n return collection\n }\n\n return {\n ...collection,\n upload: {\n ...(typeof collection.upload === 'object' ? collection.upload : {}),\n disableLocalStorage: true,\n },\n }\n }),\n }\n\n return cloudStoragePlugin({\n collections: collectionsWithAdapter,\n })(config)\n }\n\nfunction gcsStorageInternal({ acl, bucket, options }: GcsStorageOptions): Adapter {\n return ({ collection, prefix }): GeneratedAdapter => {\n let storageClient: null | Storage = null\n\n const getStorageClient = (): Storage => {\n if (storageClient) {\n return storageClient\n }\n storageClient = new Storage(options)\n return storageClient\n }\n\n return {\n name: 'gcs',\n generateURL: getGenerateURL({ bucket, getStorageClient }),\n handleDelete: getHandleDelete({ bucket, getStorageClient }),\n handleUpload: getHandleUpload({\n acl,\n bucket,\n collection,\n getStorageClient,\n prefix,\n }),\n staticHandler: getHandler({ bucket, collection, getStorageClient }),\n }\n }\n}\n"],"names":["Storage","cloudStoragePlugin","getGenerateURL","getHandleDelete","getHandleUpload","getHandler","gcsStorage","gcsStorageOptions","incomingConfig","enabled","adapter","gcsStorageInternal","collectionsWithAdapter","Object","entries","collections","reduce","acc","slug","collOptions","config","map","collection","upload","disableLocalStorage","acl","bucket","options","prefix","storageClient","getStorageClient","name","generateURL","handleDelete","handleUpload","staticHandler"],"mappings":"AASA,SAASA,OAAO,QAAQ,wBAAuB;AAC/C,SAASC,kBAAkB,QAAQ,mCAAkC;AAErE,SAASC,cAAc,QAAQ,mBAAkB;AACjD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,UAAU,QAAQ,qBAAoB;AA8B/C,OAAO,MAAMC,aACX,CAACC,oBACD,CAACC;QACC,IAAID,kBAAkBE,OAAO,KAAK,OAAO;YACvC,OAAOD;QACT;QAEA,MAAME,UAAUC,mBAAmBJ;QAEnC,+CAA+C;QAC/C,MAAMK,yBAAmEC,OAAOC,OAAO,CACrFP,kBAAkBQ,WAAW,EAC7BC,MAAM,CACN,CAACC,KAAK,CAACC,MAAMC,YAAY,GAAM,CAAA;gBAC7B,GAAGF,GAAG;gBACN,CAACC,KAAK,EAAE;oBACN,GAAIC,gBAAgB,OAAO,CAAC,IAAIA,WAAW;oBAC3CT;gBACF;YACF,CAAA,GACA,CAAC;QAGH,gFAAgF;QAChF,MAAMU,SAAS;YACb,GAAGZ,cAAc;YACjBO,aAAa,AAACP,CAAAA,eAAeO,WAAW,IAAI,EAAE,AAAD,EAAGM,GAAG,CAAC,CAACC;gBACnD,IAAI,CAACV,sBAAsB,CAACU,WAAWJ,IAAI,CAAC,EAAE;oBAC5C,OAAOI;gBACT;gBAEA,OAAO;oBACL,GAAGA,UAAU;oBACbC,QAAQ;wBACN,GAAI,OAAOD,WAAWC,MAAM,KAAK,WAAWD,WAAWC,MAAM,GAAG,CAAC,CAAC;wBAClEC,qBAAqB;oBACvB;gBACF;YACF;QACF;QAEA,OAAOvB,mBAAmB;YACxBc,aAAaH;QACf,GAAGQ;IACL,EAAC;AAEH,SAAST,mBAAmB,EAAEc,GAAG,EAAEC,MAAM,EAAEC,OAAO,EAAqB;IACrE,OAAO,CAAC,EAAEL,UAAU,EAAEM,MAAM,EAAE;QAC5B,IAAIC,gBAAgC;QAEpC,MAAMC,mBAAmB;YACvB,IAAID,eAAe;gBACjB,OAAOA;YACT;YACAA,gBAAgB,IAAI7B,QAAQ2B;YAC5B,OAAOE;QACT;QAEA,OAAO;YACLE,MAAM;YACNC,aAAa9B,eAAe;gBAAEwB;gBAAQI;YAAiB;YACvDG,cAAc9B,gBAAgB;gBAAEuB;gBAAQI;YAAiB;YACzDI,cAAc9B,gBAAgB;gBAC5BqB;gBACAC;gBACAJ;gBACAQ;gBACAF;YACF;YACAO,eAAe9B,WAAW;gBAAEqB;gBAAQJ;gBAAYQ;YAAiB;QACnE;IACF;AACF"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { StorageOptions } from '@google-cloud/storage'\nimport type {\n Adapter,\n ClientUploadsConfig,\n PluginOptions as CloudStoragePluginOptions,\n CollectionOptions,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { Config, Plugin, UploadCollectionSlug } from 'payload'\n\nimport { Storage } from '@google-cloud/storage'\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\n\nimport { getGenerateSignedURLHandler } from './generateSignedURL.js'\nimport { getGenerateURL } from './generateURL.js'\nimport { getHandleDelete } from './handleDelete.js'\nimport { getHandleUpload } from './handleUpload.js'\nimport { getHandler } from './staticHandler.js'\n\nexport interface GcsStorageOptions {\n acl?: 'Private' | 'Public'\n\n /**\n * The name of the bucket to use.\n */\n bucket: string\n /**\n * Do uploads directly on the client to bypass limits on Vercel. You must allow CORS PUT method for the bucket to your website.\n */\n clientUploads?: ClientUploadsConfig\n /**\n * Collection options to apply the S3 adapter to.\n */\n collections: Partial<Record<UploadCollectionSlug, Omit<CollectionOptions, 'adapter'> | true>>\n /**\n * Whether or not to enable the plugin\n *\n * Default: true\n */\n enabled?: boolean\n\n /**\n * Google Cloud Storage client configuration.\n *\n * @see https://github.com/googleapis/nodejs-storage\n */\n options: StorageOptions\n}\n\ntype GcsStoragePlugin = (gcsStorageArgs: GcsStorageOptions) => Plugin\n\nexport const gcsStorage: GcsStoragePlugin =\n (gcsStorageOptions: GcsStorageOptions) =>\n (incomingConfig: Config): Config => {\n if (gcsStorageOptions.enabled === false) {\n return incomingConfig\n }\n\n let storageClient: null | Storage = null\n\n const getStorageClient = (): Storage => {\n if (storageClient) {\n return storageClient\n }\n storageClient = new Storage(gcsStorageOptions.options)\n\n return storageClient\n }\n\n const adapter = gcsStorageInternal(getStorageClient, gcsStorageOptions)\n\n if (gcsStorageOptions.clientUploads) {\n if (!incomingConfig.endpoints) {\n incomingConfig.endpoints = []\n }\n\n incomingConfig.endpoints.push({\n handler: getGenerateSignedURLHandler({\n access:\n typeof gcsStorageOptions.clientUploads === 'object'\n ? gcsStorageOptions.clientUploads.access\n : undefined,\n bucket: gcsStorageOptions.bucket,\n collections: gcsStorageOptions.collections,\n getStorageClient,\n }),\n method: 'post',\n path: '/storage-gcs-generate-signed-url',\n })\n }\n\n if (!incomingConfig.admin) {\n incomingConfig.admin = {}\n }\n\n if (!incomingConfig.admin.components) {\n incomingConfig.admin.components = {}\n }\n\n if (!incomingConfig.admin.components.providers) {\n incomingConfig.admin.components.providers = []\n }\n\n for (const collectionSlug in gcsStorageOptions.collections) {\n incomingConfig.admin.components.providers.push({\n clientProps: {\n collectionSlug,\n enabled: !!gcsStorageOptions.clientUploads,\n },\n path: '@payloadcms/storage-gcs/client#GcsClientUploadHandler',\n })\n }\n\n // Add adapter to each collection option object\n const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries(\n gcsStorageOptions.collections,\n ).reduce(\n (acc, [slug, collOptions]) => ({\n ...acc,\n [slug]: {\n ...(collOptions === true ? {} : collOptions),\n adapter,\n },\n }),\n {} as Record<string, CollectionOptions>,\n )\n\n // Set disableLocalStorage: true for collections specified in the plugin options\n const config = {\n ...incomingConfig,\n collections: (incomingConfig.collections || []).map((collection) => {\n if (!collectionsWithAdapter[collection.slug]) {\n return collection\n }\n\n return {\n ...collection,\n upload: {\n ...(typeof collection.upload === 'object' ? collection.upload : {}),\n disableLocalStorage: true,\n },\n }\n }),\n }\n\n return cloudStoragePlugin({\n collections: collectionsWithAdapter,\n })(config)\n }\n\nfunction gcsStorageInternal(\n getStorageClient: () => Storage,\n { acl, bucket }: GcsStorageOptions,\n): Adapter {\n return ({ collection, prefix }): GeneratedAdapter => {\n return {\n name: 'gcs',\n generateURL: getGenerateURL({ bucket, getStorageClient }),\n handleDelete: getHandleDelete({ bucket, getStorageClient }),\n handleUpload: getHandleUpload({\n acl,\n bucket,\n collection,\n getStorageClient,\n prefix,\n }),\n staticHandler: getHandler({ bucket, collection, getStorageClient }),\n }\n }\n}\n"],"names":["Storage","cloudStoragePlugin","getGenerateSignedURLHandler","getGenerateURL","getHandleDelete","getHandleUpload","getHandler","gcsStorage","gcsStorageOptions","incomingConfig","enabled","storageClient","getStorageClient","options","adapter","gcsStorageInternal","clientUploads","endpoints","push","handler","access","undefined","bucket","collections","method","path","admin","components","providers","collectionSlug","clientProps","collectionsWithAdapter","Object","entries","reduce","acc","slug","collOptions","config","map","collection","upload","disableLocalStorage","acl","prefix","name","generateURL","handleDelete","handleUpload","staticHandler"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/storage-gcs",
3
- "version": "3.24.0",
3
+ "version": "3.25.0-canary.3d5c763",
4
4
  "description": "Payload storage adapter for Google Cloud Storage",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -23,6 +23,11 @@
23
23
  "import": "./dist/index.js",
24
24
  "types": "./dist/index.d.ts",
25
25
  "default": "./dist/index.js"
26
+ },
27
+ "./client": {
28
+ "import": "./dist/exports/client.js",
29
+ "types": "./dist/exports/client.d.ts",
30
+ "default": "./dist/exports/client.js"
26
31
  }
27
32
  },
28
33
  "main": "./dist/index.js",
@@ -32,13 +37,13 @@
32
37
  ],
33
38
  "dependencies": {
34
39
  "@google-cloud/storage": "^7.7.0",
35
- "@payloadcms/plugin-cloud-storage": "3.24.0"
40
+ "@payloadcms/plugin-cloud-storage": "3.25.0-canary.3d5c763"
36
41
  },
37
42
  "devDependencies": {
38
- "payload": "3.24.0"
43
+ "payload": "3.25.0-canary.3d5c763"
39
44
  },
40
45
  "peerDependencies": {
41
- "payload": "3.24.0"
46
+ "payload": "3.25.0-canary.3d5c763"
42
47
  },
43
48
  "engines": {
44
49
  "node": "^18.20.2 || >=20.9.0"