@payloadcms/storage-uploadthing 3.25.0-canary.fd53f68 → 3.25.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.
package/README.md CHANGED
@@ -13,6 +13,7 @@ pnpm add @payloadcms/storage-uploadthing
13
13
  - Configure the `collections` object to specify which collections should use uploadthing. The slug _must_ match one of your existing collection slugs and be an `upload` type.
14
14
  - Get an API key from Uploadthing and set it as `apiKey` in the `options` object.
15
15
  - `acl` is optional and defaults to `public-read`.
16
+ - When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client.
16
17
 
17
18
  ```ts
18
19
  export default buildConfig({
@@ -0,0 +1,8 @@
1
+ export declare const UploadthingClientUploadHandler: ({ children, collectionSlug, enabled, extra, serverHandlerPath, }: {
2
+ children: import("react").ReactNode;
3
+ collectionSlug: import("payload").UploadCollectionSlug;
4
+ enabled?: boolean;
5
+ extra: Record<string, unknown>;
6
+ serverHandlerPath: string;
7
+ }) => import("react").JSX.Element;
8
+ //# sourceMappingURL=UploadthingClientUploadHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadthingClientUploadHandler.d.ts","sourceRoot":"","sources":["../../src/client/UploadthingClientUploadHandler.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,8BAA8B;;;;;;aAcuI,OAAO,aADvL,CAAA"}
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client';
3
+ import { genUploader } from 'uploadthing/client';
4
+ export const UploadthingClientUploadHandler = createClientUploadHandler({
5
+ handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL })=>{
6
+ const { uploadFiles } = genUploader({
7
+ package: 'storage-uploadthing',
8
+ url: `${serverURL}${apiRoute}${serverHandlerPath}?collectionSlug=${collectionSlug}`
9
+ });
10
+ const res = await uploadFiles('uploader', {
11
+ files: [
12
+ file
13
+ ]
14
+ });
15
+ return {
16
+ key: res[0].key
17
+ };
18
+ }
19
+ });
20
+
21
+ //# sourceMappingURL=UploadthingClientUploadHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/UploadthingClientUploadHandler.ts"],"sourcesContent":["'use client'\nimport { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client'\nimport { genUploader } from 'uploadthing/client'\n\nexport const UploadthingClientUploadHandler = createClientUploadHandler({\n handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL }) => {\n const { uploadFiles } = genUploader({\n package: 'storage-uploadthing',\n url: `${serverURL}${apiRoute}${serverHandlerPath}?collectionSlug=${collectionSlug}`,\n })\n\n const res = await uploadFiles('uploader', {\n files: [file],\n })\n\n return { key: res[0].key }\n },\n})\n"],"names":["createClientUploadHandler","genUploader","UploadthingClientUploadHandler","handler","apiRoute","collectionSlug","file","serverHandlerPath","serverURL","uploadFiles","package","url","res","files","key"],"mappings":"AAAA;AACA,SAASA,yBAAyB,QAAQ,0CAAyC;AACnF,SAASC,WAAW,QAAQ,qBAAoB;AAEhD,OAAO,MAAMC,iCAAiCF,0BAA0B;IACtEG,SAAS,OAAO,EAAEC,QAAQ,EAAEC,cAAc,EAAEC,IAAI,EAAEC,iBAAiB,EAAEC,SAAS,EAAE;QAC9E,MAAM,EAAEC,WAAW,EAAE,GAAGR,YAAY;YAClCS,SAAS;YACTC,KAAK,GAAGH,YAAYJ,WAAWG,kBAAkB,gBAAgB,EAAEF,gBAAgB;QACrF;QAEA,MAAMO,MAAM,MAAMH,YAAY,YAAY;YACxCI,OAAO;gBAACP;aAAK;QACf;QAEA,OAAO;YAAEQ,KAAKF,GAAG,CAAC,EAAE,CAACE,GAAG;QAAC;IAC3B;AACF,GAAE"}
@@ -0,0 +1,2 @@
1
+ export { UploadthingClientUploadHandler } from '../client/UploadthingClientUploadHandler.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,8BAA8B,EAAE,MAAM,6CAA6C,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { UploadthingClientUploadHandler } from '../client/UploadthingClientUploadHandler.js';
2
+
3
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { UploadthingClientUploadHandler } from '../client/UploadthingClientUploadHandler.js'\n"],"names":["UploadthingClientUploadHandler"],"mappings":"AAAA,SAASA,8BAA8B,QAAQ,8CAA6C"}
@@ -0,0 +1,12 @@
1
+ import { type PayloadHandler, type PayloadRequest, type UploadCollectionSlug } from 'payload';
2
+ type Args = {
3
+ access?: (args: {
4
+ collectionSlug: UploadCollectionSlug;
5
+ req: PayloadRequest;
6
+ }) => boolean | Promise<boolean>;
7
+ acl: 'private' | 'public-read';
8
+ token?: string;
9
+ };
10
+ export declare const getClientUploadRoute: ({ access, acl, token, }: Args) => PayloadHandler;
11
+ export {};
12
+ //# sourceMappingURL=getClientUploadRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getClientUploadRoute.d.ts","sourceRoot":"","sources":["../src/getClientUploadRoute.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAC1B,MAAM,SAAS,CAAA;AAEhB,KAAK,IAAI,GAAG;IACV,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QACd,cAAc,EAAE,oBAAoB,CAAA;QACpC,GAAG,EAAE,cAAc,CAAA;KACpB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAChC,GAAG,EAAE,SAAS,GAAG,aAAa,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AASD,eAAO,MAAM,oBAAoB,4BAI9B,IAAI,KAAG,cAiCT,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { APIError, Forbidden } from 'payload';
2
+ const defaultAccess = ({ req })=>!!req.user;
3
+ import { createRouteHandler } from 'uploadthing/next';
4
+ import { createUploadthing } from 'uploadthing/server';
5
+ export const getClientUploadRoute = ({ access = defaultAccess, acl, token })=>{
6
+ const f = createUploadthing();
7
+ const uploadRouter = {
8
+ uploader: f({
9
+ blob: {
10
+ acl,
11
+ maxFileCount: 1
12
+ }
13
+ }).middleware(async ({ req: rawReq })=>{
14
+ const req = rawReq;
15
+ const collectionSlug = req.searchParams.get('collectionSlug');
16
+ if (!collectionSlug) {
17
+ throw new APIError('No payload was provided');
18
+ }
19
+ if (!await access({
20
+ collectionSlug,
21
+ req
22
+ })) {
23
+ throw new Forbidden();
24
+ }
25
+ return {};
26
+ }).onUploadComplete(()=>{})
27
+ };
28
+ const { POST } = createRouteHandler({
29
+ config: {
30
+ token
31
+ },
32
+ router: uploadRouter
33
+ });
34
+ return async (req)=>{
35
+ return POST(req);
36
+ };
37
+ };
38
+
39
+ //# sourceMappingURL=getClientUploadRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/getClientUploadRoute.ts"],"sourcesContent":["import {\n APIError,\n Forbidden,\n type PayloadHandler,\n type PayloadRequest,\n type UploadCollectionSlug,\n} from 'payload'\n\ntype Args = {\n access?: (args: {\n collectionSlug: UploadCollectionSlug\n req: PayloadRequest\n }) => boolean | Promise<boolean>\n acl: 'private' | 'public-read'\n token?: string\n}\n\nconst defaultAccess: Args['access'] = ({ req }) => !!req.user\n\nimport type { FileRouter } from 'uploadthing/server'\n\nimport { createRouteHandler } from 'uploadthing/next'\nimport { createUploadthing } from 'uploadthing/server'\n\nexport const getClientUploadRoute = ({\n access = defaultAccess,\n acl,\n token,\n}: Args): PayloadHandler => {\n const f = createUploadthing()\n\n const uploadRouter = {\n uploader: f({\n blob: {\n acl,\n maxFileCount: 1,\n },\n })\n .middleware(async ({ req: rawReq }) => {\n const req = rawReq as PayloadRequest\n\n const collectionSlug = req.searchParams.get('collectionSlug')\n\n if (!collectionSlug) {\n throw new APIError('No payload was provided')\n }\n\n if (!(await access({ collectionSlug, req }))) {\n throw new Forbidden()\n }\n\n return {}\n })\n .onUploadComplete(() => {}),\n } satisfies FileRouter\n\n const { POST } = createRouteHandler({ config: { token }, router: uploadRouter })\n\n return async (req) => {\n return POST(req)\n }\n}\n"],"names":["APIError","Forbidden","defaultAccess","req","user","createRouteHandler","createUploadthing","getClientUploadRoute","access","acl","token","f","uploadRouter","uploader","blob","maxFileCount","middleware","rawReq","collectionSlug","searchParams","get","onUploadComplete","POST","config","router"],"mappings":"AAAA,SACEA,QAAQ,EACRC,SAAS,QAIJ,UAAS;AAWhB,MAAMC,gBAAgC,CAAC,EAAEC,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;AAI7D,SAASC,kBAAkB,QAAQ,mBAAkB;AACrD,SAASC,iBAAiB,QAAQ,qBAAoB;AAEtD,OAAO,MAAMC,uBAAuB,CAAC,EACnCC,SAASN,aAAa,EACtBO,GAAG,EACHC,KAAK,EACA;IACL,MAAMC,IAAIL;IAEV,MAAMM,eAAe;QACnBC,UAAUF,EAAE;YACVG,MAAM;gBACJL;gBACAM,cAAc;YAChB;QACF,GACGC,UAAU,CAAC,OAAO,EAAEb,KAAKc,MAAM,EAAE;YAChC,MAAMd,MAAMc;YAEZ,MAAMC,iBAAiBf,IAAIgB,YAAY,CAACC,GAAG,CAAC;YAE5C,IAAI,CAACF,gBAAgB;gBACnB,MAAM,IAAIlB,SAAS;YACrB;YAEA,IAAI,CAAE,MAAMQ,OAAO;gBAAEU;gBAAgBf;YAAI,IAAK;gBAC5C,MAAM,IAAIF;YACZ;YAEA,OAAO,CAAC;QACV,GACCoB,gBAAgB,CAAC,KAAO;IAC7B;IAEA,MAAM,EAAEC,IAAI,EAAE,GAAGjB,mBAAmB;QAAEkB,QAAQ;YAAEb;QAAM;QAAGc,QAAQZ;IAAa;IAE9E,OAAO,OAAOT;QACZ,OAAOmB,KAAKnB;IACd;AACF,EAAC"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
- import type { CollectionOptions } from '@payloadcms/plugin-cloud-storage/types';
1
+ import type { ClientUploadsConfig, CollectionOptions } from '@payloadcms/plugin-cloud-storage/types';
2
2
  import type { Plugin, UploadCollectionSlug } from 'payload';
3
3
  import type { UTApiOptions } from 'uploadthing/types';
4
4
  export type UploadthingStorageOptions = {
5
+ /**
6
+ * Do uploads directly on the client, to bypass limits on Vercel.
7
+ */
8
+ clientUploads?: ClientUploadsConfig;
5
9
  /**
6
10
  * Collection options to apply the adapter to.
7
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,iBAAiB,EAElB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,KAAK,EAAiB,MAAM,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAUrD,MAAM,MAAM,yBAAyB,GAAG;IACtC;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAE7F;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;OAEG;IACH,OAAO,EAAE;QACP;;WAEG;QACH,GAAG,CAAC,EAAE,GAAG,CAAA;KACV,GAAG,YAAY,CAAA;CACjB,CAAA;AAED,KAAK,iBAAiB,GAAG,CAAC,yBAAyB,EAAE,yBAAyB,KAAK,MAAM,CAAA;AAEzF,+FAA+F;AAC/F,MAAM,MAAM,GAAG,GAAG,SAAS,GAAG,aAAa,CAAA;AAE3C,eAAO,MAAM,kBAAkB,EAAE,iBAuD9B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,mBAAmB,EAEnB,iBAAiB,EAElB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,KAAK,EAAiB,MAAM,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAarD,MAAM,MAAM,yBAAyB,GAAG;IACtC;;OAEG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAA;IAEnC;;OAEG;IACH,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IAE7F;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;OAEG;IACH,OAAO,EAAE;QACP;;WAEG;QACH,GAAG,CAAC,EAAE,GAAG,CAAA;KACV,GAAG,YAAY,CAAA;CACjB,CAAA;AAED,KAAK,iBAAiB,GAAG,CAAC,yBAAyB,EAAE,yBAAyB,KAAK,MAAM,CAAA;AAEzF,+FAA+F;AAC/F,MAAM,MAAM,GAAG,GAAG,SAAS,GAAG,aAAa,CAAA;AAE3C,eAAO,MAAM,kBAAkB,EAAE,iBAuE9B,CAAA"}
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage';
2
+ import { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities';
2
3
  import { UTApi } from 'uploadthing/server';
3
4
  import { generateURL } from './generateURL.js';
5
+ import { getClientUploadRoute } from './getClientUploadRoute.js';
4
6
  import { getHandleDelete } from './handleDelete.js';
5
7
  import { getHandleUpload } from './handleUpload.js';
6
8
  import { getHandler } from './staticHandler.js';
@@ -13,6 +15,18 @@ export const uploadthingStorage = (uploadthingStorageOptions)=>(incomingConfig)=
13
15
  uploadthingStorageOptions.options.acl = 'public-read';
14
16
  }
15
17
  const adapter = uploadthingInternal(uploadthingStorageOptions);
18
+ initClientUploads({
19
+ clientHandler: '@payloadcms/storage-uploadthing/client#UploadthingClientUploadHandler',
20
+ collections: uploadthingStorageOptions.collections,
21
+ config: incomingConfig,
22
+ enabled: !!uploadthingStorageOptions.clientUploads,
23
+ serverHandler: getClientUploadRoute({
24
+ access: typeof uploadthingStorageOptions.clientUploads === 'object' ? uploadthingStorageOptions.clientUploads.access : undefined,
25
+ acl: uploadthingStorageOptions.options.acl || 'public-read',
26
+ token: uploadthingStorageOptions.options.token
27
+ }),
28
+ serverHandlerPath: '/storage-uploadthing-client-upload-route'
29
+ });
16
30
  // Add adapter to each collection option object
17
31
  const collectionsWithAdapter = Object.entries(uploadthingStorageOptions.collections).reduce((acc, [slug, collOptions])=>({
18
32
  ...acc,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Adapter,\n PluginOptions as CloudStoragePluginOptions,\n CollectionOptions,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { Config, Field, Plugin, UploadCollectionSlug } from 'payload'\nimport type { UTApiOptions } from 'uploadthing/types'\n\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { UTApi } from 'uploadthing/server'\n\nimport { generateURL } from './generateURL.js'\nimport { getHandleDelete } from './handleDelete.js'\nimport { getHandleUpload } from './handleUpload.js'\nimport { getHandler } from './staticHandler.js'\n\nexport type UploadthingStorageOptions = {\n /**\n * Collection options to apply the adapter to.\n */\n collections: Partial<Record<UploadCollectionSlug, 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 * Uploadthing Options\n */\n options: {\n /**\n * @default 'public-read'\n */\n acl?: ACL\n } & UTApiOptions\n}\n\ntype UploadthingPlugin = (uploadthingStorageOptions: UploadthingStorageOptions) => Plugin\n\n/** NOTE: not synced with uploadthing's internal types. Need to modify if more options added */\nexport type ACL = 'private' | 'public-read'\n\nexport const uploadthingStorage: UploadthingPlugin =\n (uploadthingStorageOptions: UploadthingStorageOptions) =>\n (incomingConfig: Config): Config => {\n if (uploadthingStorageOptions.enabled === false) {\n return incomingConfig\n }\n\n // Default ACL to public-read\n if (!uploadthingStorageOptions.options.acl) {\n uploadthingStorageOptions.options.acl = 'public-read'\n }\n\n const adapter = uploadthingInternal(uploadthingStorageOptions)\n\n // Add adapter to each collection option object\n const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries(\n uploadthingStorageOptions.collections,\n ).reduce(\n (acc, [slug, collOptions]) => ({\n ...acc,\n [slug]: {\n ...(collOptions === true ? {} : collOptions),\n\n // Disable payload access control if the ACL is public-read or not set\n // ...(uploadthingStorageOptions.options.acl === 'public-read'\n // ? { disablePayloadAccessControl: true }\n // : {}),\n\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 uploadthingInternal(options: UploadthingStorageOptions): Adapter {\n const fields: Field[] = [\n {\n name: '_key',\n type: 'text',\n admin: {\n hidden: true,\n },\n },\n ]\n\n return (): GeneratedAdapter => {\n const {\n options: { acl = 'public-read', ...utOptions },\n } = options\n\n const utApi = new UTApi(utOptions)\n\n return {\n name: 'uploadthing',\n fields,\n generateURL,\n handleDelete: getHandleDelete({ utApi }),\n handleUpload: getHandleUpload({ acl, utApi }),\n staticHandler: getHandler({ utApi }),\n }\n }\n}\n"],"names":["cloudStoragePlugin","UTApi","generateURL","getHandleDelete","getHandleUpload","getHandler","uploadthingStorage","uploadthingStorageOptions","incomingConfig","enabled","options","acl","adapter","uploadthingInternal","collectionsWithAdapter","Object","entries","collections","reduce","acc","slug","collOptions","config","map","collection","upload","disableLocalStorage","fields","name","type","admin","hidden","utOptions","utApi","handleDelete","handleUpload","staticHandler"],"mappings":"AASA,SAASA,kBAAkB,QAAQ,mCAAkC;AACrE,SAASC,KAAK,QAAQ,qBAAoB;AAE1C,SAASC,WAAW,QAAQ,mBAAkB;AAC9C,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,UAAU,QAAQ,qBAAoB;AA+B/C,OAAO,MAAMC,qBACX,CAACC,4BACD,CAACC;QACC,IAAID,0BAA0BE,OAAO,KAAK,OAAO;YAC/C,OAAOD;QACT;QAEA,6BAA6B;QAC7B,IAAI,CAACD,0BAA0BG,OAAO,CAACC,GAAG,EAAE;YAC1CJ,0BAA0BG,OAAO,CAACC,GAAG,GAAG;QAC1C;QAEA,MAAMC,UAAUC,oBAAoBN;QAEpC,+CAA+C;QAC/C,MAAMO,yBAAmEC,OAAOC,OAAO,CACrFT,0BAA0BU,WAAW,EACrCC,MAAM,CACN,CAACC,KAAK,CAACC,MAAMC,YAAY,GAAM,CAAA;gBAC7B,GAAGF,GAAG;gBACN,CAACC,KAAK,EAAE;oBACN,GAAIC,gBAAgB,OAAO,CAAC,IAAIA,WAAW;oBAE3C,sEAAsE;oBACtE,8DAA8D;oBAC9D,4CAA4C;oBAC5C,WAAW;oBAEXT;gBACF;YACF,CAAA,GACA,CAAC;QAGH,gFAAgF;QAChF,MAAMU,SAAS;YACb,GAAGd,cAAc;YACjBS,aAAa,AAACT,CAAAA,eAAeS,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,OAAO1B,mBAAmB;YACxBiB,aAAaH;QACf,GAAGQ;IACL,EAAC;AAEH,SAAST,oBAAoBH,OAAkC;IAC7D,MAAMiB,SAAkB;QACtB;YACEC,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,QAAQ;YACV;QACF;KACD;IAED,OAAO;QACL,MAAM,EACJrB,SAAS,EAAEC,MAAM,aAAa,EAAE,GAAGqB,WAAW,EAC/C,GAAGtB;QAEJ,MAAMuB,QAAQ,IAAIhC,MAAM+B;QAExB,OAAO;YACLJ,MAAM;YACND;YACAzB;YACAgC,cAAc/B,gBAAgB;gBAAE8B;YAAM;YACtCE,cAAc/B,gBAAgB;gBAAEO;gBAAKsB;YAAM;YAC3CG,eAAe/B,WAAW;gBAAE4B;YAAM;QACpC;IACF;AACF"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Adapter,\n ClientUploadsConfig,\n PluginOptions as CloudStoragePluginOptions,\n CollectionOptions,\n GeneratedAdapter,\n} from '@payloadcms/plugin-cloud-storage/types'\nimport type { Config, Field, Plugin, UploadCollectionSlug } from 'payload'\nimport type { UTApiOptions } from 'uploadthing/types'\n\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\nimport { createRouteHandler } from 'uploadthing/next'\nimport { createUploadthing, UTApi } from 'uploadthing/server'\n\nimport { generateURL } from './generateURL.js'\nimport { getClientUploadRoute } from './getClientUploadRoute.js'\nimport { getHandleDelete } from './handleDelete.js'\nimport { getHandleUpload } from './handleUpload.js'\nimport { getHandler } from './staticHandler.js'\n\nexport type UploadthingStorageOptions = {\n /**\n * Do uploads directly on the client, to bypass limits on Vercel.\n */\n clientUploads?: ClientUploadsConfig\n\n /**\n * Collection options to apply the adapter to.\n */\n collections: Partial<Record<UploadCollectionSlug, 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 * Uploadthing Options\n */\n options: {\n /**\n * @default 'public-read'\n */\n acl?: ACL\n } & UTApiOptions\n}\n\ntype UploadthingPlugin = (uploadthingStorageOptions: UploadthingStorageOptions) => Plugin\n\n/** NOTE: not synced with uploadthing's internal types. Need to modify if more options added */\nexport type ACL = 'private' | 'public-read'\n\nexport const uploadthingStorage: UploadthingPlugin =\n (uploadthingStorageOptions: UploadthingStorageOptions) =>\n (incomingConfig: Config): Config => {\n if (uploadthingStorageOptions.enabled === false) {\n return incomingConfig\n }\n\n // Default ACL to public-read\n if (!uploadthingStorageOptions.options.acl) {\n uploadthingStorageOptions.options.acl = 'public-read'\n }\n\n const adapter = uploadthingInternal(uploadthingStorageOptions)\n\n initClientUploads({\n clientHandler: '@payloadcms/storage-uploadthing/client#UploadthingClientUploadHandler',\n collections: uploadthingStorageOptions.collections,\n config: incomingConfig,\n enabled: !!uploadthingStorageOptions.clientUploads,\n serverHandler: getClientUploadRoute({\n access:\n typeof uploadthingStorageOptions.clientUploads === 'object'\n ? uploadthingStorageOptions.clientUploads.access\n : undefined,\n acl: uploadthingStorageOptions.options.acl || 'public-read',\n token: uploadthingStorageOptions.options.token,\n }),\n serverHandlerPath: '/storage-uploadthing-client-upload-route',\n })\n\n // Add adapter to each collection option object\n const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries(\n uploadthingStorageOptions.collections,\n ).reduce(\n (acc, [slug, collOptions]) => ({\n ...acc,\n [slug]: {\n ...(collOptions === true ? {} : collOptions),\n\n // Disable payload access control if the ACL is public-read or not set\n // ...(uploadthingStorageOptions.options.acl === 'public-read'\n // ? { disablePayloadAccessControl: true }\n // : {}),\n\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 uploadthingInternal(options: UploadthingStorageOptions): Adapter {\n const fields: Field[] = [\n {\n name: '_key',\n type: 'text',\n admin: {\n hidden: true,\n },\n },\n ]\n\n return (): GeneratedAdapter => {\n const {\n options: { acl = 'public-read', ...utOptions },\n } = options\n\n const utApi = new UTApi(utOptions)\n\n return {\n name: 'uploadthing',\n fields,\n generateURL,\n handleDelete: getHandleDelete({ utApi }),\n handleUpload: getHandleUpload({ acl, utApi }),\n staticHandler: getHandler({ utApi }),\n }\n }\n}\n"],"names":["cloudStoragePlugin","initClientUploads","UTApi","generateURL","getClientUploadRoute","getHandleDelete","getHandleUpload","getHandler","uploadthingStorage","uploadthingStorageOptions","incomingConfig","enabled","options","acl","adapter","uploadthingInternal","clientHandler","collections","config","clientUploads","serverHandler","access","undefined","token","serverHandlerPath","collectionsWithAdapter","Object","entries","reduce","acc","slug","collOptions","map","collection","upload","disableLocalStorage","fields","name","type","admin","hidden","utOptions","utApi","handleDelete","handleUpload","staticHandler"],"mappings":"AAUA,SAASA,kBAAkB,QAAQ,mCAAkC;AACrE,SAASC,iBAAiB,QAAQ,6CAA4C;AAE9E,SAA4BC,KAAK,QAAQ,qBAAoB;AAE7D,SAASC,WAAW,QAAQ,mBAAkB;AAC9C,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,eAAe,QAAQ,oBAAmB;AACnD,SAASC,UAAU,QAAQ,qBAAoB;AAoC/C,OAAO,MAAMC,qBACX,CAACC,4BACD,CAACC;QACC,IAAID,0BAA0BE,OAAO,KAAK,OAAO;YAC/C,OAAOD;QACT;QAEA,6BAA6B;QAC7B,IAAI,CAACD,0BAA0BG,OAAO,CAACC,GAAG,EAAE;YAC1CJ,0BAA0BG,OAAO,CAACC,GAAG,GAAG;QAC1C;QAEA,MAAMC,UAAUC,oBAAoBN;QAEpCR,kBAAkB;YAChBe,eAAe;YACfC,aAAaR,0BAA0BQ,WAAW;YAClDC,QAAQR;YACRC,SAAS,CAAC,CAACF,0BAA0BU,aAAa;YAClDC,eAAehB,qBAAqB;gBAClCiB,QACE,OAAOZ,0BAA0BU,aAAa,KAAK,WAC/CV,0BAA0BU,aAAa,CAACE,MAAM,GAC9CC;gBACNT,KAAKJ,0BAA0BG,OAAO,CAACC,GAAG,IAAI;gBAC9CU,OAAOd,0BAA0BG,OAAO,CAACW,KAAK;YAChD;YACAC,mBAAmB;QACrB;QAEA,+CAA+C;QAC/C,MAAMC,yBAAmEC,OAAOC,OAAO,CACrFlB,0BAA0BQ,WAAW,EACrCW,MAAM,CACN,CAACC,KAAK,CAACC,MAAMC,YAAY,GAAM,CAAA;gBAC7B,GAAGF,GAAG;gBACN,CAACC,KAAK,EAAE;oBACN,GAAIC,gBAAgB,OAAO,CAAC,IAAIA,WAAW;oBAE3C,sEAAsE;oBACtE,8DAA8D;oBAC9D,4CAA4C;oBAC5C,WAAW;oBAEXjB;gBACF;YACF,CAAA,GACA,CAAC;QAGH,gFAAgF;QAChF,MAAMI,SAAS;YACb,GAAGR,cAAc;YACjBO,aAAa,AAACP,CAAAA,eAAeO,WAAW,IAAI,EAAE,AAAD,EAAGe,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,OAAOnC,mBAAmB;YACxBiB,aAAaQ;QACf,GAAGP;IACL,EAAC;AAEH,SAASH,oBAAoBH,OAAkC;IAC7D,MAAMwB,SAAkB;QACtB;YACEC,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,QAAQ;YACV;QACF;KACD;IAED,OAAO;QACL,MAAM,EACJ5B,SAAS,EAAEC,MAAM,aAAa,EAAE,GAAG4B,WAAW,EAC/C,GAAG7B;QAEJ,MAAM8B,QAAQ,IAAIxC,MAAMuC;QAExB,OAAO;YACLJ,MAAM;YACND;YACAjC;YACAwC,cAActC,gBAAgB;gBAAEqC;YAAM;YACtCE,cAActC,gBAAgB;gBAAEO;gBAAK6B;YAAM;YAC3CG,eAAetC,WAAW;gBAAEmC;YAAM;QACpC;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"staticHandler.d.ts","sourceRoot":"","sources":["../src/staticHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAE3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAI/C,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,eAAO,MAAM,UAAU,cAAe,IAAI,KAAG,aAuF5C,CAAA"}
1
+ {"version":3,"file":"staticHandler.d.ts","sourceRoot":"","sources":["../src/staticHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAE3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAI/C,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,eAAO,MAAM,UAAU,cAAe,IAAI,KAAG,aAkG5C,CAAA"}
@@ -1,44 +1,49 @@
1
1
  import { getKeyFromFilename } from './utilities.js';
2
2
  export const getHandler = ({ utApi })=>{
3
- return async (req, { doc, params: { collection, filename } })=>{
3
+ return async (req, { doc, params: { clientUploadContext, collection, filename } })=>{
4
4
  try {
5
- const collectionConfig = req.payload.collections[collection]?.config;
6
- let retrievedDoc = doc;
7
- if (!retrievedDoc) {
8
- const or = [
9
- {
10
- filename: {
11
- equals: filename
12
- }
13
- }
14
- ];
15
- if (collectionConfig.upload.imageSizes) {
16
- collectionConfig.upload.imageSizes.forEach(({ name })=>{
17
- or.push({
18
- [`sizes.${name}.filename`]: {
5
+ let key;
6
+ if (clientUploadContext && typeof clientUploadContext === 'object' && 'key' in clientUploadContext && typeof clientUploadContext.key === 'string') {
7
+ key = clientUploadContext.key;
8
+ } else {
9
+ const collectionConfig = req.payload.collections[collection]?.config;
10
+ let retrievedDoc = doc;
11
+ if (!retrievedDoc) {
12
+ const or = [
13
+ {
14
+ filename: {
19
15
  equals: filename
20
16
  }
17
+ }
18
+ ];
19
+ if (collectionConfig.upload.imageSizes) {
20
+ collectionConfig.upload.imageSizes.forEach(({ name })=>{
21
+ or.push({
22
+ [`sizes.${name}.filename`]: {
23
+ equals: filename
24
+ }
25
+ });
21
26
  });
27
+ }
28
+ const result = await req.payload.db.findOne({
29
+ collection,
30
+ req,
31
+ where: {
32
+ or
33
+ }
22
34
  });
23
- }
24
- const result = await req.payload.db.findOne({
25
- collection,
26
- req,
27
- where: {
28
- or
35
+ if (result) {
36
+ retrievedDoc = result;
29
37
  }
30
- });
31
- if (result) {
32
- retrievedDoc = result;
33
38
  }
39
+ if (!retrievedDoc) {
40
+ return new Response(null, {
41
+ status: 404,
42
+ statusText: 'Not Found'
43
+ });
44
+ }
45
+ key = getKeyFromFilename(retrievedDoc, filename);
34
46
  }
35
- if (!retrievedDoc) {
36
- return new Response(null, {
37
- status: 404,
38
- statusText: 'Not Found'
39
- });
40
- }
41
- const key = getKeyFromFilename(retrievedDoc, filename);
42
47
  if (!key) {
43
48
  return new Response(null, {
44
49
  status: 404,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { Where } from 'payload'\nimport type { UTApi } from 'uploadthing/server'\n\nimport { getKeyFromFilename } from './utilities.js'\n\ntype Args = {\n utApi: UTApi\n}\n\nexport const getHandler = ({ utApi }: Args): StaticHandler => {\n return async (req, { doc, params: { collection, filename } }) => {\n try {\n const collectionConfig = req.payload.collections[collection]?.config\n let retrievedDoc = doc\n\n if (!retrievedDoc) {\n const or: Where[] = [\n {\n filename: {\n equals: filename,\n },\n },\n ]\n\n if (collectionConfig.upload.imageSizes) {\n collectionConfig.upload.imageSizes.forEach(({ name }) => {\n or.push({\n [`sizes.${name}.filename`]: {\n equals: filename,\n },\n })\n })\n }\n\n const result = await req.payload.db.findOne({\n collection,\n req,\n where: { or },\n })\n\n if (result) {\n retrievedDoc = result\n }\n }\n\n if (!retrievedDoc) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const key = getKeyFromFilename(retrievedDoc, filename)\n\n if (!key) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const { url: signedURL } = await utApi.getSignedURL(key)\n\n if (!signedURL) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const response = await fetch(signedURL)\n\n if (!response.ok) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const blob = await response.blob()\n\n const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\n const objectEtag = response.headers.get('etag') as string\n\n if (etagFromHeaders && etagFromHeaders === objectEtag) {\n return new Response(null, {\n headers: new Headers({\n 'Content-Length': String(blob.size),\n 'Content-Type': blob.type,\n ETag: objectEtag,\n }),\n status: 304,\n })\n }\n\n return new Response(blob, {\n headers: new Headers({\n 'Content-Length': String(blob.size),\n 'Content-Type': blob.type,\n ETag: objectEtag,\n }),\n status: 200,\n })\n } catch (err) {\n req.payload.logger.error({ err, msg: 'Unexpected error in staticHandler' })\n return new Response('Internal Server Error', { status: 500 })\n }\n }\n}\n"],"names":["getKeyFromFilename","getHandler","utApi","req","doc","params","collection","filename","collectionConfig","payload","collections","config","retrievedDoc","or","equals","upload","imageSizes","forEach","name","push","result","db","findOne","where","Response","status","statusText","key","url","signedURL","getSignedURL","response","fetch","ok","blob","etagFromHeaders","headers","get","objectEtag","Headers","String","size","type","ETag","err","logger","error","msg"],"mappings":"AAIA,SAASA,kBAAkB,QAAQ,iBAAgB;AAMnD,OAAO,MAAMC,aAAa,CAAC,EAAEC,KAAK,EAAQ;IACxC,OAAO,OAAOC,KAAK,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,UAAU,EAAEC,QAAQ,EAAE,EAAE;QAC1D,IAAI;YACF,MAAMC,mBAAmBL,IAAIM,OAAO,CAACC,WAAW,CAACJ,WAAW,EAAEK;YAC9D,IAAIC,eAAeR;YAEnB,IAAI,CAACQ,cAAc;gBACjB,MAAMC,KAAc;oBAClB;wBACEN,UAAU;4BACRO,QAAQP;wBACV;oBACF;iBACD;gBAED,IAAIC,iBAAiBO,MAAM,CAACC,UAAU,EAAE;oBACtCR,iBAAiBO,MAAM,CAACC,UAAU,CAACC,OAAO,CAAC,CAAC,EAAEC,IAAI,EAAE;wBAClDL,GAAGM,IAAI,CAAC;4BACN,CAAC,CAAC,MAAM,EAAED,KAAK,SAAS,CAAC,CAAC,EAAE;gCAC1BJ,QAAQP;4BACV;wBACF;oBACF;gBACF;gBAEA,MAAMa,SAAS,MAAMjB,IAAIM,OAAO,CAACY,EAAE,CAACC,OAAO,CAAC;oBAC1ChB;oBACAH;oBACAoB,OAAO;wBAAEV;oBAAG;gBACd;gBAEA,IAAIO,QAAQ;oBACVR,eAAeQ;gBACjB;YACF;YAEA,IAAI,CAACR,cAAc;gBACjB,OAAO,IAAIY,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAMC,MAAM3B,mBAAmBY,cAAcL;YAE7C,IAAI,CAACoB,KAAK;gBACR,OAAO,IAAIH,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAM,EAAEE,KAAKC,SAAS,EAAE,GAAG,MAAM3B,MAAM4B,YAAY,CAACH;YAEpD,IAAI,CAACE,WAAW;gBACd,OAAO,IAAIL,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAMK,WAAW,MAAMC,MAAMH;YAE7B,IAAI,CAACE,SAASE,EAAE,EAAE;gBAChB,OAAO,IAAIT,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAMQ,OAAO,MAAMH,SAASG,IAAI;YAEhC,MAAMC,kBAAkBhC,IAAIiC,OAAO,CAACC,GAAG,CAAC,WAAWlC,IAAIiC,OAAO,CAACC,GAAG,CAAC;YACnE,MAAMC,aAAaP,SAASK,OAAO,CAACC,GAAG,CAAC;YAExC,IAAIF,mBAAmBA,oBAAoBG,YAAY;gBACrD,OAAO,IAAId,SAAS,MAAM;oBACxBY,SAAS,IAAIG,QAAQ;wBACnB,kBAAkBC,OAAON,KAAKO,IAAI;wBAClC,gBAAgBP,KAAKQ,IAAI;wBACzBC,MAAML;oBACR;oBACAb,QAAQ;gBACV;YACF;YAEA,OAAO,IAAID,SAASU,MAAM;gBACxBE,SAAS,IAAIG,QAAQ;oBACnB,kBAAkBC,OAAON,KAAKO,IAAI;oBAClC,gBAAgBP,KAAKQ,IAAI;oBACzBC,MAAML;gBACR;gBACAb,QAAQ;YACV;QACF,EAAE,OAAOmB,KAAK;YACZzC,IAAIM,OAAO,CAACoC,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAoC;YACzE,OAAO,IAAIvB,SAAS,yBAAyB;gBAAEC,QAAQ;YAAI;QAC7D;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../src/staticHandler.ts"],"sourcesContent":["import type { StaticHandler } from '@payloadcms/plugin-cloud-storage/types'\nimport type { Where } from 'payload'\nimport type { UTApi } from 'uploadthing/server'\n\nimport { getKeyFromFilename } from './utilities.js'\n\ntype Args = {\n utApi: UTApi\n}\n\nexport const getHandler = ({ utApi }: Args): StaticHandler => {\n return async (req, { doc, params: { clientUploadContext, collection, filename } }) => {\n try {\n let key: string\n\n if (\n clientUploadContext &&\n typeof clientUploadContext === 'object' &&\n 'key' in clientUploadContext &&\n typeof clientUploadContext.key === 'string'\n ) {\n key = clientUploadContext.key\n } else {\n const collectionConfig = req.payload.collections[collection]?.config\n let retrievedDoc = doc\n\n if (!retrievedDoc) {\n const or: Where[] = [\n {\n filename: {\n equals: filename,\n },\n },\n ]\n\n if (collectionConfig.upload.imageSizes) {\n collectionConfig.upload.imageSizes.forEach(({ name }) => {\n or.push({\n [`sizes.${name}.filename`]: {\n equals: filename,\n },\n })\n })\n }\n\n const result = await req.payload.db.findOne({\n collection,\n req,\n where: { or },\n })\n\n if (result) {\n retrievedDoc = result\n }\n }\n\n if (!retrievedDoc) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n key = getKeyFromFilename(retrievedDoc, filename)\n }\n\n if (!key) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const { url: signedURL } = await utApi.getSignedURL(key)\n\n if (!signedURL) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const response = await fetch(signedURL)\n\n if (!response.ok) {\n return new Response(null, { status: 404, statusText: 'Not Found' })\n }\n\n const blob = await response.blob()\n\n const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match')\n const objectEtag = response.headers.get('etag')\n\n if (etagFromHeaders && etagFromHeaders === objectEtag) {\n return new Response(null, {\n headers: new Headers({\n 'Content-Length': String(blob.size),\n 'Content-Type': blob.type,\n ETag: objectEtag,\n }),\n status: 304,\n })\n }\n\n return new Response(blob, {\n headers: new Headers({\n 'Content-Length': String(blob.size),\n 'Content-Type': blob.type,\n ETag: objectEtag,\n }),\n status: 200,\n })\n } catch (err) {\n req.payload.logger.error({ err, msg: 'Unexpected error in staticHandler' })\n return new Response('Internal Server Error', { status: 500 })\n }\n }\n}\n"],"names":["getKeyFromFilename","getHandler","utApi","req","doc","params","clientUploadContext","collection","filename","key","collectionConfig","payload","collections","config","retrievedDoc","or","equals","upload","imageSizes","forEach","name","push","result","db","findOne","where","Response","status","statusText","url","signedURL","getSignedURL","response","fetch","ok","blob","etagFromHeaders","headers","get","objectEtag","Headers","String","size","type","ETag","err","logger","error","msg"],"mappings":"AAIA,SAASA,kBAAkB,QAAQ,iBAAgB;AAMnD,OAAO,MAAMC,aAAa,CAAC,EAAEC,KAAK,EAAQ;IACxC,OAAO,OAAOC,KAAK,EAAEC,GAAG,EAAEC,QAAQ,EAAEC,mBAAmB,EAAEC,UAAU,EAAEC,QAAQ,EAAE,EAAE;QAC/E,IAAI;YACF,IAAIC;YAEJ,IACEH,uBACA,OAAOA,wBAAwB,YAC/B,SAASA,uBACT,OAAOA,oBAAoBG,GAAG,KAAK,UACnC;gBACAA,MAAMH,oBAAoBG,GAAG;YAC/B,OAAO;gBACL,MAAMC,mBAAmBP,IAAIQ,OAAO,CAACC,WAAW,CAACL,WAAW,EAAEM;gBAC9D,IAAIC,eAAeV;gBAEnB,IAAI,CAACU,cAAc;oBACjB,MAAMC,KAAc;wBAClB;4BACEP,UAAU;gCACRQ,QAAQR;4BACV;wBACF;qBACD;oBAED,IAAIE,iBAAiBO,MAAM,CAACC,UAAU,EAAE;wBACtCR,iBAAiBO,MAAM,CAACC,UAAU,CAACC,OAAO,CAAC,CAAC,EAAEC,IAAI,EAAE;4BAClDL,GAAGM,IAAI,CAAC;gCACN,CAAC,CAAC,MAAM,EAAED,KAAK,SAAS,CAAC,CAAC,EAAE;oCAC1BJ,QAAQR;gCACV;4BACF;wBACF;oBACF;oBAEA,MAAMc,SAAS,MAAMnB,IAAIQ,OAAO,CAACY,EAAE,CAACC,OAAO,CAAC;wBAC1CjB;wBACAJ;wBACAsB,OAAO;4BAAEV;wBAAG;oBACd;oBAEA,IAAIO,QAAQ;wBACVR,eAAeQ;oBACjB;gBACF;gBAEA,IAAI,CAACR,cAAc;oBACjB,OAAO,IAAIY,SAAS,MAAM;wBAAEC,QAAQ;wBAAKC,YAAY;oBAAY;gBACnE;gBAEAnB,MAAMT,mBAAmBc,cAAcN;YACzC;YAEA,IAAI,CAACC,KAAK;gBACR,OAAO,IAAIiB,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAM,EAAEC,KAAKC,SAAS,EAAE,GAAG,MAAM5B,MAAM6B,YAAY,CAACtB;YAEpD,IAAI,CAACqB,WAAW;gBACd,OAAO,IAAIJ,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAMI,WAAW,MAAMC,MAAMH;YAE7B,IAAI,CAACE,SAASE,EAAE,EAAE;gBAChB,OAAO,IAAIR,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAMO,OAAO,MAAMH,SAASG,IAAI;YAEhC,MAAMC,kBAAkBjC,IAAIkC,OAAO,CAACC,GAAG,CAAC,WAAWnC,IAAIkC,OAAO,CAACC,GAAG,CAAC;YACnE,MAAMC,aAAaP,SAASK,OAAO,CAACC,GAAG,CAAC;YAExC,IAAIF,mBAAmBA,oBAAoBG,YAAY;gBACrD,OAAO,IAAIb,SAAS,MAAM;oBACxBW,SAAS,IAAIG,QAAQ;wBACnB,kBAAkBC,OAAON,KAAKO,IAAI;wBAClC,gBAAgBP,KAAKQ,IAAI;wBACzBC,MAAML;oBACR;oBACAZ,QAAQ;gBACV;YACF;YAEA,OAAO,IAAID,SAASS,MAAM;gBACxBE,SAAS,IAAIG,QAAQ;oBACnB,kBAAkBC,OAAON,KAAKO,IAAI;oBAClC,gBAAgBP,KAAKQ,IAAI;oBACzBC,MAAML;gBACR;gBACAZ,QAAQ;YACV;QACF,EAAE,OAAOkB,KAAK;YACZ1C,IAAIQ,OAAO,CAACmC,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAoC;YACzE,OAAO,IAAItB,SAAS,yBAAyB;gBAAEC,QAAQ;YAAI;QAC7D;IACF;AACF,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/storage-uploadthing",
3
- "version": "3.25.0-canary.fd53f68",
3
+ "version": "3.25.0",
4
4
  "description": "Payload storage adapter for uploadthing",
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
  "uploadthing": "7.3.0",
35
- "@payloadcms/plugin-cloud-storage": "3.25.0-canary.fd53f68"
40
+ "@payloadcms/plugin-cloud-storage": "3.25.0"
36
41
  },
37
42
  "devDependencies": {
38
- "payload": "3.25.0-canary.fd53f68"
43
+ "payload": "3.25.0"
39
44
  },
40
45
  "peerDependencies": {
41
- "payload": "3.25.0-canary.fd53f68"
46
+ "payload": "3.25.0"
42
47
  },
43
48
  "engines": {
44
49
  "node": "^18.20.2 || >=20.9.0"