@payloadcms/storage-vercel-blob 3.0.0-alpha.63 → 3.0.0-beta.12

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":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,gBAAgB,CAAA;AASpD,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAA;IAEjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAE3B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;IAEtE;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AASD,KAAK,uBAAuB,GAAG,CAAC,qBAAqB,EAAE,wBAAwB,KAAK,MAAM,CAAA;AAE1F,eAAO,MAAM,iBAAiB,EAAE,uBA8C7B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,wCAAwC,CAAA;AAE/C,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,gBAAgB,CAAA;AASpD,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAA;IAEjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAE3B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;IAEtE;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AASD,KAAK,uBAAuB,GAAG,CAAC,qBAAqB,EAAE,wBAAwB,KAAK,MAAM,CAAA;AAE1F,eAAO,MAAM,iBAAiB,EAAE,uBAgE7B,CAAA"}
package/dist/index.js CHANGED
@@ -38,9 +38,25 @@ export const vercelBlobStorage = (options)=>(incomingConfig)=>{
38
38
  adapter
39
39
  }
40
40
  }), {});
41
+ // Set disableLocalStorage: true for collections specified in the plugin options
42
+ const config = {
43
+ ...incomingConfig,
44
+ collections: (incomingConfig.collections || []).map((collection)=>{
45
+ if (!collectionsWithAdapter[collection.slug]) {
46
+ return collection;
47
+ }
48
+ return {
49
+ ...collection,
50
+ upload: {
51
+ ...typeof collection.upload === 'object' ? collection.upload : {},
52
+ disableLocalStorage: true
53
+ }
54
+ };
55
+ })
56
+ };
41
57
  return cloudStorage({
42
58
  collections: collectionsWithAdapter
43
- })(incomingConfig);
59
+ })(config);
44
60
  };
