@payloadcms/storage-gcs 3.25.0 → 3.26.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.
@@ -1,8 +1,9 @@
1
- export declare const GcsClientUploadHandler: ({ children, collectionSlug, enabled, extra, serverHandlerPath, }: {
1
+ export declare const GcsClientUploadHandler: ({ children, collectionSlug, enabled, extra, prefix, serverHandlerPath, }: {
2
2
  children: import("react").ReactNode;
3
3
  collectionSlug: import("packages/payload/src/index.js").UploadCollectionSlug;
4
4
  enabled?: boolean;
5
5
  extra: Record<string, unknown>;
6
+ prefix?: string;
6
7
  serverHandlerPath: string;
7
8
  }) => import("react").JSX.Element;
8
9
  //# sourceMappingURL=GcsClientUploadHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GcsClientUploadHandler.d.ts","sourceRoot":"","sources":["../../src/client/GcsClientUploadHandler.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB;;;;;;aAqB0B,OAAO,aADlE,CAAA"}
1
+ {"version":3,"file":"GcsClientUploadHandler.d.ts","sourceRoot":"","sources":["../../src/client/GcsClientUploadHandler.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB;;;;;;;aAyBsC,OAAO,aAD9E,CAAA"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client';
3
3
  export const GcsClientUploadHandler = createClientUploadHandler({
4
- handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL })=>{
4
+ handler: async ({ apiRoute, collectionSlug, file, prefix, serverHandlerPath, serverURL })=>{
5
5
  const response = await fetch(`${serverURL}${apiRoute}${serverHandlerPath}`, {
6
6
  body: JSON.stringify({
7
7
  collectionSlug,
@@ -20,6 +20,9 @@ export const GcsClientUploadHandler = createClientUploadHandler({
20
20
  },
21
21
  method: 'PUT'
22
22
  });
23
+ return {
24
+ prefix
25
+ };
23
26
  }
24
27
  });
25
28
 
@@ -1 +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"}
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, prefix, 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 return {\n prefix,\n }\n },\n})\n"],"names":["createClientUploadHandler","GcsClientUploadHandler","handler","apiRoute","collectionSlug","file","prefix","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,MAAM,EAAEC,iBAAiB,EAAEC,SAAS,EAAE;QACtF,MAAMC,WAAW,MAAMC,MAAM,GAAGF,YAAYL,WAAWI,mBAAmB,EAAE;YAC1EI,MAAMC,KAAKC,SAAS,CAAC;gBACnBT;gBACAU,UAAUT,KAAKU,IAAI;gBACnBC,UAAUX,KAAKY,IAAI;YACrB;YACAC,aAAa;YACbC,QAAQ;QACV;QAEA,MAAM,EAAEC,GAAG,EAAE,GAAG,MAAMX,SAASY,IAAI;QAEnC,MAAMX,MAAMU,KAAK;YACfT,MAAMN;YACNiB,SAAS;gBAAE,kBAAkBjB,KAAKkB,IAAI,CAACC,QAAQ;gBAAI,gBAAgBnB,KAAKY,IAAI;YAAC;YAC7EE,QAAQ;QACV;QAEA,OAAO;YACLb;QACF;IACF;AACF,GAAE"}
@@ -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,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"}
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;AAYnE,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,gBA0EtB,CAAA"}
package/dist/index.js CHANGED
@@ -1,14 +1,12 @@
1
1
  import { Storage } from '@google-cloud/storage';
2
2
  import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage';
3
+ import { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities';
3
4
  import { getGenerateSignedURLHandler } from './generateSignedURL.js';
4
5
  import { getGenerateURL } from './generateURL.js';
5
6
  import { getHandleDelete } from './handleDelete.js';
6
7
  import { getHandleUpload } from './handleUpload.js';
7
8
  import { getHandler } from './staticHandler.js';
8
9
  export const gcsStorage = (gcsStorageOptions)=>(incomingConfig)=>{
9
- if (gcsStorageOptions.enabled === false) {
10
- return incomingConfig;
11
- }
12
10
  let storageClient = null;
13
11
  const getStorageClient = ()=>{
14
12
  if (storageClient) {
@@ -18,38 +16,22 @@ export const gcsStorage = (gcsStorageOptions)=>(incomingConfig)=>{
18
16
  return storageClient;
19
17
  };
20
18
  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
- });
19
+ const isPluginDisabled = gcsStorageOptions.enabled === false;
20
+ initClientUploads({
21
+ clientHandler: '@payloadcms/storage-gcs/client#GcsClientUploadHandler',
22
+ collections: gcsStorageOptions.collections,
23
+ config: incomingConfig,
24
+ enabled: !isPluginDisabled && Boolean(gcsStorageOptions.enabled),
25
+ serverHandler: getGenerateSignedURLHandler({
26
+ access: typeof gcsStorageOptions.clientUploads === 'object' ? gcsStorageOptions.clientUploads.access : undefined,
27
+ bucket: gcsStorageOptions.bucket,
28
+ collections: gcsStorageOptions.collections,
29
+ getStorageClient
30
+ }),
31
+ serverHandlerPath: '/storage-gcs-generate-signed-url'
32
+ });
33
+ if (isPluginDisabled) {
34
+ return incomingConfig;
53
35
  }
54
36
  // Add adapter to each collection option object
55
37
  const collectionsWithAdapter = Object.entries(gcsStorageOptions.collections).reduce((acc, [slug, collOptions])=>({
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 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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"}
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'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\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 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 const isPluginDisabled = gcsStorageOptions.enabled === false\n\n initClientUploads({\n clientHandler: '@payloadcms/storage-gcs/client#GcsClientUploadHandler',\n collections: gcsStorageOptions.collections,\n config: incomingConfig,\n enabled: !isPluginDisabled && Boolean(gcsStorageOptions.enabled),\n serverHandler: 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 serverHandlerPath: '/storage-gcs-generate-signed-url',\n })\n\n if (isPluginDisabled) {\n return incomingConfig\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","initClientUploads","getGenerateSignedURLHandler","getGenerateURL","getHandleDelete","getHandleUpload","getHandler","gcsStorage","gcsStorageOptions","incomingConfig","storageClient","getStorageClient","options","adapter","gcsStorageInternal","isPluginDisabled","enabled","clientHandler","collections","config","Boolean","serverHandler","access","clientUploads","undefined","bucket","serverHandlerPath","collectionsWithAdapter","Object","entries","reduce","acc","slug","collOptions","map","collection","upload","disableLocalStorage","acl","prefix","name","generateURL","handleDelete","handleUpload","staticHandler"],"mappings":"AAUA,SAASA,OAAO,QAAQ,wBAAuB;AAC/C,SAASC,kBAAkB,QAAQ,mCAAkC;AACrE,SAASC,iBAAiB,QAAQ,6CAA4C;AAE9E,SAASC,2BAA2B,QAAQ,yBAAwB;AACpE,SAASC,cAAc,QAAQ,mBAAkB;AACjD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,UAAU,QAAQ,qBAAoB;AAkC/C,OAAO,MAAMC,aACX,CAACC,oBACD,CAACC;QACC,IAAIC,gBAAgC;QAEpC,MAAMC,mBAAmB;YACvB,IAAID,eAAe;gBACjB,OAAOA;YACT;YACAA,gBAAgB,IAAIX,QAAQS,kBAAkBI,OAAO;YAErD,OAAOF;QACT;QAEA,MAAMG,UAAUC,mBAAmBH,kBAAkBH;QAErD,MAAMO,mBAAmBP,kBAAkBQ,OAAO,KAAK;QAEvDf,kBAAkB;YAChBgB,eAAe;YACfC,aAAaV,kBAAkBU,WAAW;YAC1CC,QAAQV;YACRO,SAAS,CAACD,oBAAoBK,QAAQZ,kBAAkBQ,OAAO;YAC/DK,eAAenB,4BAA4B;gBACzCoB,QACE,OAAOd,kBAAkBe,aAAa,KAAK,WACvCf,kBAAkBe,aAAa,CAACD,MAAM,GACtCE;gBACNC,QAAQjB,kBAAkBiB,MAAM;gBAChCP,aAAaV,kBAAkBU,WAAW;gBAC1CP;YACF;YACAe,mBAAmB;QACrB;QAEA,IAAIX,kBAAkB;YACpB,OAAON;QACT;QAEA,+CAA+C;QAC/C,MAAMkB,yBAAmEC,OAAOC,OAAO,CACrFrB,kBAAkBU,WAAW,EAC7BY,MAAM,CACN,CAACC,KAAK,CAACC,MAAMC,YAAY,GAAM,CAAA;gBAC7B,GAAGF,GAAG;gBACN,CAACC,KAAK,EAAE;oBACN,GAAIC,gBAAgB,OAAO,CAAC,IAAIA,WAAW;oBAC3CpB;gBACF;YACF,CAAA,GACA,CAAC;QAGH,gFAAgF;QAChF,MAAMM,SAAS;YACb,GAAGV,cAAc;YACjBS,aAAa,AAACT,CAAAA,eAAeS,WAAW,IAAI,EAAE,AAAD,EAAGgB,GAAG,CAAC,CAACC;gBACnD,IAAI,CAACR,sBAAsB,CAACQ,WAAWH,IAAI,CAAC,EAAE;oBAC5C,OAAOG;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,OAAOrC,mBAAmB;YACxBkB,aAAaS;QACf,GAAGR;IACL,EAAC;AAEH,SAASL,mBACPH,gBAA+B,EAC/B,EAAE2B,GAAG,EAAEb,MAAM,EAAqB;IAElC,OAAO,CAAC,EAAEU,UAAU,EAAEI,MAAM,EAAE;QAC5B,OAAO;YACLC,MAAM;YACNC,aAAatC,eAAe;gBAAEsB;gBAAQd;YAAiB;YACvD+B,cAActC,gBAAgB;gBAAEqB;gBAAQd;YAAiB;YACzDgC,cAActC,gBAAgB;gBAC5BiC;gBACAb;gBACAU;gBACAxB;gBACA4B;YACF;YACAK,eAAetC,WAAW;gBAAEmB;gBAAQU;gBAAYxB;YAAiB;QACnE;IACF;AACF"}
@@ -1,9 +1,10 @@
1
1
  import { getFilePrefix } from '@payloadcms/plugin-cloud-storage/utilities';
2
2
  import path from 'path';
3
3
  export const getHandler = ({ bucket, collection, getStorageClient })=>{
4
- return async (req, { params: { filename } })=>{
4
+ return async (req, { params: { clientUploadContext, filename } })=>{
5
5
  try {
6
6
  const prefix = await getFilePrefix({
7
+ clientUploadContext,
7
8
  collection,
8
9
  filename,
9
10
  req
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionConfig } from 'payload'\n\nimport { getFilePrefix } from '@payloadcms/plugin-cloud-storage/utilities'\nimport path from 'path'\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, { params: { filename } }) => {\n try {\n const prefix = await getFilePrefix({ collection, filename, req })\n const file = getStorageClient().bucket(bucket).file(path.posix.join(prefix, filename))\n\n const [metadata] = await file.getMetadata()\n\n const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\n const objectEtag = metadata.etag\n\n if (etagFromHeaders && etagFromHeaders === objectEtag) {\n return new Response(null, {\n headers: new Headers({\n 'Content-Length': String(metadata.size),\n 'Content-Type': String(metadata.contentType),\n ETag: String(metadata.etag),\n }),\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 nodeStream = file.createReadStream()\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: new Headers({\n 'Content-Length': String(metadata.size),\n 'Content-Type': String(metadata.contentType),\n ETag: String(metadata.etag),\n }),\n status: 200,\n })\n } catch (err: unknown) {\n req.payload.logger.error(err)\n return new Response('Internal Server Error', { status: 500 })\n }\n }\n}\n"],"names":["getFilePrefix","path","getHandler","bucket","collection","getStorageClient","req","params","filename","prefix","file","posix","join","metadata","getMetadata","etagFromHeaders","headers","get","objectEtag","etag","Response","Headers","String","size","contentType","ETag","status","readableStream","ReadableStream","start","controller","nodeStream","createReadStream","on","chunk","enqueue","Uint8Array","close","err","error","payload","logger"],"mappings":"AAIA,SAASA,aAAa,QAAQ,6CAA4C;AAC1E,OAAOC,UAAU,OAAM;AAQvB,OAAO,MAAMC,aAAa,CAAC,EAAEC,MAAM,EAAEC,UAAU,EAAEC,gBAAgB,EAAQ;IACvE,OAAO,OAAOC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,EAAE,EAAE;QACzC,IAAI;YACF,MAAMC,SAAS,MAAMT,cAAc;gBAAEI;gBAAYI;gBAAUF;YAAI;YAC/D,MAAMI,OAAOL,mBAAmBF,MAAM,CAACA,QAAQO,IAAI,CAACT,KAAKU,KAAK,CAACC,IAAI,CAACH,QAAQD;YAE5E,MAAM,CAACK,SAAS,GAAG,MAAMH,KAAKI,WAAW;YAEzC,MAAMC,kBAAkBT,IAAIU,OAAO,CAACC,GAAG,CAAC,WAAWX,IAAIU,OAAO,CAACC,GAAG,CAAC;YACnE,MAAMC,aAAaL,SAASM,IAAI;YAEhC,IAAIJ,mBAAmBA,oBAAoBG,YAAY;gBACrD,OAAO,IAAIE,SAAS,MAAM;oBACxBJ,SAAS,IAAIK,QAAQ;wBACnB,kBAAkBC,OAAOT,SAASU,IAAI;wBACtC,gBAAgBD,OAAOT,SAASW,WAAW;wBAC3CC,MAAMH,OAAOT,SAASM,IAAI;oBAC5B;oBACAO,QAAQ;gBACV;YACF;YAEA,sEAAsE;YACtE,MAAMC,iBAAiB,IAAIC,eAAe;gBACxCC,OAAMC,UAAU;oBACd,MAAMC,aAAarB,KAAKsB,gBAAgB;oBACxCD,WAAWE,EAAE,CAAC,QAAQ,CAACC;wBACrBJ,WAAWK,OAAO,CAAC,IAAIC,WAAWF;oBACpC;oBACAH,WAAWE,EAAE,CAAC,OAAO;wBACnBH,WAAWO,KAAK;oBAClB;oBACAN,WAAWE,EAAE,CAAC,SAAS,CAACK;wBACtBR,WAAWS,KAAK,CAACD;oBACnB;gBACF;YACF;YAEA,OAAO,IAAIlB,SAASO,gBAAgB;gBAClCX,SAAS,IAAIK,QAAQ;oBACnB,kBAAkBC,OAAOT,SAASU,IAAI;oBACtC,gBAAgBD,OAAOT,SAASW,WAAW;oBAC3CC,MAAMH,OAAOT,SAASM,IAAI;gBAC5B;gBACAO,QAAQ;YACV;QACF,EAAE,OAAOY,KAAc;YACrBhC,IAAIkC,OAAO,CAACC,MAAM,CAACF,KAAK,CAACD;YACzB,OAAO,IAAIlB,SAAS,yBAAyB;gBAAEM,QAAQ;YAAI;QAC7D;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type { Storage } from '@google-cloud/storage'\nimport type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { CollectionConfig } from 'payload'\n\nimport { getFilePrefix } from '@payloadcms/plugin-cloud-storage/utilities'\nimport path from 'path'\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, { params: { clientUploadContext, filename } }) => {\n try {\n const prefix = await getFilePrefix({ clientUploadContext, collection, filename, req })\n const file = getStorageClient().bucket(bucket).file(path.posix.join(prefix, filename))\n\n const [metadata] = await file.getMetadata()\n\n const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\n const objectEtag = metadata.etag\n\n if (etagFromHeaders && etagFromHeaders === objectEtag) {\n return new Response(null, {\n headers: new Headers({\n 'Content-Length': String(metadata.size),\n 'Content-Type': String(metadata.contentType),\n ETag: String(metadata.etag),\n }),\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 nodeStream = file.createReadStream()\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: new Headers({\n 'Content-Length': String(metadata.size),\n 'Content-Type': String(metadata.contentType),\n ETag: String(metadata.etag),\n }),\n status: 200,\n })\n } catch (err: unknown) {\n req.payload.logger.error(err)\n return new Response('Internal Server Error', { status: 500 })\n }\n }\n}\n"],"names":["getFilePrefix","path","getHandler","bucket","collection","getStorageClient","req","params","clientUploadContext","filename","prefix","file","posix","join","metadata","getMetadata","etagFromHeaders","headers","get","objectEtag","etag","Response","Headers","String","size","contentType","ETag","status","readableStream","ReadableStream","start","controller","nodeStream","createReadStream","on","chunk","enqueue","Uint8Array","close","err","error","payload","logger"],"mappings":"AAIA,SAASA,aAAa,QAAQ,6CAA4C;AAC1E,OAAOC,UAAU,OAAM;AAQvB,OAAO,MAAMC,aAAa,CAAC,EAAEC,MAAM,EAAEC,UAAU,EAAEC,gBAAgB,EAAQ;IACvE,OAAO,OAAOC,KAAK,EAAEC,QAAQ,EAAEC,mBAAmB,EAAEC,QAAQ,EAAE,EAAE;QAC9D,IAAI;YACF,MAAMC,SAAS,MAAMV,cAAc;gBAAEQ;gBAAqBJ;gBAAYK;gBAAUH;YAAI;YACpF,MAAMK,OAAON,mBAAmBF,MAAM,CAACA,QAAQQ,IAAI,CAACV,KAAKW,KAAK,CAACC,IAAI,CAACH,QAAQD;YAE5E,MAAM,CAACK,SAAS,GAAG,MAAMH,KAAKI,WAAW;YAEzC,MAAMC,kBAAkBV,IAAIW,OAAO,CAACC,GAAG,CAAC,WAAWZ,IAAIW,OAAO,CAACC,GAAG,CAAC;YACnE,MAAMC,aAAaL,SAASM,IAAI;YAEhC,IAAIJ,mBAAmBA,oBAAoBG,YAAY;gBACrD,OAAO,IAAIE,SAAS,MAAM;oBACxBJ,SAAS,IAAIK,QAAQ;wBACnB,kBAAkBC,OAAOT,SAASU,IAAI;wBACtC,gBAAgBD,OAAOT,SAASW,WAAW;wBAC3CC,MAAMH,OAAOT,SAASM,IAAI;oBAC5B;oBACAO,QAAQ;gBACV;YACF;YAEA,sEAAsE;YACtE,MAAMC,iBAAiB,IAAIC,eAAe;gBACxCC,OAAMC,UAAU;oBACd,MAAMC,aAAarB,KAAKsB,gBAAgB;oBACxCD,WAAWE,EAAE,CAAC,QAAQ,CAACC;wBACrBJ,WAAWK,OAAO,CAAC,IAAIC,WAAWF;oBACpC;oBACAH,WAAWE,EAAE,CAAC,OAAO;wBACnBH,WAAWO,KAAK;oBAClB;oBACAN,WAAWE,EAAE,CAAC,SAAS,CAACK;wBACtBR,WAAWS,KAAK,CAACD;oBACnB;gBACF;YACF;YAEA,OAAO,IAAIlB,SAASO,gBAAgB;gBAClCX,SAAS,IAAIK,QAAQ;oBACnB,kBAAkBC,OAAOT,SAASU,IAAI;oBACtC,gBAAgBD,OAAOT,SAASW,WAAW;oBAC3CC,MAAMH,OAAOT,SAASM,IAAI;gBAC5B;gBACAO,QAAQ;YACV;QACF,EAAE,OAAOY,KAAc;YACrBjC,IAAImC,OAAO,CAACC,MAAM,CAACF,KAAK,CAACD;YACzB,OAAO,IAAIlB,SAAS,yBAAyB;gBAAEM,QAAQ;YAAI;QAC7D;IACF;AACF,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/storage-gcs",
3
- "version": "3.25.0",
3
+ "version": "3.26.0",
4
4
  "description": "Payload storage adapter for Google Cloud Storage",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -37,13 +37,13 @@
37
37
  ],
38
38
  "dependencies": {
39
39
  "@google-cloud/storage": "^7.7.0",
40
- "@payloadcms/plugin-cloud-storage": "3.25.0"
40
+ "@payloadcms/plugin-cloud-storage": "3.26.0"
41
41
  },
42
42
  "devDependencies": {
43
- "payload": "3.25.0"
43
+ "payload": "3.26.0"
44
44
  },
45
45
  "peerDependencies": {
46
- "payload": "3.25.0"
46
+ "payload": "3.26.0"
47
47
  },
48
48
  "engines": {
49
49
  "node": "^18.20.2 || >=20.9.0"