45
61
  function vercelBlobStorageInternal(options) {
46
62
  return ({ collection, prefix })=>{
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n PluginOptions as CloudStoragePluginOptions,\n CollectionOptions,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { Adapter, GeneratedAdapter } from '@payloadcms/plugin-cloud-storage/types'\nimport type { Config, Plugin } from 'payload/config'\n\nimport { cloudStorage } from '@payloadcms/plugin-cloud-storage'\n\nimport { getGenerateUrl } from './generateURL.js'\nimport { getHandleDelete } from './handleDelete.js'\nimport { getHandleUpload } from './handleUpload.js'\nimport { getStaticHandler } from './staticHandler.js'\n\nexport type VercelBlobStorageOptions = {\n /**\n * Access control level\n *\n * @default 'public'\n */\n access?: 'public'\n\n /**\n * Add a random suffix to the uploaded file name\n *\n * @default false\n */\n addRandomSuffix?: boolean\n\n /**\n * Cache-Control max-age in seconds\n *\n * @default 31536000 (1 year)\n */\n cacheControlMaxAge?: number\n\n /**\n * Collections to apply the Vercel Blob adapter to\n */\n collections: Record<string, Omit<CollectionOptions, 'adapter'> | true>\n\n /**\n * Whether or not to enable the plugin\n *\n * Default: true\n */\n enabled?: boolean\n\n /**\n * Vercel Blob storage read/write token\n *\n * Usually process.env.BLOB_READ_WRITE_TOKEN set by Vercel\n */\n token: string\n}\n\nconst defaultUploadOptions: Partial<VercelBlobStorageOptions> = {\n access: 'public',\n addRandomSuffix: false,\n cacheControlMaxAge: 60 * 60 * 24 * 365, // 1 year\n enabled: true,\n}\n\ntype VercelBlobStoragePlugin = (vercelBlobStorageOpts: VercelBlobStorageOptions) => Plugin\n\nexport const vercelBlobStorage: VercelBlobStoragePlugin =\n (options: VercelBlobStorageOptions) =>\n (incomingConfig: Config): Config => {\n if (options.enabled === false) {\n return incomingConfig\n }\n\n if (!options.token) {\n throw new Error('The token argument is required for the Vercel Blob adapter.')\n }\n\n // Parse storeId from token\n const storeId = options.token.match(/^vercel_blob_rw_([a-z\\d]+)_[a-z\\d]+$/i)?.[1]?.toLowerCase()\n\n if (!storeId) {\n throw new Error(\n 'Invalid token format for Vercel Blob adapter. Should be vercel_blob_rw_<store_id>_<random_string>.',\n )\n }\n\n const optionsWithDefaults = {\n ...defaultUploadOptions,\n ...options,\n }\n\n const baseUrl = `https://${storeId}.${optionsWithDefaults.access}.blob.vercel-storage.com`\n\n const adapter = vercelBlobStorageInternal({ ...optionsWithDefaults, baseUrl })\n\n // Add adapter to each collection option object\n const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries(\n options.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 return cloudStorage({\n collections: collectionsWithAdapter,\n })(incomingConfig)\n }\n\nfunction vercelBlobStorageInternal(\n options: VercelBlobStorageOptions & { baseUrl: string },\n): Adapter {\n return ({ collection, prefix }): GeneratedAdapter => {\n const { access, addRandomSuffix, baseUrl, cacheControlMaxAge, token } = options\n return {\n generateURL: getGenerateUrl({ baseUrl, prefix }),\n handleDelete: getHandleDelete({ baseUrl, prefix, token: options.token }),\n handleUpload: getHandleUpload({\n access,\n addRandomSuffix,\n baseUrl,\n cacheControlMaxAge,\n prefix,\n token,\n }),\n staticHandler: getStaticHandler({ baseUrl, token }, collection),\n }\n }\n}\n"],"names":["cloudStorage","getGenerateUrl","getHandleDelete","getHandleUpload","getStaticHandler","defaultUploadOptions","access","addRandomSuffix","cacheControlMaxAge","enabled","vercelBlobStorage","options","incomingConfig","token","Error","storeId","match","toLowerCase","optionsWithDefaults","baseUrl","adapter","vercelBlobStorageInternal","collectionsWithAdapter","Object","entries","collections","reduce","acc","slug","collOptions","collection","prefix","generateURL","handleDelete","handleUpload","staticHandler"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAOA,SAASA,YAAY,QAAQ,mCAAkC;AAE/D,SAASC,cAAc,QAAQ,mBAAkB;AACjD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,gBAAgB,QAAQ,qBAAoB;AA4CrD,MAAMC,uBAA0D;IAC9DC,QAAQ;IACRC,iBAAiB;IACjBC,oBAAoB,KAAK,KAAK,KAAK;IACnCC,SAAS;AACX;AAIA,OAAO,MAAMC,oBACX,CAACC,UACD,CAACC;QACC,IAAID,QAAQF,OAAO,KAAK,OAAO;YAC7B,OAAOG;QACT;QAEA,IAAI,CAACD,QAAQE,KAAK,EAAE;YAClB,MAAM,IAAIC,MAAM;QAClB;QAEA,2BAA2B;QAC3B,MAAMC,UAAUJ,QAAQE,KAAK,CAACG,KAAK,CAAC,0CAA0C,CAAC,EAAE,EAAEC;QAEnF,IAAI,CAACF,SAAS;YACZ,MAAM,IAAID,MACR;QAEJ;QAEA,MAAMI,sBAAsB;YAC1B,GAAGb,oBAAoB;YACvB,GAAGM,OAAO;QACZ;QAEA,MAAMQ,UAAU,CAAC,QAAQ,EAAEJ,QAAQ,CAAC,EAAEG,oBAAoBZ,MAAM,CAAC,wBAAwB,CAAC;QAE1F,MAAMc,UAAUC,0BAA0B;YAAE,GAAGH,mBAAmB;YAAEC;QAAQ;QAE5E,+CAA+C;QAC/C,MAAMG,yBAAmEC,OAAOC,OAAO,CACrFb,QAAQc,WAAW,EACnBC,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,OAAOpB,aAAa;YAClByB,aAAaH;QACf,GAAGV;IACL,EAAC;AAEH,SAASS,0BACPV,OAAuD;IAEvD,OAAO,CAAC,EAAEmB,UAAU,EAAEC,MAAM,EAAE;QAC5B,MAAM,EAAEzB,MAAM,EAAEC,eAAe,EAAEY,OAAO,EAAEX,kBAAkB,EAAEK,KAAK,EAAE,GAAGF;QACxE,OAAO;YACLqB,aAAa/B,eAAe;gBAAEkB;gBAASY;YAAO;YAC9CE,cAAc/B,gBAAgB;gBAAEiB;gBAASY;gBAAQlB,OAAOF,QAAQE,KAAK;YAAC;YACtEqB,cAAc/B,gBAAgB;gBAC5BG;gBACAC;gBACAY;gBACAX;gBACAuB;gBACAlB;YACF;YACAsB,eAAe/B,iBAAiB;gBAAEe;gBAASN;YAAM,GAAGiB;QACtD;IACF;AACF"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n PluginOptions as CloudStoragePluginOptions,\n CollectionOptions,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { Adapter, GeneratedAdapter } from '@payloadcms/plugin-cloud-storage/types'\nimport type { Config, Plugin } from 'payload/config'\n\nimport { cloudStorage } from '@payloadcms/plugin-cloud-storage'\n\nimport { getGenerateUrl } from './generateURL.js'\nimport { getHandleDelete } from './handleDelete.js'\nimport { getHandleUpload } from './handleUpload.js'\nimport { getStaticHandler } from './staticHandler.js'\n\nexport type VercelBlobStorageOptions = {\n /**\n * Access control level\n *\n * @default 'public'\n */\n access?: 'public'\n\n /**\n * Add a random suffix to the uploaded file name\n *\n * @default false\n */\n addRandomSuffix?: boolean\n\n /**\n * Cache-Control max-age in seconds\n *\n * @default 31536000 (1 year)\n */\n cacheControlMaxAge?: number\n\n /**\n * Collections to apply the Vercel Blob adapter to\n */\n collections: Record<string, Omit<CollectionOptions, 'adapter'> | true>\n\n /**\n * Whether or not to enable the plugin\n *\n * Default: true\n */\n enabled?: boolean\n\n /**\n * Vercel Blob storage read/write token\n *\n * Usually process.env.BLOB_READ_WRITE_TOKEN set by Vercel\n */\n token: string\n}\n\nconst defaultUploadOptions: Partial<VercelBlobStorageOptions> = {\n access: 'public',\n addRandomSuffix: false,\n cacheControlMaxAge: 60 * 60 * 24 * 365, // 1 year\n enabled: true,\n}\n\ntype VercelBlobStoragePlugin = (vercelBlobStorageOpts: VercelBlobStorageOptions) => Plugin\n\nexport const vercelBlobStorage: VercelBlobStoragePlugin =\n (options: VercelBlobStorageOptions) =>\n (incomingConfig: Config): Config => {\n if (options.enabled === false) {\n return incomingConfig\n }\n\n if (!options.token) {\n throw new Error('The token argument is required for the Vercel Blob adapter.')\n }\n\n // Parse storeId from token\n const storeId = options.token.match(/^vercel_blob_rw_([a-z\\d]+)_[a-z\\d]+$/i)?.[1]?.toLowerCase()\n\n if (!storeId) {\n throw new Error(\n 'Invalid token format for Vercel Blob adapter. Should be vercel_blob_rw_<store_id>_<random_string>.',\n )\n }\n\n const optionsWithDefaults = {\n ...defaultUploadOptions,\n ...options,\n }\n\n const baseUrl = `https://${storeId}.${optionsWithDefaults.access}.blob.vercel-storage.com`\n\n const adapter = vercelBlobStorageInternal({ ...optionsWithDefaults, baseUrl })\n\n // Add adapter to each collection option object\n const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries(\n options.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 cloudStorage({\n collections: collectionsWithAdapter,\n })(config)\n }\n\nfunction vercelBlobStorageInternal(\n options: VercelBlobStorageOptions & { baseUrl: string },\n): Adapter {\n return ({ collection, prefix }): GeneratedAdapter => {\n const { access, addRandomSuffix, baseUrl, cacheControlMaxAge, token } = options\n return {\n generateURL: getGenerateUrl({ baseUrl, prefix }),\n handleDelete: getHandleDelete({ baseUrl, prefix, token: options.token }),\n handleUpload: getHandleUpload({\n access,\n addRandomSuffix,\n baseUrl,\n cacheControlMaxAge,\n prefix,\n token,\n }),\n staticHandler: getStaticHandler({ baseUrl, token }, collection),\n }\n }\n}\n"],"names":["cloudStorage","getGenerateUrl","getHandleDelete","getHandleUpload","getStaticHandler","defaultUploadOptions","access","addRandomSuffix","cacheControlMaxAge","enabled","vercelBlobStorage","options","incomingConfig","token","Error","storeId","match","toLowerCase","optionsWithDefaults","baseUrl","adapter","vercelBlobStorageInternal","collectionsWithAdapter","Object","entries","collections","reduce","acc","slug","collOptions","config","map","collection","upload","disableLocalStorage","prefix","generateURL","handleDelete","handleUpload","staticHandler"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAOA,SAASA,YAAY,QAAQ,mCAAkC;AAE/D,SAASC,cAAc,QAAQ,mBAAkB;AACjD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,gBAAgB,QAAQ,qBAAoB;AA4CrD,MAAMC,uBAA0D;IAC9DC,QAAQ;IACRC,iBAAiB;IACjBC,oBAAoB,KAAK,KAAK,KAAK;IACnCC,SAAS;AACX;AAIA,OAAO,MAAMC,oBACX,CAACC,UACD,CAACC;QACC,IAAID,QAAQF,OAAO,KAAK,OAAO;YAC7B,OAAOG;QACT;QAEA,IAAI,CAACD,QAAQE,KAAK,EAAE;YAClB,MAAM,IAAIC,MAAM;QAClB;QAEA,2BAA2B;QAC3B,MAAMC,UAAUJ,QAAQE,KAAK,CAACG,KAAK,CAAC,0CAA0C,CAAC,EAAE,EAAEC;QAEnF,IAAI,CAACF,SAAS;YACZ,MAAM,IAAID,MACR;QAEJ;QAEA,MAAMI,sBAAsB;YAC1B,GAAGb,oBAAoB;YACvB,GAAGM,OAAO;QACZ;QAEA,MAAMQ,UAAU,CAAC,QAAQ,EAAEJ,QAAQ,CAAC,EAAEG,oBAAoBZ,MAAM,CAAC,wBAAwB,CAAC;QAE1F,MAAMc,UAAUC,0BAA0B;YAAE,GAAGH,mBAAmB;YAAEC;QAAQ;QAE5E,+CAA+C;QAC/C,MAAMG,yBAAmEC,OAAOC,OAAO,CACrFb,QAAQc,WAAW,EACnBC,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,GAAGlB,cAAc;YACjBa,aAAa,AAACb,CAAAA,eAAea,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,OAAOlC,aAAa;YAClByB,aAAaH;QACf,GAAGQ;IACL,EAAC;AAEH,SAAST,0BACPV,OAAuD;IAEvD,OAAO,CAAC,EAAEqB,UAAU,EAAEG,MAAM,EAAE;QAC5B,MAAM,EAAE7B,MAAM,EAAEC,eAAe,EAAEY,OAAO,EAAEX,kBAAkB,EAAEK,KAAK,EAAE,GAAGF;QACxE,OAAO;YACLyB,aAAanC,eAAe;gBAAEkB;gBAASgB;YAAO;YAC9CE,cAAcnC,gBAAgB;gBAAEiB;gBAASgB;gBAAQtB,OAAOF,QAAQE,KAAK;YAAC;YACtEyB,cAAcnC,gBAAgB;gBAC5BG;gBACAC;gBACAY;gBACAX;gBACA2B;gBACAtB;YACF;YACA0B,eAAenC,iBAAiB;gBAAEe;gBAASN;YAAM,GAAGmB;QACtD;IACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/storage-vercel-blob",
3
- "version": "3.0.0-alpha.63",
3
+ "version": "3.0.0-beta.12",
4
4
  "description": "Payload storage adapter for Vercel Blob Storage",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,14 +21,14 @@
21
21
  }
22
22
  },
23
23
  "dependencies": {
24
- "@payloadcms/plugin-cloud-storage": "3.0.0-alpha.63"
24
+ "@payloadcms/plugin-cloud-storage": "3.0.0-beta.12"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@vercel/blob": "^0.22.3",
28
- "payload": "3.0.0-alpha.63"
28
+ "payload": "3.0.0-beta.12"
29
29
  },
30
30
  "peerDependencies": {
31
- "payload": "3.0.0-alpha.63"
31
+ "payload": "3.0.0-beta.12"
32
32
  },
33
33
  "engines": {
34
34
  "node": ">=18.20.2"
package/src/index.ts DELETED
@@ -1,133 +0,0 @@
1
- import type {
2
- PluginOptions as CloudStoragePluginOptions,
3
- CollectionOptions,
4
- } from '@payloadcms/plugin-cloud-storage/types'
5
- import type { Adapter, GeneratedAdapter } from '@payloadcms/plugin-cloud-storage/types'
6
- import type { Config, Plugin } from 'payload/config'
7
-
8
- import { cloudStorage } from '@payloadcms/plugin-cloud-storage'
9
-
10
- import { getGenerateUrl } from './generateURL.js'
11
- import { getHandleDelete } from './handleDelete.js'
12
- import { getHandleUpload } from './handleUpload.js'
13
- import { getStaticHandler } from './staticHandler.js'
14
-
15
- export type VercelBlobStorageOptions = {
16
- /**
17
- * Access control level
18
- *
19
- * @default 'public'
20
- */
21
- access?: 'public'
22
-
23
- /**
24
- * Add a random suffix to the uploaded file name
25
- *
26
- * @default false
27
- */
28
- addRandomSuffix?: boolean
29
-
30
- /**
31
- * Cache-Control max-age in seconds
32
- *
33
- * @default 31536000 (1 year)
34
- */
35
- cacheControlMaxAge?: number
36
-
37
- /**
38
- * Collections to apply the Vercel Blob adapter to
39
- */
40
- collections: Record<string, Omit<CollectionOptions, 'adapter'> | true>
41
-
42
- /**
43
- * Whether or not to enable the plugin
44
- *
45
- * Default: true
46
- */
47
- enabled?: boolean
48
-
49
- /**
50
- * Vercel Blob storage read/write token
51
- *
52
- * Usually process.env.BLOB_READ_WRITE_TOKEN set by Vercel
53
- */
54
- token: string
55
- }
56
-
57
- const defaultUploadOptions: Partial<VercelBlobStorageOptions> = {
58
- access: 'public',
59
- addRandomSuffix: false,
60
- cacheControlMaxAge: 60 * 60 * 24 * 365, // 1 year
61
- enabled: true,
62
- }
63
-
64
- type VercelBlobStoragePlugin = (vercelBlobStorageOpts: VercelBlobStorageOptions) => Plugin
65
-
66
- export const vercelBlobStorage: VercelBlobStoragePlugin =
67
- (options: VercelBlobStorageOptions) =>
68
- (incomingConfig: Config): Config => {
69
- if (options.enabled === false) {
70
- return incomingConfig
71
- }
72
-
73
- if (!options.token) {
74
- throw new Error('The token argument is required for the Vercel Blob adapter.')
75
- }
76
-
77
- // Parse storeId from token
78
- const storeId = options.token.match(/^vercel_blob_rw_([a-z\d]+)_[a-z\d]+$/i)?.[1]?.toLowerCase()
79
-
80
- if (!storeId) {
81
- throw new Error(
82
- 'Invalid token format for Vercel Blob adapter. Should be vercel_blob_rw_<store_id>_<random_string>.',
83
- )
84
- }
85
-
86
- const optionsWithDefaults = {
87
- ...defaultUploadOptions,
88
- ...options,
89
- }
90
-
91
- const baseUrl = `https://${storeId}.${optionsWithDefaults.access}.blob.vercel-storage.com`
92
-
93
- const adapter = vercelBlobStorageInternal({ ...optionsWithDefaults, baseUrl })
94
-
95
- // Add adapter to each collection option object
96
- const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries(
97
- options.collections,
98
- ).reduce(
99
- (acc, [slug, collOptions]) => ({
100
- ...acc,
101
- [slug]: {
102
- ...(collOptions === true ? {} : collOptions),
103
- adapter,
104
- },
105
- }),
106
- {} as Record<string, CollectionOptions>,
107
- )
108
-
109
- return cloudStorage({
110
- collections: collectionsWithAdapter,
111
- })(incomingConfig)
112
- }
113
-
114
- function vercelBlobStorageInternal(
115
- options: VercelBlobStorageOptions & { baseUrl: string },
116
- ): Adapter {
117
- return ({ collection, prefix }): GeneratedAdapter => {
118
- const { access, addRandomSuffix, baseUrl, cacheControlMaxAge, token } = options
119
- return {
120
- generateURL: getGenerateUrl({ baseUrl, prefix }),
121
- handleDelete: getHandleDelete({ baseUrl, prefix, token: options.token }),
122
- handleUpload: getHandleUpload({
123
- access,
124
- addRandomSuffix,
125
- baseUrl,
126
- cacheControlMaxAge,
127
- prefix,
128
- token,
129
- }),
130
- staticHandler: getStaticHandler({ baseUrl, token }, collection),
131
- }
132
- }
133
- }